SpringBoot的日志框架

目录

 默认日志框架

日志配置

更换日志框架

排除默认Logback

引入目标日志框架

添加配置文件

 logback.xml


SpringBoot的核心设计宗旨是约定大于配置,很多框架功能都给你默认加载和配置完成供你使用,但这就要求使用者对框架有一定的理解和改造能力,比如这个日志框架,是其他框架的基础,需要默认指定日志框架,但如果想要深入了解日志框架内容是很多的,比如logback 和 log4j 都是基于 SLF4J(Simple Logging Facade for Java) 的门面(Facade)设计模式进行集成的。

  • logback是 SLF4J 的原生实现框架,由 SLF4J 的作者设计,与 SLF4J 无缝集成,是SLF4J 的“亲儿子”,集成更紧密;
  • log4j 不是原生支持 SLF4J,需要通过 桥接器(Bridge) 实现适配

 默认日志框架

Spring Boot 默认使用Logback作为日志框架,通过spring-boot-starter-logging实现自动配置。该依赖会被其他Starter(如spring-boot-starter-web)隐式引入。

若未在application.ymlapplication.properties中配置日志,Spring Boot会使用以下默认值:

  • 日志级别:Root日志级别默认为INFO

  • 输出目标:日志仅输出到控制台(不写入文件)。

  • 格式

  • 时间戳 | 日志级别 | 进程ID | 线程名 | Logger名称 | 日志消息
    示例:
    2023-10-05 14:30:00.123  INFO 12345 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080

日志配置

application.yml中的常用配置:

logging:file:name: app.log      # 日志文件名(默认生成在项目根目录)path: /var/log       # 日志目录(与`file.name`二选一)level:root: INFO         # Root日志级别org.springframework.web: DEBUG  # 指定包日志级别pattern:console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"

若需详细的springboot启动日志(如Bean加载过程),可通过以下方式配置:

方式1:通过启动参数
在启动命令中添加--debug参数,仅打印Spring Boot核心调试日志:
java -jar your-app.jar --debug方式2:全局DEBUG日志
在application.yml中设置Root日志级别为DEBUG:
logging:level:root: DEBUG方式3:特定包日志
若仅需查看Spring容器的初始化日志:
logging:level:org.springframework.boot: DEBUGorg.springframework.context: DEBUG

更换日志框架

Spring Boot支持快速切换至其他日志框架(如Log4j2),需以下步骤:

排除默认Logback

在Maven的pom.xml中排除spring-boot-starter-logging: 

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>

引入目标日志框架

以Log4j2为例,添加对应Starter:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

添加配置文件

src/main/resources目录下创建日志配置文件:

  • Log4j2log4j2.xmllog4j2-spring.xml

  • 示例配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

 logback.xml

Spring Boot 默认在 classpath 下查找 logback.xml,如果存在,会直接使用它作为 Logback 的配置,logback.xml 的优先级 高于 Spring Boot 的默认日志配置(如 application.yml 中的 logging 配置项),如果同时存在 logback.xml 和 application.yml 中的日志配置,logback.xml 的配置会覆盖 application.yml

如果希望完全由 logback.xml 控制日志行为,可以在 application.yml 中禁用 Spring Boot 的默认日志配置:logging:  config: none  # 禁用所有默认日志配置

在 src/main/resources 目录下新建 logback.xml,例如:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 定义控制台输出 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 定义文件输出 --><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>app.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- Root 日志级别 --><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root><!-- 特定包的日志级别 --><logger name="org.springframework.web" level="DEBUG"/>
</configuration>

 虽然 logback.xml 会被自动加载,但 Spring Boot 官方推荐使用 logback-spring.xml,原因如下:

配置文件特点
logback.xml直接由 Logback 加载,无法使用 Spring Boot 的增强功能(如 Profile 多环境支持)。
logback-spring.xml由 Spring Boot 加载,支持 Profile 条件化配置(如 <springProfile> 标签)。
<configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 开发环境:输出 DEBUG 级别到控制台 --><springProfile name="dev"><root level="DEBUG"><appender-ref ref="CONSOLE"/></root></springProfile><!-- 生产环境:输出 INFO 级别到文件 --><springProfile name="prod"><root level="INFO"><appender-ref ref="FILE"/></root></springProfile>
</configuration>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今日行情明日机会——20250403

今日涨停的主要行业方向分析&#xff08;2025-04-03&#xff09; 1. 贸易战相关概念&#xff08;13家涨停&#xff09; 细分领域&#xff1a;外贸、稀土永磁、中日韩贸易、物流、港口。代表个股&#xff1a; 外贸&#xff1a;爱丽家居、派斯林、迪生力&#xff08;受特朗普宣布…

Vue3使用富文本编辑器vue-quill 自定义图片上传、文件上传

一、引入依赖 // npm install vueup/vue-quill^1.2.0 quill^1.3.7"vueup/vue-quill": "^1.2.0","quill": "^1.3.7", 二、在vue文件中使用 <templete><div class"editor-container" v-if"show"><…

k8s pod重启顺序说明

在 Kubernetes 中&#xff0c;Pod 的重启顺序由 控制器类型 和 Pod 管理策略 共同决定。以下是不同场景下的详细规则和底层逻辑&#xff1a; 一、Pod 重启的触发场景 场景类型触发原因控制方容器崩溃重启容器进程退出&#xff08;如异常、OOM&#xff09;kubelet&#xff08;…

Modbus RTU与TCP通信示例

准备工作 安装 libmodbus 库 Linux (Debian/Ubuntu): sudo apt-get install libmodbus-dev Windows: 下载预编译库 libmodbus for Windows&#xff0c;并配置开发环境。 示例 1.Modbus RTU (串行通信) #include <stdio.h> #include <modbus/modbus.h> ​ int…

