当前比较流行的日志框架有slf4j、log4j、logback、log4j2
slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)
log4j是apache实现的一个开源日志组件
logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现,springboot默认的日志组件就是使用的logback
Log4j2是log4j 1.x的大幅度改进和汲取了logback许多优秀的设计,性能当前是最好的,官网说明如下:
大致意思就是在多线程环境下比log4j 1和logback有了大幅提升,另外在异步日志方面,比logback等提升了18倍。所以,这里决定使用Log4j2作为主要的日志处理框架。
由于springboot自带了logback的日志配置,因此如果要使用log4j2,则需要将springboot的starter中的logback配置排除掉:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
exclusion>
exclusions>
dependency>
然后重新添加log4j2的依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-log4j2artifactId>
dependency>
需要在项目的资源根路径(src/main/resources)创建log4j2.xml文件
文件内容大致如下:
<Configuration status="WARN" monitorInterval="1800">
<properties>
<property name="LOG_HOME">/var/logs/test-projectproperty>
<property name="REQUEST_FILE_NAME">requestproperty>
<property name="INFO_FILE_NAME">log-infoproperty>
properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
Console>
<RollingRandomAccessFile name="info-log"
fileName="${LOG_HOME}/${INFO_FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${INFO_FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="200 MB"/>
Policies>
<DefaultRolloverStrategy max="200"/>
RollingRandomAccessFile>
<RollingRandomAccessFile name="request-log"
fileName="${LOG_HOME}/${REQUEST_FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${REQUEST_FILE_NAME}-%d{yyyy-MM-dd}-%i.log">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="200 MB"/>
Policies>
<DefaultRolloverStrategy max="200"/>
RollingRandomAccessFile>
Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="info-log" />
<AppenderRef ref="Console" />
Root>
<Logger name="request" level="info"
additivity="false">
<AppenderRef ref="request-log"/>
Logger>
<Logger name="org.springframework">
<AppenderRef ref="Console" />
Logger>
Loggers>
Configuration>
log4j2.xml配置文件主要参数配置如下:
这里可以设置全局的参数,在后面的输出源或者Logger日志器中使用,使用的时候,需要使用${参数名称}来使用,例如以下:
fileName="${LOG_HOME}/${INFO_FILE_NAME}.log
其中的${LOG_HOME}就是引用了上面的property定义的参数
官方给出的定义如下:
Appender就是日志输出源,就是日志实际输出的文件的,log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等:
使用说明:
常用的是 RollingFile Appender或者RollingRandomAccessFile,它们是一种io 输出流(OutputStreamAppender ),将日志事件写到filePattern指定的路径的fileName名称的日志文件中,日志的滚动和归档的规则需要根据滚动策略的配置。主要策略为TriggeringPolicy(触发策略) 策略和 RolloverPolicy(覆盖策略),这两个策略可以联合起来使用。
如需要定义日志根据日期归档,同时还要根据每个日志文件大小达到一定的值,则日志切割成多个日志文件,例如,需要日志按照日期和日志大小来切割,则需要使用TimeBasedTriggeringPolicy 和 SizeBasedTriggeringPolicy 。TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd}-%i,最小的时间粒度是dd,即天,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1天生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件,SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling,以上的配置配置的是200MB,总体结合起来就是每天生成一个日志问价,如果日志文件大小超过200MB,则会分隔成_1,_2…等后缀的日志文件。
日志文件里面每一行日志数据的格式都需要定义指定的样式,例如:
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
则日志会输出格式如下的日志:
详细参数解析如下:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Client.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。对于Loggers中level的定义同样适用。
配置如下:
<Root level="info">
<AppenderRef ref="info-log" />
<AppenderRef ref="Console" />
Root>
配置了logger的日志级别,以及引用的输出源
除了可以声明root logger之外,还可以声明自定义的logger,并指定引用哪个输出源:
<Logger name="request" level="info"
additivity="false">
<AppenderRef ref="request-log"/>
Logger>
<Logger name="org.springframework">
<AppenderRef ref="Console" />
Logger>
由于项目暂时用不上异步日志,还未深入了解,待后面了解了再补充
[1] http://www.masterspringboot.com/configuration/logging/configuring-log4j2-in-spring-boot-applications
[2] http://logging.apache.org/log4j/2.x/
[3] https://blog.csdn.net/weixin_32265569/article/details/110723441