SpringBoot整合Logback日志框架

文章目录

  • 一、引入
  • 二、默认日志格式
  • 三、控制台输出
  • 四、文件输出
  • 五、日志级别
  • 六、日志组
  • 七、自定义日志格式
  • 八、自定义log配置
  • 九、logback-spring.xml自定义注意事项

一、引入

SpringBoot使用 Commons Logging 进行所有内部日志的记录,但默认配置也提供了对常用日志的支持,如 Java Util Logging,Log4J2,和Logback. 每种logger都可以通过配置使用控制台或文件输出日志内容。

Logback 是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。

假设你使用starter启动创建SpringBoot应用,则默认已经导入了spring-boot-starter-logging的依赖,相继也就导入了logback所需要的依赖。

image-20241207184207661


二、默认日志格式

当我们启动SpringBoot应用时,控制台将会显示INFO级别的日志输出。

在图中,Logger(日志记录器)是负责记录日志信息的组件。Logger 名是日志记录器的唯一标识符,用于区分不同源的日志信息。具体示例如下:

  • c.h.l.SpringBootLogbackApplication
  • e.DevToolsPropertyDefaultsPostProcessor

这些Logger名通常包括包名和类名,通过这种命名方式,可以很容易地辨别日志的来源。

SpringBoot整合Logback日志框架_第1张图片

可以看到,输出内容如下:

  • 日期和时间,精确到毫秒级别。
  • 日志级别:INFO,【日志级别默认从高到低:ERROR,WARN,INFO,DEBUG,TRACE】。
  • 进程ID
  • 分隔符:来标识实际日志消息的开始。
  • 线程名:用方括号括起来(在控制台输出时可能被截断)。
  • 日志记录器名称:这通常是源类名称(通常缩写)。
  • 日志信息

PS:logback是没有FATAL级别的,它对应的就是ERROR。


三、控制台输出

默认的日志配置就是将日志信息显示到控制台,默认情况下,将会显示INFO级别以上的日志信息。你还可以通过使用--debug标志启动debug模式。

java -jar myapp.jar --debug

使用IDEA操作可以编辑Program arguments:–debug。

在application.properties中配置debug=true同样也可以将日志级别调整到DEBUG。


四、文件输出

默认情况下,SpringBoot的日志只会输出到控制台,如果你还想输出到文件中,你需要配置logging.file.namelogging.file.path两个属性。

下面这个表格展示如何组合使用logging.*来达到理想的效果:

logging.file.name logging.file.path Example Description
(none) (none) 只会输出到控制台
指定文件 (none) my.log 写入指定的日志文件在当前项目目录下
(none) 指定目录 log 在当前项目下的log目录,写入spring.log文件

日志文件达到10 MB时会触发滚动策略【切分】,默认情况下会记录INFO以上级别的信息。 可以使用logging.file.max-size属性更改大小限制。 除非已设置logging.file.max-history属性,否则默认情况下将保留最近7天的轮转日志文件。 可以使用logging.file.total-size-cap限制日志归档文件的总大小。 当日志归档的总大小超过该阈值时,将删除备份。 要在应用程序启动时强制清除日志存档,请使用logging.file.clean-history-on-start属性。


五、日志级别

可以使用logging.level设置所有受支持的日志记录器的级别。

logging:
  level:
    root: warn

这里是用的root级别,即项目的所有日志,我们也可以使用package级别,即指定包下使用相应的日志级别,这里我们可以改动root还是INFO级别,将指定包下的日志级别设置为其它级别

logging:
  level:
    root: info
    com.fastech.framework: warn
    com.fastech.framework.mqtt.service: debug
    org.apache.hadoop.util.Shell: OFF
    org.mongodb.driver.*: OFF
    org.apache.zookeeper.ZooKeeper: OFF

六、日志组

使用logging.group能够将相关的logger组合在一起统一管理日志级别等配置。使用方法如下:

假设定义了group为tomcat:

logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat

一旦这样定义之后,就可以仅仅通过一行配置,完成相关三个logger的级别配置:

logging.level.tomcat=TRACE

