kafka appender 的 Log4j 故障转移
Log4j failover for kafka appender
我正在尝试设置我的应用程序以使用 Log4j 的 Kafka appender 将日志写入 Kafka。我已将 kafka 客户端添加到我的类路径中,并使用相关配置配置了 kafka appender。
当 Kafka 集群可用时,我可以接收所有日志。
但是如果 Kafka 挂了,我必须登录到辅助位置,这样日志事件就不会丢失。为此,我正在使用 FailOver appender,但它似乎仍然不起作用。
以下是我的全文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>
由于应用程序是在 vert.x 上构建的,当 kafka 集群关闭时,我看到的只是线程块,应用程序没有响应,并且在配置的所有故障转移附加程序中没有其他日志可用。我正在使用 Log4j 2.13.0 并使用目前最新版本的 Log4j 2.14.1 进行了测试。
也尝试添加 retryIntervalSeconds
属性,但没有任何区别。
它不起作用,因为默认情况下 KafkaAppender 会忽略异常。来自 log4j2 KafkaAppender 文档
ignoreExceptions 布尔值
默认值为 true,导致在附加事件时遇到的异常在内部记录然后被忽略。当设置为 false 时,异常将传播给调用者。在 FailoverAppender 中包装此 Appender 时,必须将其设置为 false。
将 ignoreExceptions 设置为 false,以便 Appeder 知道出现问题并将消息传播到故障转移。
我正在尝试设置我的应用程序以使用 Log4j 的 Kafka appender 将日志写入 Kafka。我已将 kafka 客户端添加到我的类路径中,并使用相关配置配置了 kafka appender。 当 Kafka 集群可用时,我可以接收所有日志。
但是如果 Kafka 挂了,我必须登录到辅助位置,这样日志事件就不会丢失。为此,我正在使用 FailOver appender,但它似乎仍然不起作用。
以下是我的全文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>
由于应用程序是在 vert.x 上构建的,当 kafka 集群关闭时,我看到的只是线程块,应用程序没有响应,并且在配置的所有故障转移附加程序中没有其他日志可用。我正在使用 Log4j 2.13.0 并使用目前最新版本的 Log4j 2.14.1 进行了测试。
也尝试添加 retryIntervalSeconds
属性,但没有任何区别。
它不起作用,因为默认情况下 KafkaAppender 会忽略异常。来自 log4j2 KafkaAppender 文档
ignoreExceptions 布尔值
默认值为 true,导致在附加事件时遇到的异常在内部记录然后被忽略。当设置为 false 时,异常将传播给调用者。在 FailoverAppender 中包装此 Appender 时,必须将其设置为 false。
将 ignoreExceptions 设置为 false,以便 Appeder 知道出现问题并将消息传播到故障转移。