依赖引入
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jul</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>2.0.13</version>
</dependency>
节点解析
<Configuration> - 根节点
根节点<Configuration>
有两个属性:status和monitorinterval
status用来指定log4j本身的打印日志的级别.
monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s
还有有两个子节点:<Appenders>
和<Loggers>
,每个<Configuration>
下面应该有最多<Appenders>
和<Loggers>
各一个
<Configuration status="INFO" monitorInterval="60">
……
</Configuration>
这个案例表示日志输出的全局级别是INFO级别
<Appenders> - 添加日志输出位置
在<Appenders>节点下面可以添加日志输出位置并做相应配置,它有很多种字节点,代表可以添加的日志输出位置:<Async>、<Console>、<Failover>、<File>、<Flume>、<JDBC>、<JMS>、<JPA>、<MemoryMappedFile>、<NoSQL>、<RandomAccessFile>、<Rewrite>、<RollingFile>、<RollingRandomAccessFile>、<Routing>、<SMTP>、<Socket>、<Syslog>
其中最常用的有:
<Console> - 输出到控制台
<Console>
节点用来定义输出到控制台的Appender,ConsoleAppender将输出结果写到System.err
或System.out
。默认是System.err
。必须要包含用来格式化LogEvent的Layout元素属性
name:指定该Appender名字
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认,SYSTEM_OUT
子标签
<PatternLayout>
:输出格式,不设置默认为:%m%n,其格式规则如下:%d{HH:mm:ss.SSS}:日期,输出格式为11:33:08.440
%t:线程名,输出格式为main
%-5level:日志级别,输出格式为FATAL
%logger{36}:日志名称,输出格式为org.apache.logging.log4j.Log4j2Test
%msg:日志信息,输出格式为fatal level log
%enc{%msg}{JSON}:表示转义,将消息体转义为JSON
%n:表示换行
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %enc{%msg}{JSON}%n"/>
</Console>
</appenders>
<!-- 11:33:08.440 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log -->
<RollingFile> - 滚动文件
<RollingFile>
和<File>
一样,都是将日志写入到文件中,但<File>
对文件的约束很简单,而<RollingFile>
则较为灵活,比如多大文件时分拆,最多可以分拆成几个文件等等。另外,<RollingFile>
需要触发条件。属性
name:appender命名
fileName:文件命名
filePattern:拆分子文件命名
filePermissions:文件权限
immediateFlush:启用缓冲io,提升性能,但是可能在系统崩溃时造成日志丢失
子节点
<Policies>
:日志滚动策略<OnStartupTriggeringPolicy/>
:JVM启动时触发一次分割<SizeBasedTriggeringPolicy size="20MB"/>
:根据大小分割,20M一个文件<TimeBasedTriggeringPolicy/>
:根据时间分割
<DefaultRolloverStrategy>
:归档策略,可以调整清理策略或一段时间保留数量
<RollingFile name="serviceFile" fileName="servicelog/service.log" immediateFlush="true" append="true"
filePattern="${base_dir}/service_%d{yyyyMMddHHmmssSSS}.zip" filePermissions="rw-------">
<UsPatternLayout>
<Pattern>${logPattern}</Pattern>
</UsPatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>
<DefaultRolloverStrategy tempCompressedFilePattern="${base_dir}/service_%d{yyyyMMddHHmmssSSS}.log.temp">
<PosixViewAttribute basePath="${base_dir}" filePermissions="r--------">
<IfFileName glob="service_*.zip"/>
</PosixViewAttribute>
<Delete basePath="${base_dir}" maxDepth="1">
<IfFileName glob="service_*.zip">
<IfAccumulatedFileCount exceeds="100"/>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingRandomAccessFile> - 滚动可缓冲文件
<RollingRandomAccessFile>
有缓冲区Buffer的概念,缓冲区满了后才会写入磁盘,所以可能看不到实时滚动更新的日志(但其性能更好)。要看到实时滚动更新的日志,则用<RollingFIle>
配置方法和<RollingFile>
类似
<Loggers> - 日志
用于配置具体日志,字节点包括:
<Root> - 根节点日志
Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
<!-- 日志根节点关联到serviceFile这个Appender上面 -->
<Root level="info" includeLocation="true">
<AppenderRef ref="serviceFile"/>
</Root>
<Logger> - 日志节点
<Logger>
节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。包括以下属性:
level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
All:最低等级的,用于打开所有日志记录
Trace:是追踪,就是程序推进以下,一般也不用
Debug:指出细粒度信息事件对调试应用程序是非常有帮助的
Info:消息在粗粒度级别上突出强调应用程序的运行过程
Warn:输出警告及warn以下级别的日志
Error:输出错误信息日志
Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志
OFF:最高等级的,用于关闭所有日志记录
name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。这个要关注的是name不是命名了,是类名
此外,还有<AppenderRef>
字节点,与<Root>
中的作用一样
<!-- 把project.myservice.java包下面的日志输出到servicelog文件 -->
<Logger name="project.myservice.java" level="error" includeLocation="true" additivity="false">
<AppenderRef ref="servicelog"/>
</Logger>
<AsyncLogger> - 异步日志框架
<AsyncLogger>
的异步记录器是Log4j2的一个新特性,可以通过在单独的线程中执行I/O操作来提高应用程序的性能。其内部使用了disruptor框架,其底层数据结构为无锁环形队列,每次日志信息保存在队列中,另一个线程将队列中日志写入文件
必须引入disruptor框架使用,用法和<Logger>
一样
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>xxxxx</version>
</dependency>
评论区