SpringBoot预定义了两个开箱即用的日志组:

Name Loggers
web org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sql org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener
# pre-defined
logging.level.web=debug
logging.level.sql=debug

七、自定义日志格式

在application.yml中添加

logging:
  pattern:
    console: "%clr(%d{MM-dd HH:mm:ss.SSS}){faint} %clr(${server.name} ${LOG_LEVEL_PATTERN}) %clr(${PID:- }){magenta} %clr([%5.5t]){faint} %clr(%-20.20logger{39} %5.5line){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}"
    file: "%clr(%d{MM-dd HH:mm:ss.SSS}){faint} %clr(${server.name} ${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr([%5.5t]){faint} %clr(%-20.20{39} %5.5line){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}}"
1234

logging.pattern.console

该属性用于定制日志控制台输出格式。

logging.pattern.file

该属性用于定制日志文件输出格式。

上述配置的编码中,对应符号的含义如下

%d{HH:mm:ss.SSS}——日志输出时间
%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
%-5level——日志级别,并且使用5个字符靠左对齐
%logger- ——日志输出者的名字
%msg——日志消息
%n——平台的换行符
123456

八、自定义log配置

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。

Spring Boot默认使用LogBack日志系统,你可以根据你的日志系统,按照下面表格的定义规则,选择定义对应的日志配置:

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

SpringBoot官方推荐使用带有-spring的文件名作为配置,如logback-spring.xml而不是logback.xml

这样命名的好处在于:因为标准的logback.xml配置文件加载得太早,所以不能在其中使用扩展,需要使用logback-spring.xml

当然上面是默认的命名规则,如果你想自定义xml的名称,自定义路径,可以通过logging.config属性配置:logging.config=classpath:logging-config.xml


九、logback-spring.xml自定义注意事项

接下来分享一份配置十分详细的logback.xml配置,参照注释,应该就能够掌握xml的定义。






<configuration scan="true" scanPeriod="10 seconds" debug="false">
    
    <contextName>logbackcontextName>
    
    <property name="log.path" value="log"/>
    
    <property name="console_log_pattern"
              value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}) - %gray(%msg%n)"/>
    
    <property name="console_log_springboot_pattern"
              value="%black(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green(%5p) %magenta(${PID:- }) %white(---) %black([%15.15t]) %cyan(%-40.40logger{39}) %black(:) %m%n"/>
    <property name="charset" value="UTF-8"/>
    
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        
        
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUGlevel>
        filter>
        <encoder>
            
            <pattern>${console_log_springboot_pattern}pattern>
        encoder>
    appender>

    
    <appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/roll_info/logback.%d{yyyy-MM-dd}.logfileNamePattern>
            
            
        rollingPolicy>
        
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            
            
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MMdd}.log%i.gzfileNamePattern>
            
            <maxFileSize>1MBmaxFileSize>
        rollingPolicy>
        <encoder>
            <pattern>${console_log_pattern}pattern>
            <charset>${charset}charset>
        encoder>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MBmaxFileSize>
            timeBasedFileNamingAndTriggeringPolicy>
            
            <maxHistory>15maxHistory>
        rollingPolicy>
        
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>10MBmaxFileSize>
        triggeringPolicy>
        
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFOlevel>
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>
    
    <appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    appender>
    
    <appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    appender>

    
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="info_file"/>
        <appender-ref ref="warn_file"/>
        <appender-ref ref="error_file"/>
    root>

    
    
    
    <logger name="cn.luoyan.elitecode.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="info_file"/>
    logger>

    
    
    <springProfile name="dev">
        
        <logger name="com.hyh.logback.web" level="DEBUG">
            <appender-ref ref="console"/>
        logger>

        <root level="INFO">
            <appender-ref ref="console"/>
        root>
    springProfile>
configuration>

最终的效果,会在项目路径下生成日志文件:/log/info/log-info-2020-11-01.0.log,并且日志文件的策略也在xml中定义。

控制台打印信息,如下图所示:

SpringBoot整合Logback日志框架_第2张图片

你可能感兴趣的:(后端,spring,boot,后端,java)