Spring Boot|logback

在了解logback之前,可以先了解下slf4j、log4j、logback、java.util.logging等日志框架间的关系,会对整个日志体系有更深入的理解,链接:https://www.cnblogs.com/hanszhao/p/9754419.html

如果使用Spring boot,我们推荐自带的日志框架logback,默认是不需要单独配置 logback 依赖的。

在使用Spring boot创建好项目以后,已经默认配置了日志的一些信息,如果需要配置更详细的信息,使用logback-spring.xml来自定义日志的配置。

在类上方使用@Slf4j注解以后就可以不用创建logger对象,直接使用log即可。

一、logback标签

主要介绍一些常用的标签:

1、根节点:<configuration>

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->

<configuration debug="false" scan="true" scanPeriod="60 seconds" >
<property name="" value="" />
<appender name="" class=""></appender> <logger name="" level=""/>
<root level="INFO"></root> </configuration>

主要子节点:<property>、<appender>、<logger>、<root>

2、<property>

用来定义参数常量,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。

    <!-- <property> :用来定义参数常量,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。 -->
    <!-- 日志输出有五个级别:trace - debug - info - warn - error -->
    <property name="log.level" value="debug" />
    <!-- 文件最多保留30天 -->
    <property name="log.maxHistory" value="30" />
    <!-- 文件存放路径 -->
    <property name="log.filePath" value="" />
    <!-- 输出格式:d%表示时间格式,%thread表示运行线程,%-5level表示缩进5位显示级别,%logger{50} - %msg表示哪一个类输出的信息,%n为换行 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />

3、<appender>

负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的类型。

<!-- 控制台输出日志 -->
<appender name ="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
</appender>
<!-- 文件输出日志 -->
<appender name="infoAppender" class="ch.qos.logback.core.FileAppender">
</appender>
<!-- 文件滚动输出日志 -->
<appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender">
</appender>
<!-- 异步输出日志 -->
<appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
</appender>

ConsoleAppender、RollingFileAppender、AsyncAppender较为常用。

    <!-- 控制台输出日志设置 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder:既对日志进行格式化,还复制将日志输出到相应的载体中 -->
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- 文件输出:ERROR级别日志 -->
    <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- TimeBaseRollingPolicy :最常用的滚动策略,根据时间来制定滚动策略,即负责滚动也负责触发滚动。 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- <fileNamePattern> 必要节点,包含文件及“%d” 转换符,“%d”可以包含一个java.text.SimpleDateFormat 制定的时间格式,如:%d{yyyy-MM},如果直接使用 %d ,默认格式是 yyyy-MM-dd -->
            <!-- <filenamePattern> 必须包含“%i” 例如:命名模式为 log%i.log,会产生归档文件log1.log和log2.log,还可以指定文件压缩选项,例如:log%i.log.gz 或者 log%i.log.zip -->
            <fileNamePattern>${log.filePath}/hpms_error.%d.%i.log</fileNamePattern>
            <!-- SizeBasedTriggeringPolicy : 如果超过指定大小会告知 RollingFileAppender , 触发当前活动滚动 , 只有一个节点 , 用来规定文件大小 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 超过150MB时,触发滚动策略 -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <!--
         ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,
                          过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
                    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                        <level>INFO</level>
                    </filter>

         LevelFilter:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath
                     (用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志。
        -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>${pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>
    <!-- 异步输出ERROR日志 -->
    <appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志,如果不希望丢弃日志(既每次都是全量保存),那可以设置为0 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="errorAppender"/>
    </appender> 

目前所有的日志记录采用的都是同步的方式,即直接将日志写入文件。在多应用的时候,这种效果会导致一定的线程运行延迟,所以可以采用异步的方式处理。

4、<logger>

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定使用哪个<appender>

    <!-- name:用来指定受此logger约束的某一个包或者具体的某一个类 -->
    <logger name="com.uuunl.o2o" level="${log.level}" additivity="true">
        <!-- appender-ref使用定义的appender输出日志 -->
        <appender-ref ref="debugAppender"/>
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="errorAppender"/>
    </logger>

5、<root>

类似于<logger>的元素,只不过是根logger,所以不需要指定name属性。

    <root level="INFO">
        <appender-ref ref="consoleAppender"/>
        <appender-ref ref="errorAppender"/>
        <appender-ref ref="asyncAppender"/>
    </root>

二、logback-spring.xml

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- 从springboot配置文件中读取log.path属性值 -->
    <springProperty scope="context" name="logPath" source="log.path" defaultValue="logs"/>

    <contextName>hpms</contextName>
    <property name="charset" value="UTF-8"/>
    <property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
    <property name="pattern-color" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
    <property name="LOG_HOME" value="${logPath}"/>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!-- 控制台输出-带颜色 -->
    <appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern-color}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!-- 文件输出:INFO级别日志 -->
    <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/hpms_info.%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 保存10天 -->
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>${pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!-- 文件输出:INFO级别日志 -->
    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/hpms_error.%d.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <append>true</append>
        <!--
         ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,
                          过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
                    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                        <level>INFO</level>
                    </filter>

         LevelFilter:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath
                     (用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志。
        -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>${pattern}</pattern>
            <charset>${charset}</charset>
        </encoder>
    </appender>

    <!-- 异步输出INFO日志 -->
    <appender name="ASYNC_INFO_LOG" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="INFO_LOG"/>
    </appender>

    <!-- 异步输出ERROR日志 -->
    <appender name="ASYNC_ERROR_LOG" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多只能添加一个 -->
        <appender-ref ref="ERROR_LOG"/>
    </appender>

        <!-- 记录 mapper 目录下的日志 -->
        <logger name="com.gy.hpms.mapper" level="DEBUG"/>
<root level="INFO"> <appender-ref ref="CONSOLE-WITH-COLOR"/> <appender-ref ref="ASYNC_INFO_LOG"/> <appender-ref ref="ASYNC_ERROR_LOG"/> </root> </configuration>
原文地址:https://www.cnblogs.com/maikucha/p/14046971.html