当前位置: 首页 > 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)测试效果

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

相关文章:

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

目录 &#xff08;1&#xff09;场景介绍 &#xff08;2&#xff09;定义转换器BizCallerConverter &#xff08;3&#xff09;logback配置conversionRule &#xff08;4&#xff09;测试效果 前文《logback之pattern详解以及源码分析》已经介绍了pattern&#xff0c;以及…...

【MySQL】发展起源与核心架构组件详细介绍

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《MySQL技术精粹》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、MySQL起源背景 2、MySQL发展里程 3、MySQL应用场景 二、MySQL的核心特…...

uni-app 多平台分享实现指南

uni-app 多平台分享实现指南 在移动应用开发中&#xff0c;分享功能是一个非常常见的需求&#xff0c;尤其是在社交媒体、营销活动等场景中。使用 uni-app 进行多平台开发时&#xff0c;可以通过一套代码实现跨平台的分享功能&#xff0c;涵盖微信小程序、H5、App 等多个平台。…...

Spring中的IOC是什么,优缺点有哪些?

目录 IOC的核心概念 IOC的优点 IOC的缺点 使用场景说明 总结 IOC&#xff08;控制反转&#xff09;是一种设计思想&#xff0c;用于实现低耦合、高内聚的软件架构。它通过将对象的创建和依赖管理交给外部容器来实现&#xff0c;从而减少对象之间的直接依赖关系。 IOC的核…...

Qt实现使用TCP与RS485串口设备通信————附带详细实践方法

文章目录 0 背景1 协议介绍1.1 modbusRTU协议1.1.1 简介1.1.2 RS485和modbusRTU的关系1.1.3 modbusRTU 协议格式1.1.3.1 0x10写多个保持寄存器1.1.3.2 0x02读多个离散输入寄存器1.1.3.3 0x03读多个保持寄存器1.1.3.4 0x04读多个输入寄存器 1.2 ModbusTCP协议1.2.1 ModbusTCP协议…...

js将object整个实体对象作为参数传递

①将object实体转化成json字符串传递&#xff1a; JSON.stringify(obj) ②将json字符串转化成JSON对象值&#xff1a;JSON.parse(json) 实际应用&#xff1a; <div id"div_notice" stylefont-size:14px; width:100%; height:200px; overflow-y:auto;></di…...

超越局部损失函数的预测-优化方法

1 文章信息 文章名为Leaving the Nest : Going Beyond Local Loss Functions for Predict-Then-Optimize。发表在第38届AAAI Conference on Artificial Intelligence. 作者来自哈佛大学。 2 摘要 预测-优化是一种利用机器学习在不确定性下进行决策的方法框架。其核心研究问…...

PDF预览插件

PDF预览插件 可用于当前页面弹窗形式查看,可增加一些自定义功能 pdf预览插件 代码块: pdfobject.js <div class="pdfwrap"><div class="item"><h3>笑场</h3><div class="tags"><p>李诞</p><i&…...

node.js之---CommonJS 模块

CommonJS概念 在 Node.js 中&#xff0c;CommonJS 是一种模块化规范&#xff0c;它定义了如何在 JavaScript 中创建和使用模块。CommonJS 是 Node.js 使用的默认模块系统。它让开发者能够分离代码&#xff0c;便于重用和维护。 CommonJS 模块的基本特性 模块导出 在 CommonJ…...

关于AI面试系统2025年趋势评估!

在快速发展的科技浪潮中&#xff0c;AI技术正以前所未有的速度渗透到各行各业。企业招聘领域&#xff0c;作为人才选拔的关键环节&#xff0c;也不例外地迎来了AI面试系统的广泛应用和持续创新。2025年&#xff0c;AI面试系统不仅成为企业招聘的主流工具&#xff0c;更在智能化…...

SQL—替换字符串—replace函数用法详解

SQL—替换字符串—replace函数用法详解 REPLACE() 函数——查找一个字符串中的指定子串&#xff0c;并将其替换为另一个子串。 REPLACE(str, old_substring, new_substring)str&#xff1a;要进行替换操作的原始字符串。old_substring&#xff1a;要被替换的子串。new_substri…...

《Vue3实战教程》40:Vue3安全

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 安全​ 报告漏洞​ 当一个漏洞被上报时&#xff0c;它会立刻成为我们最关心的问题&#xff0c;会有全职的贡献者暂时搁置其他所有任务来解决这个问题。如需报告漏洞&#xff0c;请发送电子邮件至 securityvuejs.org。…...

软件项目验收测试需进行哪些测试?软件检测机构分享验收测试作用

在信息技术高速发展的今天&#xff0c;软件项目的验收测试作为软件开发生命周期中至关重要的一环&#xff0c;扮演着不可或缺的角色。软件项目验收测试是在软件开发完成后&#xff0c;依据需求文档和设计规范&#xff0c;对软件系统进行的一项综合性测试。其主要目的是验证开发…...

css实现文字描边

效果 学习啦 -webkit-text-stroke-width&#xff1a; 设置文本描边的宽度&#xff0c;值可以是任何长度单位&#xff08;如 px, em, rem 等&#xff09; -webkit-text-stroke-color&#xff1a;设置文本描边的颜色&#xff0c;值可以是任何颜色值&#xff08;如 red, green, bl…...

(二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?

在上一篇文章中&#xff0c;我们通过二次函数的例子&#xff0c;讲解了如何训练人工智能。今天&#xff0c;让我们进一步探讨&#xff1a;面对不同的实际问题&#xff0c;应该如何选择合适的函数形式&#xff1f; 一、广告推荐系统中的函数选择 1. 业务目标 想象一下&#x…...

数据挖掘——回归算法

数据挖掘——回归算法 回归算法线性回归最小二乘法优化求解——梯度下降法逻辑回归逻辑回归函数逻辑回归参数估计逻辑回归正则化 决策树回归小结 回归算法 回归分析 如果把其中的一些因素&#xff08;房屋面积&#xff09;作为自变量&#xff0c;而另一些随自变量的变化而变化…...

AIGC与未来的通用人工智能(AGI):从生成内容到智能革命

目录 第一部分&#xff1a;AIGC概述 1.1 什么是生成式人工智能&#xff08;AIGC&#xff09; 1.2 AIGC的应用 第二部分&#xff1a;通用人工智能&#xff08;AGI&#xff09;概述 2.1 什么是通用人工智能&#xff08;AGI&#xff09; 2.2 AGI的关键特征 2.3 当前AGI的挑战 第…...

jQuery学习笔记3

jQuery 事件注册 jQuery 事件处理 <div></div><ul><li>我们都是好孩子</li><li>我们都是好孩子</li><li>我们都是好孩子</li><li>我们都是好孩子</li><li>我们都是好孩子</li></ul><o…...

SpringMVC(六)拦截器

目录 1.什么是拦截器 2.拦截器和过滤器有哪些区别 3.拦截器方法 4.单个拦截器的执行流程 5.使用拦截器实现用户登录权限验证&#xff08;实例&#xff09; 1.先在html目录下写一个login.html文件 2.在controller包下写一个LoginController文件 3.加拦截器 1.创建一个conf…...

单区域OSPF配置实验

1、绘制拓扑图 2、配置ip地址 R0 Router(config)#interface FastEthernet0/0 Router(config-if)#ip address 192.168.1.1 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#exit Router(config)#interface FastEthernet0/1 Router(config-if)#ip address 192.16…...

OpenClaw跨平台控制:Kimi-VL-A3B-Thinking远程执行多模态任务方案

OpenClaw跨平台控制&#xff1a;Kimi-VL-A3B-Thinking远程执行多模态任务方案 1. 为什么需要跨平台远程控制&#xff1f; 上周五晚上11点&#xff0c;我正躺在沙发上刷手机&#xff0c;突然想起有个紧急的竞品分析报告需要处理。电脑在书房&#xff0c;实在懒得起身。这时我意…...

龙虾白嫖指南,请查收~

故障表现 发现请求集群 demo 入口时卡住&#xff0c;并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...

Python无锁并发避坑手册(20年C Python核心贡献者亲授:从字节码级锁定到原子内存序的17个致命盲区)

第一章&#xff1a;Python无锁并发的本质与GIL真相Python常被误认为“天生支持多线程并发”&#xff0c;但其核心限制源于全局解释器锁&#xff08;Global Interpreter Lock, GIL&#xff09;。GIL并非语言规范&#xff0c;而是CPython解释器为内存管理安全而引入的互斥机制——…...

AI 模型推理中的延迟分析与测试

AI 模型推理中的延迟分析与测试 在人工智能技术快速发展的今天&#xff0c;AI 模型的推理性能成为影响实际应用效果的关键因素之一。无论是智能语音助手、自动驾驶&#xff0c;还是实时推荐系统&#xff0c;延迟的高低直接决定了用户体验的好坏。对 AI 模型推理的延迟进行分析…...

AI编码狂飙,安全防线告急:运行时测试如何守住软件安全的生死线

2026年初&#xff0c;国内某头部电商平台爆发大规模用户数据泄露事件&#xff0c;溯源结果震惊整个行业&#xff1a;事件根源并非黑客的0day漏洞攻击&#xff0c;而是开发团队通过AI编码工具生成的一段会员权限校验代码。这段代码在语法层面完全合规&#xff0c;静态安全扫描全…...

Ostrakon-VL-8B环境配置:Ubuntu 22.04 + CUDA 12.1 + PyTorch 2.3 验证清单

Ostrakon-VL-8B环境配置&#xff1a;Ubuntu 22.04 CUDA 12.1 PyTorch 2.3 验证清单 想快速在Ubuntu系统上跑通Ostrakon-VL-8B这个强大的视觉理解模型&#xff0c;但被各种环境依赖搞得头大&#xff1f;别担心&#xff0c;这份清单就是为你准备的。 Ostrakon-VL-8B是一个专门…...

WandEnhancer终极指南:WeMod本地增强与功能解锁的完整实践

WandEnhancer终极指南&#xff1a;WeMod本地增强与功能解锁的完整实践 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer WandEnhancer是一款专为WeMod客户…...

攻克模电难点(一):多级放大电路与差动放大电路实战解析

1. 多级放大电路的设计基础 第一次接触多级放大电路时&#xff0c;我被各种耦合方式绕得头晕。直到在实验室烧坏几个三极管后&#xff0c;才真正理解其中的门道。多级放大电路的核心思想很简单&#xff1a;把多个单级放大电路像搭积木一样连接起来&#xff0c;但实际设计时却要…...

javaweb蔚来新能源汽车对比推荐平台设计与实现

目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计技术实现方案数据安全措施扩展功能设计项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块设计 用户管理模块 实现用户注…...

Libsvm 编译mex不同平台兼容性问题 Application not supported on glnxa64 due to platform dependencies. Intended pl

matlab线上算法执行报错&#xff1a;Application not supported on glnxa64 due to platform dependencies. Intended platforms include: win64 排查后发现是使用了libsvm-3.3, 而libsvm编译的时候是基于win64编译的导致出现此bug.(因为libsvm的开源代码不是matlab&#xff0…...