root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会使用root设置的日志级别。
Property 用来定义变量值的标签,有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。控制台打印配置,用于开发环境,如下:
INFO
ACCEPT
DENY
${CONSOLE_LOG_PATTERN}
UTF-8
除了控制台输出策略,最常用的是文件输出策略,如下所示:
ERROR
DENY
ACCEPT
logs/${logFile}/info-%d{yyyy-MM-dd}.part_%i.log
90
100MB
${FILE_LOG_PATTERN}
UTF-8
filter中最重要的两个过滤器为:LevelFilter、ThresholdFilter。
LevelFilter 根据精确的级别匹配过滤事件。 如果事件的级别等于配置的级别,则筛选器接受或拒绝该事件,具体取决于onMatch和onMismatch属性的配置。 例如下面配置将只打印INFO级别的日志,其余的全部禁止打印输出:
INFO
ACCEPT
DENY
ThresholdFilter 过滤低于指定阈值的事件。 对于等于或高于阈值的事件,ThresholdFilter将在调用其decision()方法时响应NEUTRAL。 但是,将拒绝级别低于阈值的事件,例如下面的配置将拒绝所有低于Error级别的日志,只输出Error以及以上级别的日志:
Error
RollingFileAppender,是FileAppender的一个子类,扩展了FileAppender,具有翻转日志文件的功能。 例如,RollingFileAppender 可以记录到名为log.txt文件的文件,并且一旦满足某个条件,就将其日志记录目标更改为另一个文件。
有两个与RollingFileAppender交互的重要子组件。 第一个RollingFileAppender子组件,即 RollingPolicy 负责执行翻转所需的操作。 RollingFileAppender的第二个子组件,即 TriggeringPolicy 将确定是否以及何时发生翻转。 因此,RollingPolicy 负责什么和TriggeringPolicy 负责什么时候。
作为任何用途,RollingFileAppender 必须同时设置 RollingPolicy 和 TriggeringPolicy。 但是,如果其 RollingPolicy 也实现了TriggeringPolicy 接口,则只需要显式指定前者。
滚动策略如下:
logs/${File_Name}/info-%d{yyyy-MM-dd}.part_%i.log
90
100MB
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:换行符
INFO
ACCEPT
DENY
${CONSOLE_LOG_PATTERN}
UTF-8
ERROR
DENY
ACCEPT
logs/${logFile}/info-%d{yyyy-MM-dd}.part_%i.log
90
100MB
${FILE_LOG_PATTERN}
UTF-8
Error
logs/${logFile}/error-%d{yyyy-MM-dd}.part_%i.log
90
100MB
${FILE_ERROR_PATTERN}
UTF-8
有时,我们需要在写日志的时候,指定写入的路径,也就是将不同的日志写入不同的文件中,为了实现这样的需求,可以采用以下配置:
INFO
ACCEPT
DENY
${CONSOLE_LOG_PATTERN}
UTF-8
File_Name
AepConsumerServe
ERROR
DENY
ACCEPT
D:/logs/GuoXin/${File_Name}/info-%d{yyyy-MM-dd}.part_%i.log
90
100MB
${FILE_LOG_PATTERN}
UTF-8
File_Name
AepConsumerServe
Error
D:/logs/GuoXin/${File_Name}/error-%d{yyyy-MM-dd}.part_%i.log
90
100MB
${FILE_ERROR_PATTERN}
UTF-8
对应的类:
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");
}
}
这样,就可以实现在写日志的时候指定写入文件的路径,将日志写入到不同的文件中。但是,这种方式比较耗费性能,一般不建议采用。