博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
logback自定义Appender和Layout
阅读量:6442 次
发布时间:2019-06-23

本文共 2712 字,大约阅读时间需要 9 分钟。

logback自定义Appender和Layout

@Date 2017.05.09

  • Appender是logback中最重要的组件之一,它委托encoder组件来完成LoggingEvent的格式化和记录,具体源码分析网上有很多, 本文主要是应用实践.
  • Layout组件来将LoggingEvent进行格式化,返回一个String,然后通过OutputStream.write()方法,把格式化之后的日志信息写到目的地.

继承RollingFileAppender,重写输出文件格式

  1. 场景

工程中期望输出到日志中的是JSON格式, 但是在业务中log.info(变量),此变量会有带引号的情况下, 会影响最终输出结构,因为重写file appender.

  1. logback.xml
-->
UTF-8
{"time":"${bySecond}","level":"%-5level","msg":"%msg"} %n
-->

%msg是logback输出的日志内容,此字符串如果本身带引号,则造成输出到日志文件里的JSON格式无法解析.

  1. 解决办法
  • 集成logback默认的RollingFileAppender,获取msg内容并做格式化替换
  • 在logback.xml中<appender class="替换自定义的Appender"/>
public class UserFileAppender extends RollingFileAppender
{ @Override protected void subAppend(ILoggingEvent event){ // 获取event中的message内容 event.getFormattedMessage().replace("\"","\\\""); start(); super.subAppend(event); }}

进阶:异步处理log.xxxx()日志

  1. 场景

当在程序中输出了一些日志,并期望对这些日志内容做特定处理(存储DB/解析发送消息等)

  1. 集成UnsynchronizedAppenderBase
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); } }}
  • 上述代码继承了UnsynchronizedAppenderBase,重写了append方法,里面可以根据event对象获取log中的内容和默认的系统提供的参数(level等),可以在此做各种业务逻辑, 此内容是异步操作,节省我们在工程上自己构建异步日志收集等工作量,适合小应用的场景.

Layout:自定义日志输出格式

  1. 场景

在上述场景中发现只输出msg还不够满足业务的需求,业务里有需要把MDC存储的上下文也加到输出的JSON日志中,因此使用了layout自定义输出.

  1. logback.xml
  1. Java
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(); }}
  • 利用自定义的encoder layout,输出程序中存在的各种变量,输出不同需求自定义的日志格式

转载地址:http://kpcwo.baihongyu.com/

你可能感兴趣的文章
mysql 主主配置
查看>>
SVN中对repo中的某一目录设置钩子
查看>>
nginx带宽资源调度脚本
查看>>
nginx中location配置
查看>>
Java Thread.join()详解
查看>>
MySQL 记一次 Bug发现过程
查看>>
.bash_profile和.bashrc的区别(如何设置生效)
查看>>
图像滤镜艺术---保留细节的磨皮滤镜之PS实现
查看>>
WSFC2016 多域部署模型
查看>>
Linux学习之CentOS(十五)--Linux常用命令之bc、man、shutdown...
查看>>
lamp组合详解
查看>>
HQL查询
查看>>
predictionIO E-Commerce Recommendation 买了又买-物相似
查看>>
UML2活动图应用案例操作
查看>>
mysql主从同步分库分表同步
查看>>
SQL查询及匹配条件
查看>>
mysql忘记密码
查看>>
string-toUpperCase、toLowerCase
查看>>
mysql基本使用
查看>>
Windows Server 2012版本介绍
查看>>