log4j2 常用配置介绍
Maven 依赖
<!-- Log Start -->
<!-- 方便本地调试可以使用log4j做日志适配,日志输出统一使用Slf4j门面进行输出,需要将log4j配置文件放到class path -->
<!--用于与slf4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
<!-- Log End -->
Ps:
阿里巴巴在《Java开发手册泰山版》中,对日志规约有一条[强制]要求:
开发手册下载地址:https://developer.aliyun.com/topic/java2020
使用SLF4J,面向接口编程,可使程序与日志解耦,如 当未来需要更换日志框架时,可直接更换,而不需要对日志记录相关的代码(logger.info(…))做更改。
log4j2 配置介绍
<?xml version="1.0" encoding="UTF-8"?>
<!--
Configuration 后面的 status,用于设置 log4j2 自身内部的信息输出,可以不设置,当设置成 trace 级别时,可看到 log4j2 内部的各种详细输出;
monitorInterval:设置间隔秒数,定期自动检测配置文件是否有修改,有修改则重新加载配置文件。
-->
<Configuration name="baseConf" status="info" monitorInterval="300">
<!-- 在 <properties> 中定义了两个常量方便后面复用 -->
<Properties>
<property name="LOG_HOME">E:/Logs</property>
<property name="FILE_NAME">logTest</property>
</Properties>
<!-- 先定义所有的 appender -->
<Appenders>
<!-- 输出到控制台的配置 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 控制台只输出 level 及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<!--
Log4j提供的转换模式
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”;如果需要在输出日志路径中使用,可使用 ${sys:file.separator} 由系统自动判断
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式
如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
如:Testlog.main(TestLog.java:10)
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中
%% 输出一个"%"字符
更多转换模式详见官方文档:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
-->
<PatternLayout pattern="%d{ISO8601} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!-- 输出到日志文件的配置 -->
<!-- 文件会打印出所有信息,由append属性决定每次运行程序时日志文件是追加写还是清空,true 表示追加写 -->
<!--
Appender 类型
FileAppender(File)、RandomAccessFileAppender(RandomAccessFile)
相同点:写入日志信息到文件
不同点:使用的 I/O 实现类不同,前者使用 FileOutputStream,后者使用 RandomAccessFile。
官方文档说是在 bufferedIO=true (默认是 true )的情况下,性能提升 20% ~ 200%。
常用属性:
fileName:来指定文件位置,文件或目录不存在则会自动创建。
immediateFlush:是否每次写入都要立刻刷新到硬盘中。默认 true,如果使用默认值可能会影响性能。
-->
<RandomAccessFile name="MyFile" fileName="${LOG_HOME}${sys:file.separator}${FILE_NAME}.log" append="true">
<PatternLayout pattern="%d{ISO8601} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
</RandomAccessFile>
<!-- 按时间和大小对日志文件进行滚动作为存档,如果 filePattern 最后是 .log.gz 或 .log.zip 结尾,则会自动对滚动的日志进行压缩 -->
<!--
Appender 类型
RollingFileAppender(RollingFile)、RollingRandomAccessFileAppender(RollingRandomAccessFile)#
相同点:写入日志信息到文件
不同点:使用的 I/O 实现类不同,前者使用 FileOutputStream,后者使用 RandomAccessFile。
上一对的实现类不能进行[日志滚动],而带有 rolling 字样的 appender 就可以实现[滚动]功能,如满足滚动条件,则执行日志存档操作。
-->
<RollingRandomAccessFile name="RollingFile"
fileName="${LOG_HOME}${sys:file.separator}${FILE_NAME}-RollingTest.log"
filePattern="${LOG_HOME}${sys:file.separator}${FILE_NAME}-RollingTest-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{ISO8601} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<!-- Policies 需要和 filePattern 结合使用 -->
<Policies>
<!--
注意 filePattern 中配置的文件重命名规则是 ${FILE_NAME}-RollingTest-%d{yyyy-MM-dd}-%i,最小的时间粒度是 dd,即天;
TimeBasedTriggeringPolicy 指定的 interval 是 1,结合起来就是每1天生成一个新文件;
如果将 %d{yyyy-MM-dd} 改成 %d{yyyy-MM-dd HH},则最小时间粒度为小时,即每隔1小时生成一个新文件;
如果将 %d{yyyy-MM-dd} 改成 %d{yyyy-MM-dd HH-mm-ss},则最小时间粒度为秒,即每隔1秒生成一个新文件...
modulate:为 true 表示在天数边界上对齐滚动(而不是每隔24h滚动一次)
-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--
按时间滚动日志,也可以使用 CronTriggeringPolicy 替代 TimeBasedTriggeringPolicy ,schedule 填写格式同 Linux 的 Crontab 格式;
<CronTriggeringPolicy schedule="0/5 * * * * ?"/>
表示 每隔5秒 生成一个新文件
-->
<!-- 指定当文件体积大于 size 指定的值时,触发Rolling -->
<SizeBasedTriggeringPolicy size="512MB"/>
</Policies>
<!--
DefaultRolloverStrategy 属性如不设置,则默认为最多同一文件夹下 7 个文件,即 filePattern 中 -%i 的 i 表示的数字;
(阿里巴巴《Java开发手册》对日志规约中日志保存天数强制要求不得少于15天)
-->
<DefaultRolloverStrategy max="20"/>
</RollingRandomAccessFile>
</Appenders>
<!-- 定义 logger ,只有定义了 logger 并引入的 appender ,appender 才会生效 -->
<Loggers>
<!-- 建立一个默认的 root 的 logger -->
<Root level="trace">
<!--
注意:
不同标签名中,指向的日志文件,不能是同一个文件,否则会报错;
本地测试时,可以将日志打印到控制台或单个日志文件中,生产上只保留滚动日志文件的引用即可。
-->
<!-- 使用标签名为 Console 的 appender 配置定义 -->
<Appender-ref ref="Console"/>
<!-- 使用标签名为 MyFile 的 appender 配置定义 -->
<Appender-ref ref="MyFile"/>
<!-- 使用标签名为 RollingFile 的 appender 配置定义 -->
<Appender-ref ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
系统介绍
可参考如下文章: