logback配置说明
logback配置详解
官方文档 http://logback.qos.ch/manual/
1. 根节点 - configuration
一共有三个属性
-
debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-
scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
-
scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
1.1 configuration - appender
指定日志输出格式,输出位置,相当于一个出口
2个主要属性
-
name name指定appender名称
-
class class指定appender的全限定名
1.1.1 configuration - appender - encoder
encoder负责将事件转换为字节数组,并将该字节数组写入OutputStream。可以设置日志输出格式。
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
1.1.2 configuration - appender - filter
对日志进行过滤,常用的2中
- ch.qos.logback.classic.filter.ThresholdFilter 指定最低日志级别,高于等于设定级别的日志都会被输出
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 高于debug的日志都会被输出 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
- ch.qos.logback.classic.filter.LevelFilter LevelFilter基于精确的级别匹配过滤事件。如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,这取决于onMatch和onMisMatch属性的配置。
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 只输出INFO级别日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
1.1.3 configuration - appender - append
追加日志还是覆盖日志
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${basePath}self.log</file>
<!-- 默认append=true,即可追加而非覆盖 -->
<append>true</append>
<encoder>
<pattern>${pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- prudent=true表示日志写入线程安全,会降低效率,默认为false -->
<prudent>false</prudent>
</appender>
1.1.4 configuration - appender - prudent
prudent=true表示日志写入线程安全,会降低效率,默认为false
配置如上
1.1.5 configuration - appender 输出到Console
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
1.1.6 configuration - appender 输出到文件
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${basePath}self.log</file>
<!-- 默认append=true,即可追加而非覆盖 -->
<append>true</append>
<encoder>
<pattern>${pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- prudent=true表示日志写入线程安全,会降低效率,默认为false -->
<prudent>false</prudent>
</appender>
1.1.7 configuration - appender 输出到滚动文件
滚动策略。具体策略由class指定。
TimeBasedRollingPolicy是最常用的滚动策略,根据时间滚动,当达到一定时间时,自动重新开辟一个日志文件
FixedWindowRollingPolicy根据固定窗口算法重命名文件的滚动策略
triggeringPolicy根据当前活动文件大小来决定是否滚动的策略
SizeAndTimeBasedRollingPolicy同时根据日期和文件大小的滚动测策略
<appender name="timeFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 由于表达式中最小单位为天,所以每天生成一个日志文件,且以此命名 -->
<fileNamePattern>${basePath}RollingFile%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留归档文件的最大数量。 -->
<!-- 本例中由于使用了时间作为滚动策略,且fileNamePattern中最小单位为天,所以归档文件保存30天,超过30天将被删除 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- 根据固定窗口模式生成日志文件,结合triggeringPolicy(当日志文件达到5MB时触发滚动,生成新的日志文件) -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<!-- 日志文件命名,%i代表从minIndex到maxIndex,即 fixedFile1.log.zip fixedFile2.log.zip
fixedFile3.log.zip -->
<!-- 当生成了3个归档文件后,若继续生成,将覆盖最早的日志 -->
<fileNamePattern>${basePath}fixedFile%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<!-- maxIndex若过大,会被设为12 -->
<maxIndex>3</maxIndex>
</rollingPolicy>
<!-- 触发策略,达到一定条件时将通知appender,触发滚动 -->
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<!-- 同时根据时间和日期生成文件,单日文件大小超过指定会在生成一个文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
1.2 configuration - logger
logger是代码中获取用于输出的对象
3个主要属性
-
name name属性可指定为包名或类名
-
level 声明输出级别
-
additivity 表示是否向父级logger传递打印消息,默认为true
1.2.1 确定父子级别
以name属性为判断标准,同java类的包关系。
如下2个logger,第一个就是第二个的父级
<logger name="a.b" level="debug">
</logger>
<logger name="a.b.c" level="debug">
</logger>
1.2.2 输出级别的判定
若子logger没有指定level,则向父级找,以最近的一个父级的level为准,root节点是最高级,默认level是debug
如下3个logger,第二个logger的level就是info
<logger name="a" level="info">
</logger>
<logger name="a.b">
</logger>
<logger name="a.b.c" level="debug">
</logger>
1.2.3 是否向父级追加
当 additivity = true 时,子logger输出一遍,父级还会输出一遍
如下3个logger, 获取 logger = LoggerFactory.getLogger("a.b.c"),当用logger打印一个日志时,第三个会输出一次,第二个也会输出一次
<logger name="a" level="info">
</logger>
<logger name="a.b" additivity="false">
</logger>
<logger name="a.b.c" level="debug">
</logger>
1.2.4 设置输出appender
appender-ref指定输出位置,可以有0个或多个,0个就是没有输出位置,多个就是输出到多个位置
<logger name="a" level="info">
<appender-ref ref="stdout"/>
</logger>
<logger name="a.b" additivity="false">
</logger>
1.3 configuration - root
根logger,只需要指定一个 level
1.4 在logback的配置文件里获取application.yml中的属性
<springProperty name="basePath" source="log.path"/>
要想用这个标签,配置文件名不能命名为 logback.xml 或 logback-test.xml,因为那样这个配置文件就会在spring加载前加载,就找不到 application.yml中的参数
2 常用配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- 默认为 <configuration scan="true" scanPeriod="60 seconds" debug="false"> -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false -->
<configuration>
<contextName>myAppName</contextName>
<springProperty name="basePath" source="log.path" defaultValue=""/>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<property name="file_pattern"
value="%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n"/>
<property name="console_pattern"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- appender是指输出的形式或位置,name和class是两个必备属性 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。 -->
<encoder>
<pattern>${console_pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<!-- Log file debug output -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${basePath}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${basePath}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${file_pattern}</pattern>
</encoder>
</appender>
<!-- Log file info output -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${basePath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${basePath}/%d{yyyy-MM, aux}/info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${file_pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- Log file error output -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${basePath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${basePath}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${file_pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="debug">
<appender-ref ref="stdout"/>
<appender-ref ref="debug"/>
<appender-ref ref="info"/>
<appender-ref ref="error"/>
</root>
</configuration>
本文使用 mdnice 排版