一、概述
本文基于《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;
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如下:
<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)."}
如下图所示:
四、温馨提示
大家可以到链接下载完整扩展源码