美文网首页springbootSpring Boot全家桶
Spring Boot之整合logback日志

Spring Boot之整合logback日志

作者: 狄仁杰666 | 来源:发表于2020-08-10 23:27 被阅读0次

    前言

    本文使用的项目代码,是基于之前文章使用的Spring Boot项目:

    日志系统分为两部分,一部分是日志抽象层,一部分是日志实现层。

    常见日志抽象层:
    • JCL
    • SLF4J
    • JBoss-Logging
    常见日志实现层有:
    • logback
    • log4j
    • log4j2
    • JUL

    每种Logger都可以通过配置使用控制台或者文件输出日志内容,logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持slf4j,而Spring Boot 默认使用slf4j + logback作为日志系统,广泛应用于Spring Boot项目。今天我们就一起来学学如何使用slf4j + logback日志系统。

    整合logback日志步骤

    1. 添加依赖?
    2. 创建日志配置文件;
    3. 编写日志配置文件;
    4. 日志配置文件介绍;
    5. 日志实例;
    6. 日志效果。

    1. 添加依赖?

    如果要使用logback,原则上是需要添加dependency依赖的,但也如前言所说,logback是Spring Boot 默认的日志实现层,因此只要项目中只要有使用了spring-boot-starter或者spring-boot-starter-web依赖,默认已经包含logback的相关依赖:

    #无需再次引用以下logback依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
    

    2. 创建日志配置文件;

    在项目src/main/resources底下创建日志配置文件,如:logback-spring.xml;

    注意:能够被Spring Boot自动识别的logback日志配置文件名:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy。

    如果换成其他名字,如logging-config.xml,那么需要在application.properties文件内额外指定文件名,如:

    logging.config=classpath:logging-config.xml
    
    官方推荐优先使用带有“-spring”文件名的文件作为日志配置文件,这样Spring Boot会为它添加一些Spring Boot特有的配置项。
    logback日志配置文件

    3. 编写日志配置文件;

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <contextName>logback</contextName>
        <!-- 定义日志的根目录 -->
        <property name="LOG_PATH" value="logs"/>
        <property name="LOG_ARCHIVE" value="${LOG_PATH}/archive"/>
    
        <!--输出到控制台,即:ConsoleAppender-->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <withJansi>true</withJansi>
            <encoder>
                <!--格式化输出:
                %d:表示日期
                %thread:表示线程名
                %-5level:级别从左显示5个字符宽度
                %msg:日志消息
                %n:是换行符-->
                <pattern>%red([%d{yyyy-MM-dd HH:mm:ss}]) %green([ %thread ]) %highlight([ %-5level ]) %boldMagenta([ %logger ]) - %cyan(%msg%n)
                </pattern>
                <charset>GBK</charset>
            </encoder>
            <!--日志过滤器,如配置则只有被配置的类型才会被记录下来-->
            <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>-->
        </appender>
    
        <!--输出到文件,即:RollingFileAppender-->
        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>${LOG_PATH}/current.log</File>
            <!--TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略-->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_ARCHIVE}/app.%d.%i.log.gz</fileNamePattern>
                <maxHistory>30</maxHistory>
                <totalSizeCap>20GB</totalSizeCap>
                <timeBasedFileNamingAndTriggeringPolicy
                        class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!--文件达到最大10MB时会被压缩和切割-->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
            <encoder>
                <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [ %thread ] [ %-5level ] [ %logger ] - %msg%n</pattern>
                <charset>GBK</charset>M
            </encoder>
        </appender>
    
        <root level="info">
            <appender-ref ref="console"/>
            <appender-ref ref="file"/>
        </root>
    
        <logger name="com.mycompany.sample.service.LeadService" level="warn">
            <appender-ref ref="file"/>
        </logger>
    </configuration>
    

    4. 日志配置文件介绍;

    1. <property>节点:

    用于定义变量,方便使用。有两个属性:name,value。<property>有两个属性:name、value,定义变量后,可以使用${}来使用变量,如:

    • 声明变量:
    <property name="LOG_PATH" value="logs"/>
    <property name="LOG_ARCHIVE" value="${LOG_PATH}/archive"/>
    
    • 使用变量:
    <File>${LOG_PATH}/current.log</File>
    ...
    <fileNamePattern>${LOG_ARCHIVE}/app.%d.%i.log.gz</fileNamePattern>
    

    2. <appender>节点:

    用来格式化日志输出的节点,<appender>有两个属性: name、class,name用于给该 appender 命名,class用于指定输出策略,通常有两种:

    • 控制台输出:
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    ...
    </appender>
    
    • 文件输出:
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
    ...
    </appender>
    

    3. <filter>子节点:

    <filter>日志过滤器或叫过滤策略,在此之前,我们需要先了解一些基础知识:
    过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个:

    • 如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器;
    • 如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件,下一个过滤器会继续执行过滤,如无其他过滤器,则记录日志;
    • 如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。

    日志级别由低到高: trace < debug < info < warm < error

    常见过滤策略有:

    • ThresholdFilter: 临界值过滤器。

    过滤掉低于指定临界值的日志,当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝,即不记录。
    例如,过滤掉所有低于INFO级别的日志:

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
    
    • LevelFilter:级别过滤器。

    根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。
    例如,当且仅当日志级别为ERROR时记录日志,否则不记录:

    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
    </filter>
    
    • EvaluatorFilter:求值过滤器。

    求值过滤器,评估、鉴别日志是否符合指定条件。需要额外的两个JAR包,commons-compiler.jar和janino.jar,我也没有尝试,此处不做介绍。

    4. <encoder>子节点:

    用于设置日志格式化策略、字体等。

    5. <rollingPolicy>子节点:

    用于设置滚动策略,所谓的滚动,即自动停止在当前日志文件中打印日志,同时自动启用新的日志文件进行记录,我们可以设置一定的策略,使得这样的过程在满足该策略条件时,自动发生滚动操作。
    最常用的滚动策略是TimeBasedRollingPolicy,它根据时间来制定滚动策略,如:

    # 日志最多保留30天,且总保存量为20GB;
    # 当文件达到10MB时,会进行压缩和切割滚;
    # 旧log以${log.path}/app.%d.%i.log.gz文件路径滚动,如:logs/app.2020-08-10.0.log.gz,app.2020-08-10.1.log.gz;
    # 新生成的日志文件一直还是logs/current.log。
    
    <File>${LOG_PATH}/current.log</File>
    <!--TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>${LOG_ARCHIVE}/app.%d.%i.log.gz</fileNamePattern>
        <maxHistory>30</maxHistory>
        <totalSizeCap>20GB</totalSizeCap>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!--文件达到最大10MB时会被压缩和切割-->
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    

    滚动实例如:

    滚动实例

    6. <root>节点:

    root节点是必选节点,用来指定最基础的日志输出级别,如:

    #低于warn(大小写均可)级别的日志,将不被记录。
    <root level="warn">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>
    

    7. <logger>节点:

    logger节点用于单独对某个类进行日志策略定制,如:

    #对于com.mycompany.sample.service.LeadService类,最低纪录日志界别为warn,记录类型为文件型,低于warn级别的日志将不被记录。
    <logger name="com.mycompany.sample.service.LeadService" level="warn">
        <appender-ref ref="file"/>
    </logger>
    

    5. 日志实例;

    • 实例1:
    package com.mycompany.sample;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    /**
     * @author : dylanz
     * @since : 07/07/2020
     **/
    @SpringBootApplication
    @EnableSwagger2
    @MapperScan(basePackages = "com.mycompany.sample.dao")
    public class App {
        private static Logger logger = LoggerFactory.getLogger(App.class);
    
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
            logger.trace("This is trace logger...");
            logger.debug("This is debug logger...");
            logger.info("This is info logger...");
            logger.warn("This is warn logger...");
            logger.error("This is error logger...");
        }
    }
    //关键一行代码:
    //private static Logger logger = LoggerFactory.getLogger(App.class);
    //getLogger()方法内要使用该类类名;
    
    • 实例2:
    package com.mycompany.sample.service;
    
    import com.mycompany.sample.dao.LeadDAO;
    import com.mycompany.sample.domain.Lead;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    /**
     * @author : dylanz
     * @since : 07/07/2020
     **/
    @Service
    public class LeadService {
        private static Logger logger = LoggerFactory.getLogger(LeadService.class);
    
        @Autowired
        private LeadDAO leadDAO;
    
        public Lead getLeadByLeadId(Long leadId) {
            logger.trace("This is trace logger in LeadService...");
            logger.debug("This is debug logger in LeadService...");
            logger.info("This is info logger in LeadService...");
            logger.warn("This is warn logger in LeadService...");
            logger.error("This is error logger in LeadService...");
            return leadDAO.getLeadByLeadId(leadId);
        }
    }
    

    6. 日志效果;

    • console日志;

    • file日志;

    日志

    码字不容易,点赞需积极

    谢谢!!!

    相关文章

      网友评论

        本文标题:Spring Boot之整合logback日志

        本文链接:https://www.haomeiwen.com/subject/vlcsdktx.html