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>
复制代码

效果请见:点击跳转

posted @   意犹未尽  阅读(268)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2018-12-08 Spring Cloud-hystrix(六)
点击右上角即可分享
微信分享提示