log4j2之日志记录器

Posted 8341-jack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2之日志记录器相关的知识,希望对你有一定的参考价值。

log4j2之日志记录器

 

   详见官网配置说明: https://logging.apache.org/log4j/2.x/manual/async.html

 1. 使所有记录器异步

Log4j-2.9及更高版本在类路径上需要disruptor-3.3.4.jar或更高版本。在Log4j-2.9之前,需要disruptor-3.0.0.jar或更高版本。

这是最简单的配置,并提供最佳性能。要使所有记录器异步,请将disruptor jar添加到类路径,并将系统属性log4j2.contextSelector设置 为org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

默认情况下,异步记录器不会将位置传递给I / O线程。如果您的某个布局或自定义过滤器需要位置信息,则需要在所有相关记录器的配置中设置“includeLocation = true”,包括根记录器。

不需要位置的配置可能如下所示:

     <!-- Don‘t forget to set system property

          -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

         to make all loggers asynchronous. --

           <?xml version="1.0" encoding="UTF-8"?> 

           <!-- Don‘t forget to set system property

  1. -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
  2. to make all loggers asynchronous. -->
  3.  
  4. <Configuration status="WARN">
  5. <Appenders>
  6. <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
  7. <RandomAccessFile name="RandomAccessFile" fileName="async.log" immediateFlush="false" append="false">
  8. <PatternLayout>
  9. <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
  10. </PatternLayout>
  11. </RandomAccessFile>
  12. </Appenders>
  13. <Loggers>
  14. <Root level="info" includeLocation="false">
  15. <AppenderRef ref="RandomAccessFile"/>
  16. </Root>
  17. </Loggers>
  18. </Configuration>

当使用AsyncLoggerContextSelector使所有记录器异步时,请确保在配置中使用普通的 <root><logger>元素。AsyncLoggerContextSelector将确保所有记录器都是异步的,使用的机制与配置<asyncRoot> 或<asyncLogger>时所发生的机制不同后面的元素用于将异步与同步记录器混合。如果同时使用这两种机制,最终会有两个后台线程,应用程序将日志消息传递给线程A,线程A将消息传递给线程B,线程B最后将消息记录到磁盘。这是有效的,但中间会有一个不必要的步骤。

您可以使用一些系统属性来控制异步日志记录子系统的各个方面。其中一些可用于调整日志记录性能。

还可以通过创建名为log4j2.component.properties的文件并在应用程序的类路径中包含此文件来指定以下属性 

请注意,系统属性在Log4j 2.10.0中重命名为更一致的样式。此处还记录所有旧属性名称

  

用于配置所有异步记录器的系统属性
系统属性默认值描述
log4j2.asyncLoggerExceptionHandler 默认处理程序 实现com.lmax.disruptor.ExceptionHandler 接口的类的完全限定名称该类需要有一个公共零参数构造函数。如果指定,则在记录消息时发生异常时将通知此类。

如果未指定,则缺省异常处理程序将打印消息并将堆栈跟踪写入标准错误输出流。

log4j2.asyncLoggerRingBufferSize 256 * 1024 异步日志记录子系统使用的RingBuffer中的大小(插槽数)。使此值足够大以处理突发的活动。最小大小为128. RingBuffer将在首次使用时预先分配,并且在系统生命周期内不会增长或缩小。

当应用程序的记录速度快于底层appender可以跟上足够长的时间来填充队列时,行为由AsyncQueueFullPolicy决定

log4j2.asyncLoggerWaitStrategy 超时 有效值:Block,Timeout,Sleep,Yield。
Block是一种策略,它使用锁和条件变量来等待I / O线程等待日志事件。当吞吐量和低延迟不如CPU资源那么重要时,可以使用块。建议用于资源受限/虚拟化环境。
超时策略的变体,它将定期从锁定条件await()调用中唤醒。这确保了如果错过通知,消费者线程不会卡住,但会以较小的延迟延迟(默认为10毫秒)恢复。
睡觉是一种最初旋转的策略,然后使用Thread.yield(),并最终停止操作系统和JVM在I / O线程等待日志事件时允许的最小数量的nanos。睡眠是性能和CPU资源之间的良好折衷。此策略对应用程序线程的影响非常小,以换取实际获取消息的一些额外延迟。
Yield是一种策略,它使用Thread.yield()在最初旋转之后等待日志事件。Yield是性能和CPU资源之间的良好折衷,但可能会使用比Sleep更多的CPU,以便更快地将消息记录到磁盘。
log4j2.asyncLoggerThreadNameStrategy CACHED 有效值:CACHED,UNCACHED。
默认情况下,AsyncLogger将线程名称缓存在ThreadLocal变量中以提高性能。如果应用程序在运行时修改线程名称(使用Thread.currentThread()。setName())并且您希望在日志中看到新的线程名称,请指定UNCACHED选项
log4j2.clock SystemClock

org.apache.logging.log4j.core.util.Clock 接口的 实现,用于在所有记录器异步时为日志事件添加时间戳
默认情况下,会在每个日志事件上调用System.currentTimeMillis

CachedClock是一种针对低延迟应用程序的优化,其中时钟戳是从时钟生成的,该时钟在后台线程中每毫秒或每1024个日志事件更新其内部时间,以先到者为准。这会略微降低日志记录延迟,但会以记录时间戳的某些精度为代价。除非您记录了许多事件,否则您可能会在日志时间戳之间看到10-16毫秒的“跳跃”。WEB应用程序警告:使用后台线程可能会导致Web应用程序和OSGi应用程序出现问题,因此不建议将CachedClock用于此类应用程序。

您还可以指定实现Clock接口的自定义类的完全限定类名

 

混合同步和异步记录器

Log4j-2.9及更高版本在类路径上需要disruptor-3.3.4.jar或更高版本。在Log4j-2.9之前,需要disruptor-3.0.0.jar或更高版本。无需将系统属性“Log4jContextSelector”设置为任何值。

可以在配置中组合同步和异步记录器。这为您提供了更大的灵活性,但代价是性能略有下降(与使所有记录器异步相比)。使用<asyncRoot><asyncLogger> 配置元素指定需要异步的记录器。配置只能包含一个根记录器(<root> 或<asyncRoot>元素),但是可以组合异步和非异步记录器。例如,包含<asyncLogger>元素的配置文件也可以包含<root>和 < 同步记录器的元素。

默认情况下,异步记录器不会将位置传递给I / O线程。如果您的某个布局或自定义过滤器需要位置信息,则需要在所有相关记录器的配置中设置“includeLocation = true”,包括根记录器。

混合异步记录器的配置可能如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <!-- No need to set system property "log4j2.contextSelector" to any value
  4. when using <asyncLogger> or <asyncRoot>. -->
  5.  
  6. <Configuration status="WARN">
  7. <Appenders>
  8. <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
  9. <RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.log"
  10. immediateFlush="false" append="false">
  11. <PatternLayout>
  12. <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>
  13. </PatternLayout>
  14. </RandomAccessFile>
  15. </Appenders>
  16. <Loggers>
  17. <!-- pattern layout actually uses location, so we need to include it -->
  18. <AsyncLogger name="com.foo.Bar" level="trace" includeLocation="true">
  19. <AppenderRef ref="RandomAccessFile"/>
  20. </AsyncLogger>
  21. <Root level="info" includeLocation="true">
  22. <AppenderRef ref="RandomAccessFile"/>
  23. </Root>
  24. </Loggers>
  25. </Configuration>

您可以使用一些系统属性来控制异步日志记录子系统的各个方面。其中一些可用于调整日志记录性能。

还可以通过创建名为log4j2.component.properties的文件并在应用程序的类路径中包含此文件来指定以下属性 

请注意,系统属性在Log4j 2.10中重命名为更一致的样式。此处还记录所有旧属性名称

 

用于配置混合异步和常规记录器的系统属性
系统属性默认值描述
log4j2.asyncLoggerConfigExceptionHandler 默认处理程序 实现com.lmax.disruptor.ExceptionHandler 接口的类的完全限定名称该类需要有一个公共零参数构造函数。如果指定,则在记录消息时发生异常时将通知此类。

如果未指定,则缺省异常处理程序将打印消息并将堆栈跟踪写入标准错误输出流。

log4j2.asyncLoggerConfigRingBufferSize 256 * 1024 异步日志记录子系统使用的RingBuffer中的大小(插槽数)。使此值足够大以处理突发的活动。最小大小为128. RingBuffer将在首次使用时预先分配,并且在系统生命周期内不会增长或缩小。

当应用程序的记录速度快于底层appender可以跟上足够长的时间来填充队列时,行为由AsyncQueueFullPolicy决定

log4j2.asyncLoggerConfigWaitStrategy 超时 有效值:Block,Timeout,Sleep,Yield。
Block是一种策略,它使用锁和条件变量来等待I / O线程等待日志事件。当吞吐量和低延迟不如CPU资源那么重要时,可以使用块。建议用于资源受限/虚拟化环境。
超时策略的变体,它将定期从锁定条件await()调用中唤醒。这确保了如果错过通知,消费者线程不会卡住,但会以较小的延迟延迟(默认为10毫秒)恢复。
睡觉是一种最初旋转的策略,然后使用Thread.yield(),并最终停止操作系统和JVM在I / O线程等待日志事件时允许的最小数量的nanos。睡眠是性能和CPU资源之间的良好折衷。此策略对应用程序线程的影响非常小,以换取实际获取消息的一些额外延迟。
Yield是一种策略,它使用Thread.yield()在最初旋转之后等待日志事件。Yield是性能和CPU资源之间的良好折衷,但可能会使用比Sleep更多的CPU,以便更快地将消息记录到磁盘。










以上是关于log4j2之日志记录器的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis源码解析之日志记录

Spring Boot之logback日志最佳实践

日志框架 log4j2 全解析

日志记录:在 Spring Boot 中使用属性文件实现 Log4j2

log4j2 异步日志 -- AsyncAppender

休眠(4.3.11-Final)日志记录未桥接到 log4j2?