【问题标题】:Kafka Log4j appender not sending messagesKafka Log4j appender 不发送消息
【发布时间】:2015-09-09 00:26:10
【问题描述】:

我是全新的 ot apache Kafka 和 log4j。我正在尝试将我的日志消息发送到 Kafka。这是我的 log4j 属性文件

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %% %m%n

log4j.appender.KAFKA=kafka.producer.KafkaLog4jAppender
log4j.appender.KAFKA.BrokerList=localhost:9092
log4j.appender.KAFKA.Topic=kfkLogs


log4j.appender.KAFKA.SerializerClass=kafka.producer.DefaultStringEncoder
log4j.appender.KAFKA.layout=org.apache.log4j.PatternLayout
log4j.appender.KAFKA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %% - %m%n

log4j.logger.logGen=DEBUG, KAFKA

但是,我无法在我的消费者中接收任何消息。我已经用其他一些生产者代码测试了消费者,它工作正常。

另外,我收到此警告

log4j:WARN No such property [serializerClass] in kafka.producer.KafkaLog4jAppender.

编辑

这是生成我的日志消息的代码

    package logGen;

import org.apache.log4j.Logger;

public class TestLog4j {

    static Logger log = Logger.getLogger(TestLog4j.class.getName());

    public static void main(String[] args) {

        log.debug("Debug message");

        log.info("Info message");

        log.error("Error Message");

        log.fatal("Fatal Message");

        log.warn("Warn Message");

        log.trace("Trace Message");
    }

}

另外,如果我使用类似的东西将日志消息写入文件

log4j.appender.KAFKA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.KAFKA.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.KAFKA.File=logs/server.log

我可以在 server.log 文件中看到日志消息

感谢大家的建议。我认为我看到的奇怪行为可能与我的 kafka 设置有关。这是我用来启动我的 kafka 服务器的 server.properties 文件的内容。你能看出什么奇怪的地方吗?

broker.id=0

port=9092

num.network.threads=3

num.io.threads=8

socket.send.buffer.bytes=102400

socket.receive.buffer.bytes=102400

socket.request.max.bytes=104857600

log.dirs=/Users/xyz/kafka/kafka-logs

num.partitions=1

num.recovery.threads.per.data.dir=1

log.retention.hours=168

log.segment.bytes=1073741824

log.retention.check.interval.ms=300000

log.cleaner.enable=false

zookeeper.connect=localhost:2181

zookeeper.connection.timeout.ms=6000

delete.topic.enable=true

【问题讨论】:

    标签: java log4j apache-kafka


    【解决方案1】:

    我查看了 KafkaLog4jAppender.scala 的源代码,这里是 Kafka log4j appender 0.8.2.1 版的 validexhaustive 属性:主题、brokerList、compressionType、requiredNumAcks、syncSend。

    对我有用的 log4j.properties 如下:

    log4j.rootLogger=ERROR, stdout
    
    log4j.logger.logGen=DEBUG, KAFKA
    
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %% %m%n
    
    log4j.appender.KAFKA=kafka.producer.KafkaLog4jAppender
    log4j.appender.KAFKA.topic=LOG
    log4j.appender.KAFKA.brokerList=localhost:9092
    log4j.appender.KAFKA.compressionType=none
    log4j.appender.KAFKA.requiredNumAcks=0
    log4j.appender.KAFKA.syncSend=true
    log4j.appender.KAFKA.layout=org.apache.log4j.PatternLayout
    log4j.appender.KAFKA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L %% - %m%n
    

    【讨论】:

      【解决方案2】:

      您需要像这样将KAFKA 添加到您的log4j.rootLogger

      log4j.rootLogger=INFO, stdout, KAFKA
      

      这会将KAFKA appender 添加到您的rootLogger。

      【讨论】:

      • 恐怕没有解决问题。但我想我找到了解决方案。请看答案
      【解决方案3】:

      我必须指定

      log4j.appender.KAFKA.producer.type=async

      log4j.logger.logGen.TestLog4j=TRACE,卡夫卡

      这似乎有效。但是我遇到了 10-30 秒的延迟。具体来说,如果我现在发布并且可以在消费者中看到消息,那么下次我发布必须大约 30 秒后,否则我在消费者中看不到任何内容。关于为什么会发生这种情况的任何想法?也许它是一个 eclispe 问题?

      【讨论】:

      • 你试过 log4j.appender.KAFKA.producer.type=sync 吗?异步生产者缓冲传入消息(按时间或消息数量)以优化网络吞吐量。您观察到延迟是正常的。
      • 谢谢,我尝试了同步选项,但现在似乎什么都没有通过!这在逻辑上没有意义。我相信这可能与我如何设置 kafka 有关。请查看我的 server.properties 文件的编辑
      【解决方案4】:

      log4j.appender.KAFKA.SerializerClass=kafka.producer.DefaultStringEncoder

      你可以试试

      log4j.appender.KAFKA.Serializer=kafka.producer.DefaultStringEncoder

      相反?

      我相信发送消息的异步模式是通过批处理来实现的,因此会延迟,您是否尝试过使用同步发送?

      【讨论】:

      • 谢谢,但我收到警告 log4j:WARN No such property [serializer] in kafka.producer.KafkaLog4jAppender。另外,如果我将模式更改为同步,似乎什么都没有传递!
      猜你喜欢
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2016-07-18
      相关资源
      最近更新 更多