Java log4j2 asyncLogger不支持自定义中断器队列已满策略
log4j2版本:2.9.1 当中断器队列已满时,默认情况下,log4j2调用Java log4j2 asyncLogger不支持自定义中断器队列已满策略,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,log4j2版本:2.9.1 当中断器队列已满时,默认情况下,log4j2调用CurrentThread中的追加器,这可能导致许多线程在checkrollover或write file方法中被阻塞。为了解决这个问题,我试图定制log4j2 AsyncQueueFullPolicy,例如:如果CurrentThread数字大于100,则丢弃该日志 但唯一的方法是 org.apache.logging.log4j.core.async.AsyncQueueFullPolicy.getRoute(lo
CurrentThread
中的追加器,这可能导致许多线程在checkrollover或write file方法中被阻塞。为了解决这个问题,我试图定制log4j2 AsyncQueueFullPolicy,例如:如果CurrentThread
数字大于100,则丢弃该日志
但唯一的方法是
org.apache.logging.log4j.core.async.AsyncQueueFullPolicy.getRoute(long,Level)
returnEnum
TypeEventRoute
,它只支持ENQUEUE | SYNCHRONOUS | DISCARD
。在Java中,枚举类型不支持扩展
如何自定义AsyncQueueFullPolicy,请给我一个例子。谢谢 可以指定自定义的
AsyncQueueFullPolicy
。您的类需要实现接口,您可以通过将系统属性log4j2.AsyncQueueFullPolicy
设置为AsyncQueueFullPolicy实现类的完全限定类名来启动应用程序来实现接口
当队列已满时,将为每个事件调用您的实现类,以决定如何处理该事件。如果队列未满,将不会调用您的实现类。对于每个事件,您的实现类需要决定是否
- 放弃此事件(不会记录此事件)
- 将此事件排队(这将阻塞,直到队列中有可用空间为止)
- 同步:绕过队列并将此事件直接记录到底层appender如果执行此操作,事件将在日志文件中无序显示强>
public class CustomQueueFullPolicy extends DefaultAsyncQueueFullPolicy {
public CustomQueueFullPolicy() {
}
@Override
public EventRoute getRoute(final long backgroundThreadId, final Level level) {
if (backgroundThreadId > 100) {
return EventRoute.DISCARD;
}
return super.getRoute(backgroundThreadId, level);
}
}
(请注意,Log4j2的DefaultAsyncQueueFullPolicy
的实现将随着即将发布的Log4j 2.10版本而改变。有关更多信息,请参阅。)
另请参见,以获取当队列已满时丢弃级别低于某个阈值的日志事件的策略示例。可以指定自定义的
AsyncQueueFullPolicy
。您的类需要实现接口,您可以通过将系统属性log4j2.AsyncQueueFullPolicy
设置为AsyncQueueFullPolicy实现类的完全限定类名来启动应用程序来实现接口
当队列已满时,将为每个事件调用您的实现类,以决定如何处理该事件。如果队列未满,将不会调用您的实现类。对于每个事件,您的实现类需要决定是否
- 放弃此事件(不会记录此事件)
- 将此事件排队(这将阻塞,直到队列中有可用空间为止)
- 同步:绕过队列并将此事件直接记录到底层appender如果执行此操作,事件将在日志文件中无序显示强>
public class CustomQueueFullPolicy extends DefaultAsyncQueueFullPolicy {
public CustomQueueFullPolicy() {
}
@Override
public EventRoute getRoute(final long backgroundThreadId, final Level level) {
if (backgroundThreadId > 100) {
return EventRoute.DISCARD;
}
return super.getRoute(backgroundThreadId, level);
}
}
(请注意,Log4j2的DefaultAsyncQueueFullPolicy
的实现将随着即将发布的Log4j 2.10版本而改变。有关更多信息,请参阅。)
另请参阅,以获取当队列已满时丢弃级别低于某个阈值的日志事件的策略示例。谢谢,我已经提交了,希望取消注释版本能够修复此问题或提供绕过解决方案。好,然后让我们进一步讨论此问题。如果我的回答对您有用,请接受。谢谢,我已经提交了,希望取消注释版本能够修复它或提供绕过解决方案。好,那么让我们进一步讨论这个问题。如果我的回答对你有用,请接受。