root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会使用root设置的日志级别。
-
- <root level="info">
- <appender-ref ref="CONSOLE"/>
- <appender-ref ref="FILE_INFO"/>
- <appender-ref ref="FILE_ERROR"/>
- root>
Property 用来定义变量值的标签,有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
-
- <property name="FILE_ERROR_PATTERN"
- value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} %file:%line: %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。控制台打印配置,用于开发环境,如下:
-
-
- <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
-
- <level>INFOlevel>
-
- <onMatch>ACCEPTonMatch>
-
- <onMismatch>DENYonMismatch>
- filter>
-
- <encoder>
- <pattern>${CONSOLE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
除了控制台输出策略,最常用的是文件输出策略,如下所示:
-
- <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
-
- <level>ERRORlevel>
-
- <onMatch>DENYonMatch>
-
- <onMismatch>ACCEPTonMismatch>
- filter>
-
-
-
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <FileNamePattern>logs/${logFile}/info-%d{yyyy-MM-dd}.part_%i.logFileNamePattern>
-
- <maxHistory>90maxHistory>
-
-
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
- rollingPolicy>
-
-
-
-
-
- <encoder>
- <pattern>${FILE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
filter中最重要的两个过滤器为:LevelFilter、ThresholdFilter。
LevelFilter 根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。 例如下面配置将只打印INFO级别的日志,其余的全部禁止打印输出:
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
-
- <level>INFOlevel>
-
- <onMatch>ACCEPTonMatch>
-
- <onMismatch>DENYonMismatch>
- filter>
ThresholdFilter 过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件,例如下面的配置将拒绝所有低于Error级别的日志,只输出Error以及以上级别的日志:
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>Errorlevel>
- filter>
RollingFileAppender,是FileAppender的一个子类,扩展了FileAppender,具有翻转日志文件的功能。 例如,RollingFileAppender 可以记录到名为log.txt文件的文件,并且一旦满足某个条件,就将其日志记录目标更改为另一个文件。
有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即 RollingPolicy 负责执行翻转所需的操作。 RollingFileAppender的第二个子组件,即 TriggeringPolicy 将确定是否以及何时发生翻转。 因此,RollingPolicy 负责什么和TriggeringPolicy 负责什么时候。
作为任何用途,RollingFileAppender 必须同时设置 RollingPolicy 和 TriggeringPolicy。 但是,如果其 RollingPolicy 也实现了TriggeringPolicy 接口,则只需要显式指定前者。
滚动策略如下:
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <FileNamePattern>logs/${File_Name}/info-%d{yyyy-MM-dd}.part_%i.logFileNamePattern>
-
- <maxHistory>90maxHistory>
-
-
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
- rollingPolicy>
encoder中最重要就是pattern属性,它负责控制输出日志的格式。
其中:%d{yyyy-MM-dd HH:mm:ss.SSS}:日期
%-5level:日志级别
%highlight():颜色,info为蓝色,warn为浅红,error为加粗红,debug为黑色
%thread:打印日志的线程
%15.15():如果记录的线程字符长度小于15(第一个)则用空格在左侧补齐,如果字符长度大于15(第二个),则从开头开始截断多余的字符
%logger:日志输出的类名
%-40.40():如果记录的logger字符长度小于40(第一个)则用空格在右侧补齐,如果字符长度大于40(第二个),则从开头开始截断多余的字符
%cyan:颜色
%msg:日志输出内容
%n:换行符
- "1.0" encoding="UTF-8"?>
-
- <configuration scan="false" scanPeriod="60 seconds" debug="false">
-
- <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
-
-
-
- <property name="FILE_ERROR_PATTERN"
- value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} %file:%line: %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
- <define name="logFile" class="com.wyf.meterdataproduct.log.DefineLogDir"/>
-
-
- <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
-
- <level>INFOlevel>
-
- <onMatch>ACCEPTonMatch>
-
- <onMismatch>DENYonMismatch>
- filter>
-
- <encoder>
- <pattern>${CONSOLE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
- <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
-
- <level>ERRORlevel>
-
- <onMatch>DENYonMatch>
-
- <onMismatch>ACCEPTonMismatch>
- filter>
-
-
-
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <FileNamePattern>logs/${logFile}/info-%d{yyyy-MM-dd}.part_%i.logFileNamePattern>
-
- <maxHistory>90maxHistory>
-
-
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
- rollingPolicy>
-
-
-
-
-
- <encoder>
- <pattern>${FILE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
-
- <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>Errorlevel>
- filter>
-
-
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <FileNamePattern>logs/${logFile}/error-%d{yyyy-MM-dd}.part_%i.logFileNamePattern>
-
- <maxHistory>90maxHistory>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
- rollingPolicy>
- <encoder>
- <pattern>${FILE_ERROR_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
-
-
- <root level="info">
- <appender-ref ref="CONSOLE"/>
- <appender-ref ref="FILE_INFO"/>
- <appender-ref ref="FILE_ERROR"/>
- root>
-
- configuration>
有时,我们需要在写日志的时候,指定写入的路径,也就是将不同的日志写入不同的文件中,为了实现这样的需求,可以采用以下配置:
- "1.0" encoding="UTF-8"?>
-
- <configuration scan="false" scanPeriod="60 seconds" debug="false">
-
- <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
-
-
-
- <property name="FILE_ERROR_PATTERN"
- value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} %file:%line: %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
-
-
-
- <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
-
- <level>INFOlevel>
-
- <onMatch>ACCEPTonMatch>
-
- <onMismatch>DENYonMismatch>
- filter>
-
- <encoder>
- <pattern>${CONSOLE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
-
- <appender name="FILE_INFO" class="ch.qos.logback.classic.sift.SiftingAppender">
-
- <discriminator>
- <key>File_Namekey>
- <defaultValue>AepConsumerServedefaultValue>
- discriminator>
- <sift>
-
- <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
-
- <level>ERRORlevel>
-
- <onMatch>DENYonMatch>
-
- <onMismatch>ACCEPTonMismatch>
- filter>
-
-
-
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <FileNamePattern>D:/logs/GuoXin/${File_Name}/info-%d{yyyy-MM-dd}.part_%i.logFileNamePattern>
-
- <maxHistory>90maxHistory>
-
-
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
- rollingPolicy>
-
-
-
-
-
- <encoder>
- <pattern>${FILE_LOG_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
- sift>
- appender>
-
- <appender name="FILE_ERROR" class="ch.qos.logback.classic.sift.SiftingAppender">
- <discriminator>
- <key>File_Namekey>
- <defaultValue>AepConsumerServedefaultValue>
- discriminator>
- <sift>
- <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
-
- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
- <level>Errorlevel>
- filter>
-
-
-
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
- <FileNamePattern>D:/logs/GuoXin/${File_Name}/error-%d{yyyy-MM-dd}.part_%i.logFileNamePattern>
-
- <maxHistory>90maxHistory>
- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
- <maxFileSize>100MBmaxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
- rollingPolicy>
- <encoder>
- <pattern>${FILE_ERROR_PATTERN}pattern>
- <charset>UTF-8charset>
- encoder>
- appender>
- sift>
- appender>
-
-
- <root level="info">
- <appender-ref ref="CONSOLE"/>
- <appender-ref ref="FILE_INFO"/>
- <appender-ref ref="FILE_ERROR"/>
- root>
-
- configuration>
-
-
-
-
对应的类:
- public class LogService {
-
- private Logger logger = LoggerFactory.getLogger(LogService.class);
-
- /**
- * 记录info日志
- */
- public void info(String fileName,String msg){
- MDC.put("File_Name", fileName);
- logger.info(msg);
- MDC.remove("File_Name");
- }
-
- /**
- * 记录error日志
- */
- public void error(String fileName,String msg){
- MDC.put("File_Name", fileName);
- logger.error(msg);
- MDC.remove("File_Name");
- }
-
- }
这样,就可以实现在写日志的时候指定写入文件的路径,将日志写入到不同的文件中。但是,这种方式比较耗费性能,一般不建议采用。