Log4j2是Log4j的升级版,参考Logback的优秀设计并修复了一些问题。主要优点有:
Log4j2和Slf4j一样,既可以当门户也可以当日志实现。但是通常都是用Slf4j当门户,Log4j2当日志实现。先单独使用Log4j2进行日志打印
-
-
-
-
org.apache.logging.log4j -
log4j-api -
2.19.0 -
-
-
-
org.apache.logging.log4j -
log4j-core -
2.19.0 -
-
-
-
junit -
junit -
4.12 -
-
- public class TestLog4j2 {
- public final static Logger logger = LogManager.getLogger(TestLog4j2.class);
-
- @Test
- public void testLog() throws Exception {
- logger.fatal("fatal");
- logger.error("error");
- logger.warn("wring");
- logger.info("info");
- logger.debug("debug");
- logger.trace("trace");
- }
- }
20:05:28.830 [main] FATAL com.zmt.TestLog4j2 - fatal
20:05:28.831 [main] ERROR com.zmt.TestLog4j2 - error
可以看出,Log4j2的默认级别为error。
接下来使用Slf4j与Log4j2混合使用。
只需要在pom文件中添加slf4j-api与log4j-slf4j-impl依赖就好。其余什么都不用改变。
-
-
-
org.slf4j -
slf4j-api -
2.0.7 -
-
-
-
org.apache.logging.log4j -
log4j-slf4j-impl -
2.13.3 -
-
-
-
junit -
junit -
4.12 -
-
log4j2默认加载classpath路径下的log4j2.xml文件
- "1.0" encoding="UTF-8"?>
"warn" monitorInterval="5"> -
-
"log_dir" value="D:/logs"> -
-
-
-
-
"Console" target="SYSTEM_ERR"> -
"%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/> -
-
-
"file" fileName="${log_dir}/myfile.log"> -
"[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/> -
-
-
-
"accessFile" fileName="${log_dir}/myAcclog.log"> -
"[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/> -
-
-
"rollingFile" fileName="${log_dir}/myrollog.log" - filePattern="${log_dir}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
-
-
"debug" onMatch="ACCEPT" onMismatch="DENY"/> -
-
"[%d{yyyy-MM-dd HH:mm:ss}] [-5level] %l %c{36} - %msg%n"/> -
-
-
-
-
"10 MB"/> -
-
-
-
-
"30"/> -
-
-
-
-
-
-
"trace"> -
-
"Console"/> -
"file"/> -
-
异步日志分为三种:
其中异步Appender的性能最差,基本不使用。
全局异步Logger性能最好,但是有时并不是所有的业务都需要异步记录日志,因此也不常用。
通常使用混合AsyncLogger。
在xml配置文件中Appenders标签下添加配置
-
-
-
"Console" target="SYSTEM_ERR"> -
"%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/> -
-
-
"file" fileName="${log_dir}/myfile.log"> -
"[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/> -
-
-
"async"> -
"file"> -
-
-
-
-
-
-
"trace"> -
-
"Console"/> -
"async"/> -
-
- public class TestLog4j2 {
- public final static Logger logger = LogManager.getLogger(TestLog4j2.class);
-
- @Test
- public void testLog() throws Exception {
- logger.fatal("fatal");
- logger.error("error");
- logger.warn("wring");
- logger.info("info");
- logger.debug("debug");
- logger.trace("trace");
- }
- }
观察日志文件
只需要在resource目录下创建文件名为log4j.component.properties添加如下配置
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
log4j2.xml配置文件不需要做任何改动。
如果使用混合异步Logger,需要将全局异步Logger的配置文件注释或删除,并且需要添加依赖。
-
-
com.lmax -
disruptor -
3.4.4 -
在log4j.xml文件中进行修改
-
-
-
-
-
"com.zmt" level="debug" includeLocation="false" additivity="false"> -
"Console"/> -
-
-
-
-
"trace"> -
-
"Console"/> -
"async"/> -
-
观察控制台输出
可以看到,即使日志格式中添加了%L但仍不会再控制台中打印行号
注意:
其他日志系统在记录日志时会分配临时对象,如日志事件对象、字符串、字符数组等,当临时对象过多时会触发JVM的gc操作(该操作会暂停程序的运行)。而Log4j2从2.6版本开始,默认情况下以无垃圾模式运行,主要原理是重用对象和缓冲区,尽可能的不分配临时对象。