skywalking源码分析第二十四篇一扩展篇:日志打印

日志配置与效果

  • 通过配置实现日志输出traceid
  • 这是个非常实用的功能,根据traceid可以从海量日志中快速查询指定请求日志
-  log4j2.xml 增加 [%traceId]
    <properties>
        <property name="logHome">${loggingRoot}</property>
        <property name="logLevel">${loggingLevel}</property>
        <property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%-5t] [%traceId] [%pressureFlag] [%c{5}:%L] %m%n
        </property>
    </properties>

在这里插入图片描述

源码分析一工具类

  • 该模块主要与其他框架集成
    在这里插入图片描述
  • 按照log4j2规范定义配置文件中traceId的输出
  • 默认将traceId替换输出为TID: N/A
@Plugin(name = "TraceIdConverter", category = "Converter")
@ConverterKeys({"traceId"})
public class TraceIdConverter extends LogEventPatternConverter {

    /**
     * Constructs an instance of LoggingEventPatternConverter.
     *
     * @param name name of converter.
     * @param style CSS style for output.
     */
    protected TraceIdConverter(String name, String style) {
        super(name, style);
    }

    public static TraceIdConverter newInstance(String[] options) {
        return new TraceIdConverter("traceId", "traceId");
    }

    @Override
    public void format(LogEvent event, StringBuilder toAppendTo) {
        Log4j2OutputAppender.append(toAppendTo);
    }
}

public class Log4j2OutputAppender {
    /**
     * As default, append "TID: N/A" to the output message,
     * if sky-walking agent in active mode, append the real traceId in the recent Context, if existed, or empty String.
     *
     * @param toAppendTo origin output message.
     */
    public static void append(StringBuilder toAppendTo) {
        toAppendTo.append("TID: N/A");
    }
}

源码分析一工具类增强

  • 该模块主要是定义skywalking插件对apm-application-toolkit模块进行增强
    在这里插入图片描述

插件定义

  • 拦截了上述工具包TraceIdConverter.format方法
  • 也就是说原本输出TID: N/A现在改由插件处理
public class TraceIdConverterActivation extends ClassInstanceMethodsEnhancePluginDefine {

    private static final String INTERCEPT_CLASS = "org.apache.skywalking.apm.toolkit.activation.log.log4j.v2.x.TraceIdConverterMethodInterceptor";
    private static final String ENHANCE_CLASS = "org.apache.skywalking.apm.toolkit.log.log4j.v2.x.TraceIdConverter";
    private static final String ENHANCE_METHOD = "format";

    @Override
    public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
        return new ConstructorInterceptPoint[0];
    }

    @Override
    public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
        return new InstanceMethodsInterceptPoint[]{
            new InstanceMethodsInterceptPoint() {
                @Override
                public ElementMatcher<MethodDescription> getMethodsMatcher() {

                    return named(ENHANCE_METHOD);
                }

                @Override
                public String getMethodsInterceptor() {
                    return INTERCEPT_CLASS;
                }

                @Override
                public boolean isOverrideArgs() {
                    return false;
                }
            }
        };
    }

    @Override
    protected ClassMatch enhanceClass() {
        return byName(ENHANCE_CLASS);
    }
}

拦截器一traceId处理

  • 拦截原方法执行
  • StringBuilder原本添加TID: N/A现在改为添加tid
  • defineReturnValue同时不在执行原方法
  • 从而实现日志输出traceid
public class TraceIdConverterMethodInterceptor implements InstanceMethodsAroundInterceptor {


    @Override
    public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
                             MethodInterceptResult result) throws Throwable {
        String tid = "";

        //Async Thread, where ContextManager is not active
        if (!ContextManager.isActive() && allArguments[0] instanceof EnhancedInstance) {
            tid = (String) ((EnhancedInstance) allArguments[0]).getSkyWalkingDynamicField();
            if (tid == null) {
                tid = "N/A";
            }
        } else {
            // 存在链路信息 tid设置traceid
            tid = ContextManager.getGlobalTraceId();
        }
        // StringBuilder加上traceid stringbuffer会被外部方法写入文件
        ((StringBuilder) allArguments[1]).append("TID: ").append(tid);
        // 原方法不在执行
        result.defineReturnValue(null);
    }
}

总结

  • 除去日志外,apm-application-toolkit配合apm-toolkit-activation还实现了@Trace注解等功能
  • 在业务方法添加一个@Trace注解,就可以实现skywalking-ui查看相关span信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值