当前位置: 首页 > news >正文

logback之自定义pattern使用的转换器

目录

(1)场景介绍

(2)定义转换器BizCallerConverter 

(3)logback配置conversionRule

(4)测试效果


前文《logback之pattern详解以及源码分析》已经介绍了pattern,以及通过相应的源码分析了pattern关联的转换器如何进行日志转换,也说道了可以自行定义转换器,实现自己的需求。本篇就介绍一下如何自定义转换器:

(1)场景介绍

首先有这么一个场景:我定义了一个ImpossibleLogger,用于在比较复杂的场景(通常涉及并发),不可能执行的地方进行日志打印,并且单独记录日志。这样如果这个日志文件不为空,说明程序可能偏离我们的设想,需要排查。

public final class ImpossibleLogger {private static final Logger LOGGER = LoggerFactory.getLogger("impossible");public static void warn(String message) {LOGGER.warn(message);}public static void warn(String message, Throwable t) {LOGGER.warn(message, t);}public static void warn(Marker marker, String message) {LOGGER.warn(marker, message);}public static void warn(Marker marker, String message, Throwable t) {LOGGER.warn(marker, message, t);}
}

因为包装了一层,那么如果使用%class %m打印调用类以及方法,那么只会是ImpossibleLogger以及对应的warn,无法实际区分业务调用类。所以我们想实现自己的转换器,把实际的业务调用类打印出来。

(2)定义转换器BizCallerConverter 

我们模仿%m对应的转换器MethodOfCallerConverter,继承NamedConverter

package com.mall.common.log;import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.CallerData;
import ch.qos.logback.classic.spi.ILoggingEvent;/*** @author Lft* @since 2024/12/28 19:06*/
public class BizCallerConverter extends ClassicConverter {public String convert(ILoggingEvent event) {StackTraceElement[] cda = event.getCallerData();if (cda != null && cda.length > 1) {return cda[1].getClassName() + "." + cda[1].getMethodName();} else {return CallerData.NA;}}
}

(3)logback配置conversionRule

完整配置如下:

<configuration><conversionRule conversionWord="bizCaller"converterClass="com.mall.common.log.BizCallerConverter"></conversionRule><conversionRule conversionWord="biz" converterClass="com.mall.common.log.BizCallerConverter"></conversionRule><!-- Appenders --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/logback.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>logs/logback.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 --></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="impossible" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/impossible.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>impossible.%i.log.zip</fileNamePattern><minIndex>1</minIndex><maxIndex>3</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>5MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} %biz - %msg%n</pattern></encoder></appender><logger name="impossible" level="warn" addtivity="false"><appender-ref ref="impossible"/></logger><!-- Root Logger --><root level="Info"><appender-ref ref="CONSOLE"/><appender-ref ref="ROLLING"/></root>
</configuration>

conversionWord:这个是关键字,在pattern中使用

converterClass:关键字对应转换器类

(4)测试效果

简单调用,执行效果如下:转换器成功将上一层的调用打印出来了


http://www.mrgr.cn/news/81973.html

相关文章:

  • 《计算机网络A》单选题-复习题库解析-2
  • vscode 多项目冲突:进行 vscode 工作区配置
  • WebRTC的三大线程
  • v3.0.8- 「S+会员」新增专属运动秀,试试新穿搭吧- 与「好友」
  • STM32高级 物联网之Wi-Fi通讯
  • PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架
  • jetbrains HTTPS 请求与响应流量分析报告【二】
  • vuex - 第一天
  • apifox
  • 搭建ORB-SLAM3编译环境
  • GDPU Vue前端框架开发 期末赛道出勇士篇(更新ing)
  • GXUOJ-算法-第二次作业(矩阵连乘、最长公共子序列、0-1背包问题、带权区间调度)
  • fpga系列 HDL:ModelSim显示模拟波形+十进制格式数值(临时方法和设置持久化的默认值)
  • Unity中列表List使用出类似字典Dictionary的感觉
  • UE5材质节点Panner
  • Elasticsearch:analyzer(分析器)
  • 工业大数据分析算法实战-day19
  • 学习笔记 --C#基础其他知识点(同步和异步)
  • Hugging Face Dataset的 dataset_info.json 文件详解
  • LoRA微调系列笔记
  • jpeg学习
  • Go语言入门
  • mac系统vsCode中使用Better Comments在.vue文件里失效
  • (一)人工智能其实可以看成是一个函数
  • SOME/IP 协议详解——信息格式
  • Llama系列关键知识总结