【问题标题】:How to write application logs using log4j appender for kafka?如何使用 log4j appender for kafka 编写应用程序日志?
【发布时间】:2021-05-08 14:48:12
【问题描述】:

我想使用 log4j kafka appender 将我的应用日志消息流式传输到 kafka。

我的应用程序正在使用 spring boot 和 log4j2。

我在主题中看到了启动日志消息,但没有看到应用程序中使用的日志语句。

我是否遗漏了 log4j2 配置中的任何内容?

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" name="kafka-logs" 
packages="myapp.kafka.test">
<Appenders>
    <Kafka name="Kafka" topic="test-kafka-topic">
        <JSONLayout />
        <Property name="bootstrap.servers">server1,server2</Property>
    </Kafka>
    <Async name="Async">
        <AppenderRef ref="Kafka"/>
    </Async>

    <Console name="stdout" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5p [%-7t] %F:%L - %m%n"/>
    </Console>

</Appenders>
<Loggers>
    <Root level="INFO">
        <AppenderRef ref="Kafka"/>
        <AppenderRef ref="stdout"/>
    </Root>
    <Logger name="org.apache.kafka" level="WARN" />
</Loggers>

pom.xml

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.11.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.2</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.10</version>
    </dependency>

    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-log4j-appender</artifactId>
        <version>1.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

Java 代码

@SpringBootApplication
public class TestApplication {
private static final Logger logger = 
LoggerFactory.getLogger(TestApplication.class);
public static void main(String[] args) {
  SpringApplication application = new SpringApplication(TestApplication.class);
  logger.info("Before Application Startup");
  application.run(args);
  logger.info("After Application Startup");
}
}

登录 Kafka:

  {
  "thread" : "main",
  "level" : "INFO",
  "loggerName" : "TestApplication",
  "message" : "Started TestApplication in 17.19 seconds (JVM running for 22.67)",
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.commons.logging.LogFactory$Log4jLog",
  "instant" : {
  "epochSecond" : 1555422668,
  "nanoOfSecond" : 856000000
},
"threadId" : 1,
"threadPriority" : 5
}

控制台输出:

08:51:08.856 [main] INFO  TestApplication - Started TestApplication in 17.19 seconds (JVM running for 22.67)
[main] INFO TestApplication - Testing my application from TestApplication
[main] ERROR TestApplication - Testing my application from TestApplication

【问题讨论】:

  • Kafka 批处理消息。另外,您使用的是异步追加,因此很可能并非所有消息都立即刷新到 Kafka
  • 我删除了异步附加程序,但我的日志语句仍然没有被推送到 kafka。我更新了 kafka 和控制台中的示例日志消息。
  • 我没有看到为日志语句调用附加程序。不确定我的 log4j2.xml 中是否需要任何其他配置
  • 不确定您希望看到的确切内容。
  • 正如我所说,我在 kafka 中看到服务器启动消息,但没有来自应用程序的日志消息,如 log.error 或 log.info 消息被忽略。

标签: java apache-kafka log4j2 kafka-producer-api


【解决方案1】:

我认为 log4j2 已经有了 Kafka appender。至于我,我在 gradle 中添加了 Kafka 客户端。所以不用加kafka-log4j-appender

compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.0.1'

Maven应该类似

【讨论】:

    【解决方案2】:

    您需要排除 spring-boot-starter-logging,如下所示

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                 <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>logback-classic</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    

    【讨论】:

      【解决方案3】:

      首先,您需要在 pom.xml 文件中删除 Spring Boot 应用程序中日志的默认提供程序,它们是 Logback 并且可能是 Log-classic,然后您需要添加 log4j2 作为新的日志提供程序并添加 Kafka appender。 添加依赖项后,您需要 xml 配置文件,您可以在其中添加 Kafka appender 配置。 默认情况下,您需要在项目的资源路径中找到您的配置文件,并将其命名为“log4j2.xml”。

      您可以找到许多其他Log4j2 appenders,例如 Cassandra 或 Failover appender,并将它们添加到配置文件中的 Kafka appender 旁边。您可以在下面找到适用且正确的示例。

      <!--excluding logback -->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter</artifactId>
                  <exclusions>
                      <exclusion>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-starter-logging</artifactId>
                      </exclusion>
                      <exclusion>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>logback-classic</artifactId>
                      </exclusion>
                  </exclusions>
              </dependency>
      
      
      <!--adding log4j2 and kafka appender-->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-log4j2</artifactId>
              </dependency>
          <dependency>
              <groupId>org.apache.kafka</groupId>
              <artifactId>kafka-log4j-appender</artifactId>
              <exclusions>
                  <exclusion>
                      <groupId>org.slf4j</groupId>
                      <artifactId>slf4j-log4j12</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>
      

      Kafka appender 配置

      <?xml version="1.0" encoding="UTF-8"?>
      <Configuration status="info" name="kafka-appender" packages="Citydi.ElasticDemo">
      
          <Appenders>
      
              <Kafka name="kafkaLogAppender" topic="Second-Topic">
                  <JSONLayout />
                  <Property name="bootstrap.servers">localhost:9092</Property>
                  <MarkerFilter marker="Recorder" onMatch="DENY" onMismatch="ACCEPT"/>
              </Kafka>
      
              <Console name="stdout" target="SYSTEM_OUT">
                  <PatternLayout pattern="%d{HH:mm:ss.SSS} stdout %highlight{%-5p} [%-7t] %F:%L - %m%n"/>
                  <MarkerFilter marker="Recorder" onMatch="DENY" onMismatch="ACCEPT"/>
              </Console>
      
          </Appenders>
          <Loggers>
              <Root level="INFO">
                  <AppenderRef ref="kafkaLogAppender"/>
                  <AppenderRef ref="stdout"/>
              </Root>
              <Logger name="org.apache.kafka" level="warn" />
          </Loggers>
      
      </Configuration>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        • 2015-10-25
        • 2018-04-26
        相关资源
        最近更新 更多