在使用log4j将日志写到kafka时碰到一个问题,就是KafkaLog4jAppender出现异常后的日志处理
直接使用log会将日志写到kafka,最终死循环,所以以上的类中如果出现异常,可以将日志写到本地文件中
可以使用两种方式:

  1. 在log4j.properties中单独配置这个类的输出到本地
  2. 在代码中直接实现

本文记录第二种方式,主要功能点为使用代码方式配置Log4j 的logger
具体代码如下:

注意,相关的类都是log4j的,不是slf4j的
public class KafkaLog4jAppender extends AppenderSkeleton {
    private static final Logger log = Logger.getLogger(KafkaLog4jAppender.class.getName());
//    private static final Logger log = LoggerFactory.getLogger(KafkaLog4jAppender.class.getName());
}
    @Override
    public void activateOptions() {
        //log4j单独配置,将当前类中错误信息输出到文件中
        log.removeAllAppenders();//移除所有的appender
        log.setLevel(Level.WARN);//设置日志级别
        log.setAdditivity(false);//移除继承关系
        // 生成新的Appender
        DailyRollingFileAppender appender = new DailyRollingFileAppender();
        PatternLayout layout = new PatternLayout();
        String conversionPattern = "%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n";
        layout.setConversionPattern(conversionPattern);
        appender.setLayout(layout);
        // log输出路径
        appender.setFile("d://temp//kafka.error");
        appender.setDatePattern("'.'yyyy-MM-dd'.log'");
        appender.setEncoding("UTF-8");
        // 适用当前配置
        appender.activateOptions();
        // 将新的Appender加到Logger中
        log.addAppender(appender);
    }

在下面就可以直接使用了

producer.send(record, new Callback() {
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
                    if (!Objects.isNull(exception)) {
                        log.warn("kafka异步日志发送失败,消息内容:" + message);
                        exception.printStackTrace();
                    }
                }
            });

效果如图

clipboard.png

另附一个Log4j的配置文件

# LOG4J配置
log4j.rootCategory=info,stdout,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,SSS} %5p %c{1}:%L - %m%n

#error级别的日志输出到单独的文件
#log4j.logger.error=errorfile
# error日志输出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=d:/temp/test.error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold=ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

## appender kafka
log4j.appender.kafka=com.xiang.demo.log4j.log4jdemo.config.KafkaLog4jAppender
log4j.appender.kafka.topic=kafka_log
#log4j.appender.kafka.acks=0
log4j.appender.kafka.brokerList=192.168.21.215:9092
#log4j.appender.kafka.compressionType=none
#是否同步
#log4j.appender.kafka.syncSend=false
log4j.appender.kafka.layout=org.apache.log4j.PatternLayout
log4j.appender.kafka.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n

## appender rabbitmq
#log4j.appender.rabbitmq=com.xiang.demo.log4j.log4jdemo.config.RabbitmqLog4jAppender
#log4j.appender.rabbitmq.host=
#log4j.appender.rabbitmq.username=
#log4j.appender.rabbitmq.password=
#log4j.appender.rabbitmq.virtualhost=/log
#log4j.appender.rabbitmq.qububname=log4j_log_rabbitmq
#log4j.appender.rabbitmq.layout=org.apache.log4j.PatternLayout
#log4j.appender.rabbitmq.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n

## kafka包下的日志配置 异常只输出到本地,不输入到kafka
#取消kafka的日志继承关系
log4j.additivity.org.apache.kafka=false
log4j.logger.org.apache.kafka=warn,stdout,kfkerrfile

log4j.additivity.com.xiang.demo.log4j.log4jdemo.config.KafkaLog4jAppender=false
log4j.logger.com.xiang.demo.log4j.log4jdemo.config.KafkaLog4jAppender=warn,kfkapderrfile

log4j.appender.kfkapderrfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.kfkapderrfile.file=d:/temp/kafka.appender.error
log4j.appender.kfkapderrfile.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.kfkapderrfile.layout=org.apache.log4j.PatternLayout
log4j.appender.kfkapderrfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n

log4j.appender.kfkerrfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.kfkerrfile.file=d:/temp/kafka.error
log4j.appender.kfkerrfile.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.kfkerrfile.layout=org.apache.log4j.PatternLayout
log4j.appender.kfkerrfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n


soft_xiang
38 声望5 粉丝