SpringBoot的日志框架

发布于:2025-04-06 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

 默认日志框架

日志配置

更换日志框架

排除默认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: DEBUG
    org.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>

 


网站公告

今日签到

点亮在社区的每一天
去签到