我在我的 Java 应用程序中使用 Log4j2 的 AsyncLogger,该应用程序部署在 Kubernetes 环境中。该应用程序还配置了 New Relic Java 代理,我可以看到到达 New Relic 的日志事件。但是,我注意到我的应用程序日志文件中随机丢失了一些日志事件。
我的理解:
我的问题:
我的理解是否正确,如果 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>
AsyncLogger 不适用于缓慢的消费者...我建议在您的情况下不要使用 AsyncLogger。