你还在用Logback?Log4j2的异步性能已经无敌了,还不快试试
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
Log4j2简介
更简化的配置 更强大的参数格式化 最夸张的异步性能
org.apache.logging.log4j » log4j-api org.apache.logging.log4j » log4j-core
最牛逼的性能
最强的异步性能
零GC(Garbage-free)
更高性能 I/O 写入的支持
更强大的参数格式化
使用{}占位符格式化参数
{}
的方式来实现“format”的功能(参数会直接toString替换占位符),像下面这样:logger.debug("Logging in user {} with birthday {}", user.getName(), user.getBirthdayCalendar());
使用String.format的形式格式化参数
{}
的参数占位符,还支持String.format的形式:public static Logger logger = LogManager.getFormatterLogger("Foo");
logger.debug("Logging in user %s with birthday %s", user.getName(), user.getBirthdayCalendar());
logger.debug("Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
logger.debug("Integer.MAX_VALUE = %,d", Integer.MAX_VALUE);
logger.debug("Long.MAX_VALUE = %,d", Long.MAX_VALUE);
LogManager.getFormatterLogger
而不是LogManager.getLogger
**使用logger.printf格式化参数
printf
方法,无需创建LogManager.getFormatterLogger
,就可以使用String.format
的形式logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
logger.debug("Opening connection to {}...", someDataSource);
“惰性”打日志(lazy logging)
logger.debug("入参报文:{}",JSON.toJSONString(policyDTO));
isDebugEnable
来判断当前配置下debug级别是否可以输出:if(logger.isDebugEnabled()){
logger.debug("入参报文:{}",JSON.toJSONString(policyDTO));
}
void debug(String message, Supplier>... paramSuppliers);
void info(String message, Supplier>... paramSuppliers);
void trace(String message, Supplier>... paramSuppliers);
void error(String message, Supplier>... paramSuppliers);
//等同于下面的先判断,后打印
logger.debug("入参报文:{}",() -> JSON.toJSONString(policyDTO));
if(logger.isDebugEnabled()){
logger.debug("入参报文:{}",JSON.toJSONString(policyDTO));
}
更简化的配置
logback.xml
"1.0" encoding="UTF-8"?>
"File" class= "ch.qos.logback.core.rolling.RollingFileAppender">
logs/app.log
"ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
logs/archives/app-%d{yyyy-MM-dd}.log.gz
1 GB
"info">
"File"/>
log4j2.xml
"1.0" encoding="UTF-8"?>
"http://www.w3.org/2001/XInclude"
status="warn" name="XInclude">
"File" fileName="logs/app.log" filePattern="logs/archives/app-%d{yyyy-MM-dd}-%i.log.gz">
"%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40.40c{1.} : %m%n"/>
"1 GB"/>
"INFO">
"File"/>
"File">
"File" class= "ch.qos.logback.core.rolling.RollingFileAppender">
与其他日志抽象/门面适配
其他的特点
异步队列使用高性能队列 - **LMAX Disruptor ** Appender丰富,有JMS/JPA/KAFKA/Http/MONGODB/CouchDB/Socket/Script等各种Appender的支持 支持自定义日志级别 ……
基本用法
引用log4j2的maven依赖
org.apache.logging.log4j
log4j-core
2.14.1
配置文件示例
classpath:log4j2.xml
(推荐使用xml)"1.0" encoding="UTF-8"?>
"http://www.w3.org/2001/XInclude"
status="warn" name="XInclude">
"PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %-40.40c{1.} : %m%n"/>
"Console" target="SYSTEM_OUT">
"${PATTERN}"/>
"File" fileName="logs/app.log" filePattern="logs/archives/app-%d{yyyy-MM-dd}-%i.log.gz">
"${PATTERN}"/>
"1 GB"/>
"your logger/package name" level="debug" additivity="false"/>
"INFO">
"Console"/>
"File"/>
XML配置文件语法
"1.0" encoding="UTF-8"?>;
"name1">value
"name2" value="value2"/>
...
"name1">
...
"level">
"name"/>
创建Logger
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Logger logger = LogManager.getLogger(Log4j2Test.class);
logger.error(...);
logger.warn(...);
logger.info(...);
logger.debug(...);
logger.trace(...);
全异步配置(重要!!)
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
总结
作者 | 空无
来源 | juejin.cn/post/6945753017878577165
评论