本文共 2712 字,大约阅读时间需要 9 分钟。
@Date 2017.05.09
继承RollingFileAppender,重写输出文件格式
工程中期望输出到日志中的是JSON格式, 但是在业务中log.info(变量),此变量会有带引号的情况下, 会影响最终输出结构,因为重写file appender.
--> UTF-8 {"time":"${bySecond}","level":"%-5level","msg":"%msg"} %n -->
%msg是logback输出的日志内容,此字符串如果本身带引号,则造成输出到日志文件里的JSON格式无法解析.
public class UserFileAppender extends RollingFileAppender{ @Override protected void subAppend(ILoggingEvent event){ // 获取event中的message内容 event.getFormattedMessage().replace("\"","\\\""); start(); super.subAppend(event); }}
进阶:异步处理log.xxxx()日志
当在程序中输出了一些日志,并期望对这些日志内容做特定处理(存储DB/解析发送消息等)
public class TransportDBLoggerAppender extends UnsynchronizedAppenderBase{ @Override public void append(ILoggingEvent event) { try { String content = event.getFormattedMessage(); Map map = new HashMap<>(); map.put("LOG_LEVEL", event.getLevel().levelStr); map.put("CONTENT", content.replace("'", "''")); // 处理逻辑 } catch (Exception e) { System.err.println(e); } }}
Layout:自定义日志输出格式
在上述场景中发现只输出msg还不够满足业务的需求,业务里有需要把MDC存储的上下文也加到输出的JSON日志中,因此使用了layout自定义输出.
public class LoggingConsoleLayout extends LayoutBase{ @Override public String doLayout(ILoggingEvent event) { StringBuilder sbuf = new StringBuilder(); if (null != event && null != event.getMDCPropertyMap()) { sbuf.append("{"); sbuf.append("\"time\":\""); sbuf.append(System.currentTimeMillis()); sbuf.append("\","); sbuf.append("\"level\":\""); sbuf.append(event.getLevel()); sbuf.append("\","); sbuf.append("\"tag\":\""); sbuf.append(event.getMDCPropertyMap().get("tag")); sbuf.append("\","); sbuf.append("\"msg\":\""); sbuf.append(event.getFormattedMessage().replace("\"", "\\\"")); sbuf.append("\","); sbuf.append("\"source\":\"dialog\"} \n"); } return sbuf.toString(); }}
转载地址:http://kpcwo.baihongyu.com/