log4j2版本:2.9.1
当Disruptor队列已满时,默认情况下log4j2调用CurrentThread
中的Appenders可能导致许多线程在checkrollover或write-file方法中被阻塞。为了解决这个问题,我寻求自定义log4j2 AsyncQueueFullPolicy,例如:如果CurrentThread
数大于100,则丢弃日志
但是唯一的方法org.apache.logging.log4j.core.async.AsyncQueueFullPolicy.getRoute(long, Level)
返回Enum
类型EventRoute
,仅支持ENQUEUE | SYNCHRONOUS | DISCARD
。在Java中,不支持枚举类型。
如何自定义AsyncQueueFullPolicy,请举个例子。谢谢!
最佳答案
可以指定自定义AsyncQueueFullPolicy
。您的类需要实现AsyncQueueFullPolicy接口,并通过将系统属性log4j2.AsyncQueueFullPolicy
设置为AsyncQueueFullPolicy实现类的完全限定的类名来启动应用程序,从而实现install的接口。
当队列已满时,将为每个事件调用您的实现类,以决定如何处理该事件。如果队列未满,则不会调用您的实现类。对于每个事件,您的实现类都需要决定是否
取消此事件(将不会记录)
排队此事件(它将阻塞直到队列中的空间可用为止)
同步:绕过队列并将此事件直接记录到基础附加程序。如果这样做,事件将在日志文件中乱序显示!
这些是策略可用的唯一选项。如果您想提出其他选项,请在Log4j2 issue tracker上加票。
可能是我误解了您的问题,但是一个自定义策略会在线程ID大于100时丢弃事件,看起来像这样:
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发行版而更改。有关更多信息,请参见LOG4J2-2031。)另请参见DiscardingAsyncQueueFullPolicy,以获取示例,该策略在队列已满时丢弃级别低于特定阈值的日志事件。