[英]How can I ignore Log4j2 Kafka appender warning messages when broker is not available?
我有一个 java 应用程序,它使用 log4j2 登录到控制台。 我希望以异步方式将特定日志消息从我的 java 应用程序发送到 kafka 服务器,同时仍将其他日志发送到控制台。 但是,当 Kafka 服务器不可用时,控制台被“Broker 可能不可用”警告消息淹没,并且其他日志应该在 go 到控制台似乎在队列中等待,直到客户端超时。
我正在按照 log4j2 文档中的说明使用 VM 选项进行异步日志记录
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
我尝试在 Kafka appender 上将 syncSend 设置为 false,用 AsyncAppender 包装它,但似乎没有任何效果。
这是重现问题的示例
package main;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
public class Main {
public static void main(String[] args) {
Logger logger = LogManager.getLogger();
Marker kafkaMarker = MarkerManager.getMarker("KAFKA");
logger.info("someErrorMessage");
logger.info(kafkaMarker, "someKafkaMessage");
for (int i = 0; i < 100; i++) {
logger.info("someErrorMessage: " + i);
}
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>untitled</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<log4j2.version>2.13.3</log4j2.version>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-log4j-appender</artifactId>
<version>2.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
</dependencies>
</project>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" strict="true">
<Properties>
<Property name="LOG_PATTERN">
%c.%M %m %ex%n
</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<Layout type="PatternLayout" pattern="${LOG_PATTERN}"/>
</Console>
<Kafka name="KafkaAppender" topic="logProducer" syncSend="false">
<Property name="bootstrap.servers">localhost:9092</Property>
<MarkerFilter marker="KAFKA" onMatch="ACCEPT" onMismatch="DENY"/>
<Layout type="PatternLayout" pattern="${LOG_PATTERN}"/>
</Kafka>
<Async name="AsyncKafkaAppender">
<AppenderRef ref="KafkaAppender"/>
</Async>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="KafkaAppender" />
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>
这里有几个问题。
<Logger name="org.apache.kafka" level="ERROR" additivity="false"><AppenderRef ref="Console"/></Logger>
使用 org.apache.kafka 之类的名称,您可以通过选择性日志记录更深入地了解 go。 重要的是将加性设置为 false。
最后我肯定会注意,Kafka Broker 的可用性很高。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.