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>