Log4j2 asyncLogger 在应用程序日志文件中缺少日志事件

问题描述 投票:0回答:1

我在我的 Java 应用程序中使用 Log4j2 的 AsyncLogger,该应用程序部署在 Kubernetes 环境中。该应用程序还配置了 New Relic Java 代理,我可以看到到达 New Relic 的日志事件。但是,我注意到我的应用程序日志文件中随机丢失了一些日志事件。

我的理解:

  • AsyncLogger 使用 RingBuffer 异步处理日志事件。
  • 应用程序线程将消息推送到RingBuffer中。当 RingBuffer 变满时,新的日志事件会绕过缓冲区并直接发送到 Appender,例如 FileAppender。
  • 负责处理 RingBuffer 的 AsyncLogger 线程速度不够快,无法清空缓冲区,导致缓冲区中存在一些未处理的事件。
  • 由于 Kubernetes 重新创建和终止 Pod 的性质,Pod 终止期间 RingBuffer 中任何未处理的日志事件都会丢失,从而导致日志永久丢失。

我的问题:

我的理解是否正确,如果 AsyncLogger 的 RingBuffer 已满并且某些事件仍未处理,那么当 pod 被 Kubernetes 销毁或重新启动时,这些事件就会丢失?

其他背景:

我的应用程序日志是使用 log4j2.xml 中配置的 AsyncLogger 和附加程序进行管理的。 该环境是在 Kubernetes 上设置的,它会定期伸缩或重新启动 Pod,可能会导致未处理的事件丢失。

Spring Boot: 2.7.12

任何在这种情况下防止日志丢失的见解或最佳实践将不胜感激。

log4j2.xml 摘录

<RollingFile name="RollingFileAppenderFunnel" fileName="${log-path}/ride_flow.log"
                 filePattern="${archive-path}/ride_flow-%d{yyyy-MM-dd}-%i.log.gz">
        <JsonLayout  compact="true" eventEol="true" properties="true" stacktraceAsString="true" objectMessageAsJsonObject="true" >
            <KeyValuePair key="@timestamp" value="$${date:yyyy-MM-dd HH:mm:ss}"/>
        </JsonLayout>
        <PatternLayout pattern="${LOG_PATTERN}"/>
        <Policies>
            <SizeBasedTriggeringPolicy size="10MB" />
        </Policies>
        <DefaultRolloverStrategy max="10"/>
    </RollingFile>

    <AsyncLogger name="com.jeeny.pay.funnel" level="info" additivity="false">
        <AppenderRef ref="RollingFileAppenderFunnel"/>
    </AsyncLogger>
log4j2
1个回答
0
投票

AsyncLogger 不适用于缓慢的消费者...我建议在您的情况下不要使用 AsyncLogger。

© www.soinside.com 2019 - 2024. All rights reserved.