Springboot使用Log4j2的配置
日志框架的对比和选择
当前比较流行的日志框架有slf4j、log4j、logback、log4j2
- 日志接口(slf4j)
slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)
- 日志实现(log4j、logback、log4j2)
log4j是apache实现的一个开源日志组件
logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现,springboot默认的日志组件就是使用的logback
Log4j2是log4j 1.x的大幅度改进和汲取了logback许多优秀的设计,性能当前是最好的,官网说明如下:
大致意思就是在多线程环境下比log4j 1和logback有了大幅提升,另外在异步日志方面,比logback等提升了18倍。所以,这里决定使用Log4j2作为主要的日志处理框架。
一、依赖配置(pom文件)
由于springboot自带了logback的日志配置,因此如果要使用log4j2,则需要将springboot的starter中的logback配置排除掉:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
然后重新添加log4j2的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
二、log4j2.xml文件的配置
需要在项目的资源根路径(src/main/resources)创建log4j2.xml文件
文件内容大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
status="warn" 日志框架本身的输出日志级别,可以修改为debug
monitorInterval="1800" 自动加载配置文件的间隔时间,不低于 1800秒;生产环境中修改配置文件,是热更新,无需重启应用
-->
<Configuration status="WARN" monitorInterval="1800">
<!--
全局属性配置
使用时通过:${name}
-->
<properties>
<property name="LOG_HOME">/var/logs/test-project</property>
<property name="REQUEST_FILE_NAME">request</property>
<property name="INFO_FILE_NAME">log-info</property>
</properties>
<!-- 日志处理 -->
<Appenders>
<!-- 控制台输出 appender,SYSTEM_OUT输出黑色,SYSTEM_ERR输出红色 -->
<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>
<!-- logger 定义 -->
<Loggers>
<!-- 使用 rootLogger 配置 日志级别 level="info" -->
<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配置文件核心概念解析
log4j2.xml配置文件主要参数配置如下:
- Configuration:为根节点,有status和monitorInterval等多个属性
- status的值有 “trace”, “debug”, “info”, “warn”, “error” ,“fatal”,用于控制log4j2日志框架本身的日志级别,如果将stratus设置为较低的级别就会看到很多关于log4j2本身的日志,如加载log4j2配置文件的路径等信息
- monitorInterval,含义是每隔多少秒重新读取配置文件,可以不重启应用的情况下修改配置
1、全局Property
这里可以设置全局的参数,在后面的输出源或者Logger日志器中使用,使用的时候,需要使用${参数名称}来使用,例如以下:
fileName="${LOG_HOME}/${INFO_FILE_NAME}.log
其中的${LOG_HOME}就是引用了上面的property定义的参数
2、Appender(日志输出源)
官方给出的定义如下:
Appender就是日志输出源,就是日志实际输出的文件的,log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等:
- Console:控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,以便调试
- File:文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(例如:D:/logs/mylog.log)
- RollingRandomAccessFile: 该输出源也是写入到文件,不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则,这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。
- fileName 指定当前日志文件的位置和文件名称
- filePattern 指定当发生Rolling时,文件的转移和重命名规则
- SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
- DefaultRolloverStrategy 指定最多保存的文件个数
- TimeBasedTriggeringPolicy
这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd
HH-mm}-%i,最小的时间粒度是mm,即分钟 - TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd
HH},最小粒度为小时,则每一个小时生成一个文件 - NoSql:MongoDb, 输出到MongDb数据库中
- Flume:输出到Apache
Flume(Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。) - Async:异步,需要通过AppenderRef来指定要对哪种输出源进行异步(一般用于配置RollingRandomAccessFile)
使用说明:
常用的是 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…等后缀的日志文件。
3、日志记录的输出格式PatternLayout
日志文件里面每一行日志数据的格式都需要定义指定的样式,例如:
<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 输出语句所在的行数, 包括类名、方法名、文件名、行数
4、Loggers:日志器
日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出。对于Loggers中level的定义同样适用。
1)、Root Logger
配置如下:
<Root level="info">
<AppenderRef ref="info-log" />
<AppenderRef ref="Console" />
</Root>
配置了logger的日志级别,以及引用的输出源
2)、 其他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