文章目录
1. Java代码
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Test {
static {
//设置日志文件的文件名
System.setProperty("LogFileName", "LogTest");
}
//初始化logger
private static Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.info("这是INFO级别的日志");
logger.error("这是ERROR级别的日志");
}
}
2. Maven依赖
在
pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.2</version>
</dependency>
3. log4j2.xml配置文件
在
src\main\resources
文件夹下创建
log4j2.xml
文件,并根据实际需求修改配置项。
以下为示例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF">
<!-- 可以定义一些全局的配置,然后在其它地方进行引用 -->
<Properties>
<!-- 时间格式 -->
<Property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %m%n</Property>
<!-- 日志文件路径 -->
<Property name="logDir">logs</Property>
</Properties>
<Appenders>
<!-- 输出至滚动文件 -->
<RollingFile name="rolling_file"
<!-- 此处是需要在Java程序中设置LogFileName -->
fileName="${logDir}/${sys:LogFileName}.log"
filePattern="${logDir}/${sys:LogFileName}_%d{yyyy-MM-dd}.log">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${pattern}</Pattern>
</PatternLayout>
<!-- 按天存储日志 -->
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
<!-- 日志保留策略,保留10天 -->
<DefaultRolloverStrategy max=10/>
</RollingFile>
<!-- 输出至控制台 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Console>
<!-- 输出至文件 -->
<File name="Filelog" fileName="${logDir}/test.log" append="false">
<PatternLayout pattern="${pattern}"/>
</File>
</Appenders>
<!-- 只有定义了loggers并引入的appender才会生效 -->
<Loggers>
<Root level="INFO">
<appender-ref ref="rolling_file"/>
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
</Root>
<logger name="com.example.test" level="DEBUG" additivity="false">
<appender-ref ref="rolling_file"/>
</logger>
</Loggers>
</Configuration>
4. 配置项说明
4.1
<Configuration>
<Configuration>
-
status
:设置log4j自身日志的输出等级 -
monitorInterval
:用于指定log4j自动检测配置文件,并重新配置的间隔时间,单位是s,最小是5s
4.2
<Properties>
<Properties>
可以定义一些全局的配置,然后在其它地方进行引用
4.3
<Appenders>
<Appenders>
常见的子节点有3种:
RollingFile
、
Console
、
File
4.3.1
RollingFile
RollingFile
RollingFile根据
时间周期
或
文件大小
来滚动封闭旧的日志文件,并生成新的日志文件
-
name
:appender的名字 -
fileName
:当前日志文件存储的完整路径及文件名 -
filePattern
:已封闭的日志文件存储的完整路径及文件名 -
PatternLayout
:日志内容的格式,不设置默认为%m%n**(更多格式化参数见5.2)** -
ThresholdFilter
:过滤方式**(更多用法见5.3)**
a.
level
:日志级别
b.
onMatch
:≥level的日志如何处理,一般为ACCEPT,表示记录
c.
onMismatch
:<level的日志如何处理,一般为DENY,表示不记录 -
Policies
:滚动(rolling)策略,就是什么时候进行新建日志文件输出日志. -
TimeBasedTriggeringPolicy
:Policies子节点,基于时间的滚动策略
a.
interval
:指定多久滚动一次,要和
filePattern
结合使用**(具体见5.4)**
b.
modulate
:调制起始时间方式**(具体见5.4)** -
SizeBasedTriggeringPolicy
:Policies子节点,基于文件大小的滚动策略
a.
size
:指定日志文件的大小,超过此阈值后会滚动生成新文件 -
DefaultRolloverStrategy
:指定日志文件存储路径下最多有多少个文件,当文件数超过
max
后,则从最旧的文件开始删除**(更详细的配置方法见5.5)**
a.
max
:如果不设置,则默认为7
4.3.2
Console
Console
将日志输出至控制台
-
name
:appender的名字 -
target
:
SYSTEM_OUT
或
SYSTEM_ERR
-
其它参数参考
RollingFile
4.3.3
File
File
-
name
:appender的名字 -
fileName
:日志文件存储的完整路径及文件名 -
append
:默认为true,即在日志文件中追加日志内容;若设为false,则将覆盖日志内容 -
其它参数参考
RollingFile
4.4
<Loggers>
<Loggers>
常见的有2种:Root和Logger
-
Root
节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
a.
level
:指定日志级别
b.
appender-ref
:指定该日志输出到哪个appender -
Logger
节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
a.
name
:用来指定该Logger所适用的类或者类所在的包全路径
b.
level
:指定日志级别
c.
appender-ref
:指定该日志输出到哪个Appender
d.
additivity
:是否继承Root节点,默认是true;若设为false,则只会在Logger的appender里输出,不会在Root的appender里输出
5. 其它说明
5.1 日志级别
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
5.2 日志格式化参数
# %m 输出代码中指定的消息
# %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
# %r 输出自应用启动到输出该log信息耗费的毫秒数
# %c 输出所属的类目,通常就是所在类的全名
# %t 输出产生该日志事件的线程名
# %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
# 如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},输出类似:2012年01月05日 22:10:28,921
# %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
# 如:Testlog.main(TestLog.java:10)
# %F 输出日志消息产生时所在的文件名称
# %L 输出代码中的行号
# %x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中
# %% 输出一个"%"字符
#
# 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
# %5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
# %-5c:输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
# %.5c:输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格
# %20.30c:category名称<20补空格,并且右对齐,>30字符,就从左边将超出的字符截掉
5.3 日志级别过滤
# onMatch:≥level的日志如何处理
# onMismatch:<level的日志如何处理
# 参数:ACCEPT(记录),NEUTRAL(不处理),DENY(不记录)
# e.g.需要记录INFO到ERROR之间的日志,其他的不记录,可以通过设置2个过滤器实现:
# ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
# 第1个过滤器,将大于等于INFO级别的日志不处理,小于INFO级别的日志不记录
<ThresholdFilter level="INFO" onMatch="NEUTRAL " onMismatch="DENY"/>
# 第2个过滤器,将大于等于FATAL级别的日志不记录,小于FATAL级别的日志记录
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="ACCEPT"/>
另一种实现方式:小于FATAL的不处理,其他的不记录;大于等于INFO的记录,其他的不记录
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
5.4
RollingFile
时间间隔
RollingFile
TimeBasedTriggeringPolicy中:
interval的单位由filePattern的最小时间决定
e.g. 当interval=1,filePattern为%d{yyyy-MM-dd}(最小时间为“天”),则间隔1天生成一个文件
e.g. 当interval=12,filePattern为%d{yyyy-MM-dd-HH}(最小时间为“小时”),则间隔12小时生成一个文件
modulate对滚动起始时间进行调制,为true时,从0点开始计算
e.g. 现在时间为3am,interval=4,modulate=true,则第一次滚动是在4am,接着是8am、12am...
e.g. 现在时间为3am,interval=4,modulate=false,则第一次滚动是在7am,接着是11am、3pm...
5.5
DefaultRolloverStrategy
详细配置
DefaultRolloverStrategy
<DefaultRolloverStrategy>
<Delete basePath="${logDir}/" maxDepth="1">
<IfFileName glob="${sys:LogFileName}_*.log" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
6. 参考资料
log4j2xml配置解析_timebasedtriggeringpolicy_独正己身的博客-CSDN博客
log4j2配置文件log4j2.xml详解_log4j2 xml配置_tomorrow.hello的博客-CSDN博客
Log4j_log4j monitorinterval_我不睡我要写代码的博客-CSDN博客
log4j onMatch onMismatch_笔生花的博客-CSDN博客
Log4J使用详解(整理)_log4j外带_馥钰的博客-CSDN博客
Log4j2官方文档翻译、学习笔记之二——Appender的分类及常用类型示例_Star_Ship的博客-CSDN博客