maven项目添加第三方JAR包

项目开发过程中&#xff0c;不可避免的需要用到一些maven库&#xff08;公共库、司库等&#xff09;中没有的冷门jar包依赖&#xff0c;这时&#xff0c;可以将这些第三方JAR包安装到本地maven仓库中&#xff0c;实现项目依赖的一致性。具体步骤如下&#xff1a; 1、下载jar包 …

Sentinel实战(三)、流控规则之流控效果及流控小结

spring cloud Alibaba-Sentinel实战&#xff08;三&#xff09;、流控效果流控小结 一、流控规则&#xff1a;流控效果一&#xff09;、流控效果&#xff1a;预热1、概念含义2、案例流控规则设置测试结果 二&#xff09;、流控效果&#xff1a;排队等待1、概念含义2、案例流控规…

c++ (通用引用)和(左值引用)区别

问&#xff1a; for (auto &&ipKF : vpKFs) {} 使用 一个& 和 两个&& 区别和联系&#xff1f; c 在 C 中&#xff0c;auto&& 和 auto& 在范围基于的 for 循环中有重要的区别&#xff0c;涉及到引用类型和值类别的处理。让我们详细解释它们的区…

使用高德api实现天气查询

创建应用获取 Key 天气查询-基础 API 文档-开发指南-Web服务 API | 高德地图API 代码编写 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

XEOS 与 AutoMQ 推出联合方案,共筑云原生 Kafka 新生态

近日&#xff0c;XSKY 星辰天合旗下企业级对象存储产品 XEOS 与 AutoMQ 云原生消息队列系统完成了产品兼容性适配互认证&#xff0c;致力于为客户在私有云和混合云环境中提供云原生的 Kafka 解决方案。 在云计算和大数据时代&#xff0c;消息队列作为分布式系统的重要组成部分…

Synology NAS 部署WPS-Office

记录在群晖NAS上部署WPS-Office实现网页上编辑文档 目录 1.思考及想法由来2.问题解决2.1 群晖NAS Docker使用2.2 部署wps-office参考1:【Docker+WPS Office】远程办公:Docker + WPS Office 私人云办公室2.3 群晖NAS映射文件夹权限参考1:参考2:群晖NAS中普通用户获取Docker容…

Vue自定义指令最佳实践教程

Vue 3 显著增强了自定义指令的功能&#xff0c;使其封装更加灵活和易用。本文将分为基础和进阶两部分&#xff0c;介绍如何实现常用的自定义指令&#xff0c;并提供最佳的项目组织方式。 前言 本文以复制文本的自定义指令详细介绍自定义指令的基础知识 多个自定义指令如何进行…

用DrissionPage升级维基百科爬虫:更简洁高效的数据抓取方案

一、原方案痛点分析 原代码使用urllibBeautifulSoup组合存在以下问题&#xff1a; 动态内容缺失&#xff1a;无法获取JavaScript渲染后的页面内容 反爬能力弱&#xff1a;基础请求头易被识别为爬虫 代码冗余&#xff1a;需要单独处理SSL证书验证 扩展性差&#xff1a;难以应…

23种设计模式-结构型模式-代理

文章目录 简介问题解决方案代码核心设计要点 总结 简介 代理是一种结构型设计模式&#xff0c;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许在把请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f…

基于Transformer框架实现微调后Qwen/DeepSeek模型的非流式批量推理

在基于LLamaFactory微调完具备思维链的DeepSeek模型之后(详见《深入探究LLamaFactory推理DeepSeek蒸馏模型时无法展示<think>思考过程的问题》),接下来就需要针对微调好的模型或者是原始模型(注意需要有一个本地的模型文件,全量微调就是saves下面的文件夹,如果是LoRA,…

基于OpenCV的指纹验证:从原理到实战的深度解析

指纹识别的技术革命与OpenCV的轻量级方案 在生物特征识别领域&#xff0c;指纹识别始终以独特性和稳定性占据核心地位。随着OpenCV等开源视觉库的普及&#xff0c;这项看似"高大上"的技术正逐步走向民用化开发。本文将突破传统算法框架&#xff0c;提出一套基于OpenC…

十五届蓝桥杯省赛Java B组(持续更新..)

目录 十五届蓝桥杯省赛Java B组第一题&#xff1a;报数第二题&#xff1a;类斐波那契数第三题&#xff1a;分布式队列第四题&#xff1a;食堂第五题&#xff1a;最优分组第六题&#xff1a;星际旅行第七题&#xff1a;LITS游戏第八题&#xff1a;拼十字 十五届蓝桥杯省赛Java B…

多模态学习(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network

论文链接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9151265 目录 一.摘要 1.1 摘要翻译 1.2 摘要解析 二.Introduction 2.1 Introduciton翻译 2.2 Introduction 解析 三. related work 3.1 related work翻译 3.2 relate work解析 四…

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中&#xff0c;合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一&#xff1a;使用快捷键 大多数笔…

AF3 OpenFoldDataset类looped_samples方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataset 类的 looped_samples 方法用于 循环采样数据,确保数据能被不断地提供,适用于 PyTorch 的 DataLoader 在训练过程中迭代读取数据。dataset_idx 指定了当前要处理的数据集(即 self.datasets[dataset_idx]) 源代码: def loo…

lua表table和JSON字符串互转

--print("local ssxc{\n"..string.gsub(str,":","").."\n}") Utils {} ---------------------------------------------------------------------------------- -- Lua-Table 与 string 转换 local function value2string(value, isA…