一、概述

本文基于《​​Kafka之——扩展logback将日志输出到Kafka实例​​​》,请先阅读《​​Kafka之——扩展logback将日志输出到Kafka实例​​》。

二、扩展

《​​Kafka之——扩展logback将日志输出到Kafka实例​​​》一文中,只能输出单个字符串到Kafka,本文对上一篇博文《​​Kafka之——扩展logback将日志输出到Kafka实例​​》做了相应的扩展,能够输出Json字符串到Kafka。主要变动如下:

1、新增JsonFormatter类

主要的作用是接收ILoggingEvent返回Json字符串,代码如下:

package com.lyz.storm.formatter.impl;

import com.lyz.storm.formatter.Formatter;

import ch.qos.logback.classic.spi.ILoggingEvent;

/**
* Json格式的Formatter
* @author liuyazhuang
*
*/
public class JsonFormatter implements Formatter {

private static final String QUOTE = "\"";
private static final String COLON = ":";
private static final String COMMA = ",";

private boolean expectJson = false;


@Override
public String format(ILoggingEvent event) {
StringBuilder sb = new StringBuilder();
sb.append("{");
fieldName("level", sb);
quote(event.getLevel().levelStr, sb);
sb.append(COMMA);
fieldName("logger", sb);
quote(event.getLoggerName(), sb);
sb.append(COMMA);
fieldName("timestamp", sb);
sb.append(event.getTimeStamp());
sb.append(COMMA);
fieldName("message", sb);
if(this.expectJson){
sb.append(event.getFormattedMessage());
}else{
quote(event.getFormattedMessage(), sb);
}
sb.append("}");
return sb.toString();
}

private void fieldName(String name, StringBuilder sb){
quote(name, sb);
sb.append(COLON);
}

private void quote(String value, StringBuilder sb){
sb.append(QUOTE);
sb.append(value);
sb.append(QUOTE);
}

public boolean isExpectJson() {
return expectJson;
}

public void setExpectJson(boolean expectJson) {
this.expectJson = expectJson;
}
}

2、修改logback.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="KAFKA" class="com.lyz.storm.appender.KafkaAppender">
<topic>foo</topic>
<zookeeperHost>192.168.209.121:2181</zookeeperHost>
<brokerList>192.168.209.121:9092</brokerList>
<formatter class="com.lyz.storm.formatter.impl.JsonFormatter">
<expectJson>false</expectJson>
</formatter>
</appender>
<root level="debug">
<appender-ref ref="KAFKA"/>
</root>
</configuration>

三、测试

在Kafka服务器命令行输入如下命令:

kafka-console-consumer.sh --zookeeper localhost:2181 --topic foo --from-beginning

监听日志输出。

此时,我们运行RogueApplication类,监听到的日志如下:

[root@liuyazhuang121 local]# kafka-console-consumer.sh --zookeeper localhost:2181 --topic foo --from-beginning      
{"level":"WARN","logger":"com.lyz.storm.trend.RogueApplication","timestamp":1516674702158,"message":"This is a warning (slow state)."}
{"level":"WARN","logger":"com.lyz.storm.trend.RogueApplication","timestamp":1516674707699,"message":"This is a warning (slow state)."}
{"level":"WARN","logger":"com.lyz.storm.trend.RogueApplication","timestamp":1516674712700,"message":"This is a warning (slow state)."}

如下图所示:

Kafka之——扩展logback将日志输出到Kafka实例扩展_json

四、温馨提示

大家可以到链接下载完整扩展源码