当前位置: 首页 > 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.lryc.cn/news/514171.html

相关文章:

  • 【MySQL】发展起源与核心架构组件详细介绍
  • uni-app 多平台分享实现指南
  • Spring中的IOC是什么,优缺点有哪些?
  • Qt实现使用TCP与RS485串口设备通信————附带详细实践方法
  • js将object整个实体对象作为参数传递
  • 超越局部损失函数的预测-优化方法
  • PDF预览插件
  • node.js之---CommonJS 模块
  • 关于AI面试系统2025年趋势评估!
  • SQL—替换字符串—replace函数用法详解
  • 《Vue3实战教程》40:Vue3安全
  • 软件项目验收测试需进行哪些测试?软件检测机构分享验收测试作用
  • css实现文字描边
  • (二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?
  • 数据挖掘——回归算法
  • AIGC与未来的通用人工智能(AGI):从生成内容到智能革命
  • jQuery学习笔记3
  • SpringMVC(六)拦截器
  • 单区域OSPF配置实验
  • Linux上vi(vim)编辑器使用教程
  • 虚拟机图像界面打不开了
  • 《经典力学》笔记
  • 【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站
  • 计算机的错误计算(一百九十九)
  • 【AI日记】25.01.02 kaggle 比赛 3-1
  • el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)
  • Ps:将数据组作为文件导出
  • nohup.out日志
  • 01 背包
  • QT-------------多线程