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信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤下载SkyWalking码: 1. 在IDEA中点击"Import Project",选择SkyWalking码目录导入IDEA中。这将是一个Maven项目,导入过程中会下载相关的依赖jar包,可能需要一些时间,请耐心等待。\[1\] 2. 修改demo-provider和demo-webapp模块的VM options参数,将其中-javaagent命令指向的skywalking-agent.jar路径更改为SkyWalking码项目中的skywalking-agent.jar。具体路径可以参考引用\[2\]中的说明。\[2\] 3. 下载码并导入IDEA。你可以从SkyWalking的官方网站或GitHub仓库下载最新的码。然后在IDEA中选择"Open"或"Import Project",导入下载的码。\[3\] 希望这些步骤对你有帮助! #### 引用[.reference_title] - *1* *2* [第08讲:搭建 SkyWalking 码环境,开启征途](https://blog.csdn.net/Marion158/article/details/129421989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Sky Walking 介绍 及 8.7.0 码学习环境搭建](https://blog.csdn.net/qq_33471737/article/details/120249492)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值