下图是官网提供的 log4j2 的性能压测结果: 图中Loggers all async 就是使用 Disruptor 后的日志处理统计,而 Async Appender 则是使用 ArrayBlockingQueue 作为队列。 可见,在 64 个线程的时候,loggers all async 的吞吐量比 Async Appender 增加了 12 倍,是 Sync 模式的 68 倍,性能提升实在可以说是效果显著!
http://logging.apache.org/log4j/2.x/manual/async.html# 1. <loggers> <!--includeLocation 打印行号,如果这里不设置,就算%L 也不会打印行号--> <AsyncRoot level="DEBUG" includeLocation="true" > <AppenderRef ref="CONSOLE"/> </AsyncRoot> <AsyncLogger name="com.luna" level="INFO" includeLoc...
下图比较了Log4j2框架Sync、Async Appenders和Loggers all async三者的性能。其中Loggers all async表现最为出色,而且线程数越多,Loggers all async性能越好。 日志门面SLF4J 上述介绍的是一些日志框架的实现(Log4j、Logback、log4j2),这里我们需要用日志门面来解决系统与日志实现框架的耦合性。SLF4J,即简单日志门面(Si...
}privatevoidhandleQueueFull(finalLogEvent event) {if(AbstractLogger.getRecursionDepth() > 1) {//LOG4J2-1518, LOG4J2-2031//If queue is full AND we are in a recursive call, call appender directly to prevent deadlockAsyncQueueFullMessageUtil.logWarningToStatusLogger(); logToAsyncLoggerConfigsOnCurr...
<!-- 定义一个异步Logger并为其配置非异步Appender --> <AsyncLogger name="com.lee.learn.log4j2.asynclogger.LearnLog4j2Async" level="INFO" additivity="false"> <appender-ref ref="MyConsole"/> </AsyncLogger> </Loggers> </Configuration>
根据官方的性能测试我们知道,Loggers all async的性能最高,但是我们在上边使用的是Sync模式(方法一,因为 Appender 默认是 synchronous 的)或Async Appender模式(方法二),那么如何更进一步让所有的 Loggers 都是 Asynchronous 的,让我们的配置更完美呢?想要使用Loggers all async只需要做两步操作。 因为Loggers all ...
{// May have been interrupted to shut down.// Here we ignore interrupts and try to process all remaining events.}}LOGGER.trace("AsyncAppender.AsyncThread stopped. Queue has {} events remaining. "+"Processed {} and ignored {} events since shutdown started.",queue.size(),count,ignored);}...
status,log4j2日志框架实现自身的日志级别,OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL monitorInterval,重新读取配置文件的间隔时间,单位为秒 Properties 属性(可选),用来定义常量,之后在其他配置项中通过${变量名}引用。 Appenders
</Loggers> </Configuration> java代码如下: import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Main { public static void main(String args[]) { Logger logger = LogManager.getLogger(Main.class); ...
除了Console、Async和RollingRandomAccessFile,还有其它的输出源。如File等,基本上不太适用,也不太常用,所以,此处不再介绍,有兴趣的同学可以百度。 loggers 日志组。日志组最终控制日志的输出形态。可配置若干个logger节点和一个root节点。 logger节点可通过name和level属性,精确设定某个包的日志级别。 root节点,可通过...