Kafka附加器的Log4j故障转移

2022-04-12 00:00:00 java log4j log4j2

我正在尝试设置我的应用程序,以便使用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,这样外观程序就会知道有问题并将消息传播到故障转移。

相关文章