skywalking上报请求参数及日志打印traceId

在这里插入图片描述

前言

我们通过skywalking来查看我们应用的性能,有时看到哪个请求较慢时,我们想看下请求参数。有时候需要打印traceId到我们的日志中,通过elk根绝traceId查询日志详情,面对着这两场景,记录下解决方案。

上报请求参数给sky

引入pom

		<dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>${skywalking.version}</version>
        </dependency>

做一层filter,拦截请求,上报一个tracespan,至于怎样拦截post请求,可以查看我之前的博客。

@Slf4j
@WebFilter(filterName = "requestWrapperFilter", urlPatterns = "/*")
public class RequestFilter implements Filter {

    public static final String TRACE_ID = "trace";
    public static final String SPAN_ID = "span";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    /**
     * 初始化请求链路信息:唯一key,日志初始化,body包装防止获取日志打印时后续不能继续使用
     */
    @Override
    @Trace(operationName = "requestWrapperFilter")
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        String contextString = ((HttpServletRequest) request).getHeader(ProjectContext.CONTEXT_KEY);
        if (Objects.nonNull(contextString)) {
            ProjectContext.fromString(contextString);
        } else {
            // 无内容时,也自动初始化
            ProjectContext.initContext();
        }
        initLog();

        CustomHttpServletRequestWrapper requestWrapper = new CustomHttpServletRequestWrapper(
            (HttpServletRequest) request);
        String uri = requestWrapper.getRequestURI();
        String remoteAddr = requestWrapper.getRemoteAddr();
        String method = requestWrapper.getMethod();

        String requestStr;

        if (method.equals(RequestMethod.GET.name())) {
            requestStr = GsonUtil.toJson(requestWrapper.getParameterMap());
        } else {
            requestStr = requestWrapper.getBody();
        }
        ActiveSpan.tag("request", requestStr);
        log.info(
            "url:{} , method:{}, clientIp:{}, params:{}", uri, method, remoteAddr, requestStr);
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }

    public static void initLog() {
        MDC.put(TRACE_ID, ProjectContext.getContext().getTraceId());
        MDC.put(SPAN_ID, ProjectContext.getContext().getSpanId());
    }
}

配置sky的agent,启动项目访问。再次查看sky的面板。

-javaagent:C://apache-skywalking-apm-6.5.0//apache-skywalking-apm-bin//agent//skywalking-agent.jar -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.56.121:11800 -DSW_AGENT_NAME=spring-common-web

在这里插入图片描述

打印sky的traceId

  • 引入pom
		<dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>${skywalking.version}</version>
        </dependency>

修改logback文件


<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern>
            </layout>
        </encoder>

再次查看日志输入可以看到

在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值