本文介紹了Kafka附加器的Log4j故障轉移的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試設置我的應用程序,以便使用Log4j的Kafka附加器將日志寫入Kafka。我已經將Kafka客戶端添加到我的類路徑中,并為Kafka附加器配置了相關配置。
當Kafka集群可用時,我能夠接收所有日志。
但是,如果Kafka關閉,我必須記錄到第二個位置,這樣日志事件才不會丟失。為此,我使用了故障轉移附加器,但它似乎仍然不起作用。
下面是我的完整log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="10">
<Properties>
<Property name="log-pattern" value="[%5.-5p]-[%d{UNIX_MILLIS}]-[%-27.-35t]-[%20c{1.}]--- %m%n" />
<Property name="log-file-location" value="${sys:user.home}/app/logs" />
<Property name="kafka-server-address" value="localhost:9092" />
<Property name="kafka-topic-name" value="app-core-logs" />
</Properties>
<Appenders>
<Kafka name="kafka" topic="${kafka-topic-name}">
<JsonLayout />
<Property name="bootstrap.servers">${kafka-server-address}</Property>
</Kafka>
<RollingFile name="rolling-file" fileName="${log-file-location}/app-core.log" filePattern="${log-file-location}/app-core-%d{MM-dd-yyyy}-%i.log.gz">
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="20 MB" />
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy fileIndex="nomax" />
</RollingFile>
<Console name="console">
<PatternLayout pattern="${log-pattern}" />
</Console>
<FailOver name="fail-over" primary="kafka">
<Failovers>
<AppenderRef ref="rolling-file" />
<AppenderRef ref="console" />
</Failovers>
</FailOver>
<File name="internal-logs" fileName="${log-file-location}/app-core-internal.log">
<PatternLayout pattern="${log-pattern}" />
</File>
</Appenders>
<Loggers>
<Root level="INFO" includeLocation="false">
<AppenderRef ref="fail-over" />
</Root>
<Logger name="io.netty" level="INFO" includeLocation="false" additivity="false">
<AppenderRef ref="internal-logs" />
</Logger>
<Logger name="io.vertx" level="INFO" includeLocation="false" additivity="false">
<AppenderRef ref="internal-logs" />
</Logger>
<Logger name="com.mchange" level="INFO" includeLocation="false" additivity="false">
<AppenderRef ref="internal-logs" />
</Logger>
</Loggers>
</Configuration>
因為應用程序是在Kafka集群關閉時構建在vert.x上的,所以我看到的只有線程塊和應用程序沒有響應,并且在配置的所有故障轉移附加器中沒有其他日志可用。我使用的是Log4j 2.13.0,測試的是目前最新版本的Even Log4j 2.14.1。
還嘗試添加retryIntervalSeconds
屬性,但沒有任何不同。
推薦答案
它不工作,因為默認情況下KafkaAppender會忽略異常。摘自log4j2 KafkaAppender文檔
忽略異常布爾值
默認值為TRUE,這會導致在內部記錄附加事件時遇到的異常,然后將其忽略。當設置為False時,異常將改為傳播到調用方。在FailoverAppender中包裝此附加器時,必須將此項設置為False。
將IGNORREEXCEPTIONS設置為FALSE,這樣外觀程序就會知道有問題并將消息傳播到故障轉移。
這篇關于Kafka附加器的Log4j故障轉移的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,