Java log4j2 asyncLogger不支持自定义中断器队列已满策略

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

log4j2版本:2.9.1

当中断器队列已满时,默认情况下,log4j2调用
CurrentThread
中的追加器,这可能导致许多线程在checkrollover或write file方法中被阻塞。为了解决这个问题,我试图定制log4j2 AsyncQueueFullPolicy,例如:如果
CurrentThread
数字大于100,则丢弃该日志

但唯一的方法是
org.apache.logging.log4j.core.async.AsyncQueueFullPolicy.getRoute(long,Level)
return
Enum
Type
EventRoute
,它只支持
ENQUEUE | SYNCHRONOUS | DISCARD
。在Java中,枚举类型不支持扩展


如何自定义AsyncQueueFullPolicy,请给我一个例子。谢谢

可以指定自定义的
AsyncQueueFullPolicy
。您的类需要实现接口,您可以通过将系统属性
log4j2.AsyncQueueFullPolicy
设置为AsyncQueueFullPolicy实现类的完全限定类名来启动应用程序来实现接口

当队列已满时,将为每个事件调用您的实现类,以决定如何处理该事件。如果队列未满,将不会调用您的实现类。对于每个事件,您的实现类需要决定是否

  • 放弃此事件(不会记录此事件)
  • 将此事件排队(这将阻塞,直到队列中有可用空间为止)
  • 同步:绕过队列并将此事件直接记录到底层appender如果执行此操作,事件将在日志文件中无序显示
这些是策略可用的唯一选项。如果您想提出其他选择,请在网上提交申请

也许我误解了您的问题,但是当线程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版本而改变。有关更多信息,请参阅。)


另请参见,以获取当队列已满时丢弃级别低于某个阈值的日志事件的策略示例。

可以指定自定义的
AsyncQueueFullPolicy
。您的类需要实现接口,您可以通过将系统属性
log4j2.AsyncQueueFullPolicy
设置为AsyncQueueFullPolicy实现类的完全限定类名来启动应用程序来实现接口

当队列已满时,将为每个事件调用您的实现类,以决定如何处理该事件。如果队列未满,将不会调用您的实现类。对于每个事件,您的实现类需要决定是否

  • 放弃此事件(不会记录此事件)
  • 将此事件排队(这将阻塞,直到队列中有可用空间为止)
  • 同步:绕过队列并将此事件直接记录到底层appender如果执行此操作,事件将在日志文件中无序显示
这些是策略可用的唯一选项。如果您想提出其他选择,请在网上提交申请

也许我误解了您的问题,但是当线程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版本而改变。有关更多信息,请参阅。)


另请参阅,以获取当队列已满时丢弃级别低于某个阈值的日志事件的策略示例。

谢谢,我已经提交了,希望取消注释版本能够修复此问题或提供绕过解决方案。好,然后让我们进一步讨论此问题。如果我的回答对您有用,请接受。谢谢,我已经提交了,希望取消注释版本能够修复它或提供绕过解决方案。好,那么让我们进一步讨论这个问题。如果我的回答对你有用,请接受。