前言
log4j2有8个级别,从低到高为
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
作用如下
等级 | 描述 |
---|---|
All | 最低等级的,用于打开所有日志记录 |
TRACE | 追踪,就是程序运行到哪了 |
DEBUG | 指出细粒度信息事件对调试应用程序是非常有帮助的 |
INFO | 消息在粗粒度级别上突出强调应用程序的运行过程 |
WARN | 输出警告 |
ERROR | 输出错误信息日志 |
FATAL | 输出每个严重的错误事件将会导致应用程序的退出的日志 |
OFF | 最高等级的,用于关闭所有日志记录 |
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
先看一个最简单的,log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
这个配置文件主要是把程序运行过程中error级别的日志打印到控制台
根标签Configuration常用的子标签为Properties,Appenders,Loggers
Configuration常用属性 | 描述 |
---|---|
monitorInterval | 假设这个值是10,则每隔10秒重新读取配置文件,动态的更改配置 |
status | 设置log4j2自身内部的信息输出 |
Appenders标签常用的子标签为Console,File,RollingFile
Console代表向控制台打印日志
RollingFile会根据具体的生成策略重新生成日志文件,如日志大小到了指定大小,或者到了指定时间
Console常用属性 | 描述 |
---|---|
name | Appender的名字 |
target | Either “SYSTEM_OUT” or “SYSTEM_ERR”. The default is “SYSTEM_OUT” |
File常用属性 | 描述 |
---|---|
name | Appender的名字 |
fileName | The name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created. |
append | 值为false,则每次清空文件,为true则追加到文件,默认为true |
RollingFile常用属性 | 描述 |
---|---|
fileName | The name of the file to write to. If the file, or any of its parent directories, do not exist, they will be created. |
filePattern | The pattern of the file name of the archived log file(归档日志文件的文件名的模式) |
SizeBasedTriggeringPolicy常用属性 | 描述 |
---|---|
size | 文件多大时开始翻转,后缀可为KB, MB or GB |
TimeBasedTriggeringPolicy 常用属性 | 描述 |
---|---|
interval | 根据filePattern的最小粒度,设置翻转策略 |
modulate | 在区间边界上翻转,值为boolean类型 |
maxRandomDelay | 随机延迟翻转的最大秒数,默认是0,表示没有延迟 |
DefaultRolloverStrategy 常用属性 | 描述 |
---|---|
min | 计数器的最小值,默认是1 |
max | 计数器的最大值。一旦达到这个值,旧文件将在后续翻转中删除。默认值为7 |
Loggers标签常用的子标签为Root,Logger,Root标签用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
Logger常用属性 | 描述 |
---|---|
name | 可以为随便起的名字,如果想指定某个包或者某个类的打印策略,则为包名或者全类名 |
level | 日志打印级别 |
如果Logger没有指定level属性,就会默认继承自Root
Root标签和Logger标签常用的子标签为AppenderRef
AppenderRef 常用属性 | 描述 |
---|---|
ref | 指定日志输出的Appender |
如果Logger没有指定AppenderRef ,就会默认继承自Root。如果指定了,就会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity=false只在自定义的Appender中进行输出
再介绍一个常用的过滤器标签ThresholdFilter
ThresholdFilter常用属性 | 描述 |
---|---|
level | 日志级别 |
onMatch | Action to take when the filter matches. May be ACCEPT, DENY or NEUTRAL. The default value is NEUTRAL |
onMismatch | Action to take when the filter does not match. May be ACCEPT, DENY or NEUTRAL. The default value is DENY |
这里说一下可选值ACCEPT, DENY, NEUTRAL,ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。所以,在组合过滤器中,使用NEUTRAL(中立的),被第一个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件。
常用模板
我们在项目中一般不直接使用Log4j2而是SLF4J。SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类,SLF4J类似JDBC,这样我们可以轻松更改日志的实现,一般在pom文件中加入如下即可
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
lombok是一个神奇插件,在类上加上@Slf4j 注解,就相当于在类中加入如下代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private Logger log = LoggerFactory.getLogger(类名.class);
将指定包或者指定类的日志打印到特定文件
设置Logger标签的name属性为包名或者全类名,即可把日志打到相应的文件中
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
<Properties>
<property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
<property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
<property name="logDir">./logs</property>
<property name="logLevel">debug</property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout>
<pattern>${consolePattern}</pattern>
</PatternLayout>
</Console>
<File name="logFile" fileName="${logDir}/server.log" append="false">
<PatternLayout pattern="${filePattern}"/>
</File>
<File name="classFile" fileName="${logDir}/classFile.log" append="false">
<PatternLayout pattern="${filePattern}"/>
</File>
</Appenders>
<Loggers>
<Logger name="com.test1.TestLog">
<AppenderRef ref="classFile" />
</Logger>
<Root level="${logLevel}">
<AppenderRef ref="console" />
<AppenderRef ref="logFile" />
</Root>
</Loggers>
</Configuration>
将不同级别的日志打印到特定文件
主要思路是,首先要过滤不符合的日志级别,把不需要的首先DENY掉,然后再ACCEPT需要的日志级别,这个次序不能颠倒
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
<Properties>
<!-- 定义日志输出的格式,具体含义可参考官网 -->
<property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
<property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
<property name="logDir">./logs</property>
<property name="logLevel">debug</property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout>
<pattern>${consolePattern}</pattern>
</PatternLayout>
</Console>
<File name="logFile" fileName="${logDir}/server.log" append="false">
<PatternLayout pattern="${filePattern}"/>
</File>
<File name="debugFile" fileName="${logDir}/debug.log" append="false">
<Filters>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
</Filters>
<PatternLayout pattern="${filePattern}"/>
</File>
<File name="infoFile" fileName="${logDir}/info.log" append="false">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${filePattern}"/>
</File>
<File name="errorFile" fileName="${logDir}/error.log" append="false">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${filePattern}"/>
</File>
</Appenders>
<Loggers>
<Root level="${logLevel}">
<AppenderRef ref="console" />
<AppenderRef ref="logFile" />
<AppenderRef ref="debugFile" />
<AppenderRef ref="infoFile" />
<AppenderRef ref="errorFile" />
</Root>
</Loggers>
</Configuration>
这个是把不同level的日志写到相应的文件中,并把所有日志写到logFile文件中
按时间或者大小归档
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
<Properties>
<property name="consolePattern">%d{HH:mm:ss.SSS} |-%5level %logger{20} [%t] |%X{ip} - %msg%n</property>
<property name="filePattern">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%5level %logger{20} [%t] %X{ip} - %msg%n</property>
<property name="logDir">./logs</property>
<property name="logLevel">debug</property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout>
<pattern>${consolePattern}</pattern>
</PatternLayout>
</Console>
<RollingFile name="logFile" fileName="${logDir}/server.log" filePattern="${logDir}/server-%d{yyyyMMddHH}.log.gz">
<PatternLayout>
<pattern>${filePattern}</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="24" modulate="true" />
<!--<SizeBasedTriggeringPolicy size="10MB" />-->
</Policies>
<DefaultRolloverStrategy max="30" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="${logLevel}">
<AppenderRef ref="console" />
<AppenderRef ref="logFile" />
</Root>
</Loggers>
</Configuration>
每天零点归档日志,文件名类似如下server-2018041123.log.gz,当日志达到30个以后,删除以前的日志
参考博客
[1]https://blog.csdn.net/weixin_40135537/article/details/78936054
[2]https://blog.csdn.net/q343509740/article/details/79726708
[3]https://www.cnblogs.com/hafiz/p/6170702.html
[4]https://blog.csdn.net/chenhaotong/article/details/50487557
[5]http://www.cnblogs.com/leo-lsw/p/log4j2tutorial.html