繁体   English   中英

当代理不可用时,如何忽略 Log4j2 Kafka appender 警告消息?

[英]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>

这里有几个问题。

  1. 您可以减少 max.block.ms 参数以避免太长的阻塞。 实际上,在非常快的网络中,您可以将 go 降至 500 甚至 100 毫秒。
  2. 您可以为 kafka class 设置非常高的日志级别,它会发送您的错误,因此您不会收到警告。 但是我不会推荐这个。

<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM