logback源码阅读-根据源码学扩展点(七)
自定义appender
源码:点击跳转
1.xml定义
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--定义变量下面会使用到--> <property name="CHARSET" value="UTF-8"/>
<!--定义appender--> <appender name="dbAppender" class="cn.wine.ms.promotion.logTest.DBAppender"> <Encoder> <pattern>%p|%d{yyyy-MM-dd HH:mm:ss.SSS}|%t|%logger{10}:%line%n %m%n%n</pattern> <charset>${CHARSET}</charset> </Encoder> </appender> <!--与logger产生关联 详见源码<点击跳转>--> <root level="INFO"> <appender-ref ref="dbAppender" /> </root> </configuration>
2.实现类
注dbAppender其实logback有实现 这里只是举例具体类可见:ch.qos.logback.classic.db.DBAppender
@Slf4j public class DBAppender extends OutputStreamAppender<ILoggingEvent> { /** * 可以做一些初始化操作 */ @Override public void start() {
//我们设置自定义outputStream 详见源码<5>处 this.setOutputStream(new DBOutPutStream()); super.start(); } @Override protected void append(ILoggingEvent eventObject) { super.append(eventObject); } public static class DBOutPutStream extends OutputStream{ //不用实现 下面重写了父类的方法已经拦截 public void write(int b) throws IOException { } public void write(byte[] b) throws IOException { if(b==null){ return; } String message=new String(b); System.out.println(message); //插入db } } }
但是比如我们需要异步怎么办,logback提供了实现如只需要配置详见源码<点击跳转>- AsyncAppender 注意队列大小可配置 默认是256 源码处:点击跳转
自定义输出格式
<appender name="dbAppender" class="cn.wine.ms.promotion.logTest.DBAppender"> <Encoder> <pattern>%p|%d{yyyy-MM-dd HH:mm:ss.SSS}|%t|%logger{10}:%line%n %m%n%n</pattern> <charset>${CHARSET}</charset> </Encoder> </appender>
标红部分都是logback定义好的 可选的有 源码处:点击跳转
比如我们增加一个traceId用于链路追踪
1.定义convert实现类
@Slf4j public class ThreadSharingIdGeneratorMessageConvert extends ClassicConverter { ThreadSharingIdGenerator threadSharingIdGenerator = new LogTraceIdGenerator(); @Override public String convert(ILoggingEvent iLoggingEvent) { if (iLoggingEvent instanceof LoggingEvent) { LoggingEvent event = (LoggingEvent) iLoggingEvent; Map<String, String> stringStringMap = event.getLoggerContextVO().getPropertyMap(); String traceId = stringStringMap.get("traceId"); if (!StringUtil.isNullOrEmpty(traceId)) { return String.format("追溯码:%s",traceId); } } if(!StringUtil.isNullOrEmpty(ArmsUtils.getTraceId())) { //如果接入了arms的情况下使用Arms的 内部会判断有没有没有则使用线程共享 return String.format("[追溯码:%s]", ArmsUtils.getTraceId()); } return ""; } }
2.xml配置
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--定义变量下面会使用到--> <property name="CHARSET" value="UTF-8"/>
<!--自定义格式--> <conversionRule conversionWord="tradeId" converterClass="cn.wine.ms.common.armslog.ThreadSharingIdGeneratorMessageConvert" /> <appender name="dbAppender" class="cn.wine.ms.promotion.logTest.DBAppender"> <Encoder> <pattern>%tradeId|%p|%d{yyyy-MM-dd HH:mm:ss.SSS}|%t|%logger{10}:%line%n %m%n%n</pattern> <charset>${CHARSET}</charset> </Encoder> </appender> <root level="INFO"> <appender-ref ref="dbAppender" /> </root> </configuration>
效果请见:点击跳转
标签:
logback源码阅读
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2018-12-08 Spring Cloud-hystrix(六)