SpringCloudGateway使用Skywalking时日志打印traceId

这篇具有很好参考价值的文章主要介绍了SpringCloudGateway使用Skywalking时日志打印traceId。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前置信息

Skywalking oap 与 agent部署
https://blog.csdn.net/kismet2399/article/details/131560171

环境配置

  • spring-cloud-starter-gateway:3.1.4
  • Skywalking Agent:8.14.0

背景

SpringCloudGateway集成Skywalking后无法打印traceId

解决方式

目前没有找到logback的解决方式,所以日志打印改用log4j2

  • mvn添加配置
   <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-log4j-2.x</artifactId>
            <version>8.14.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.14.0</version>
        </dependency>
          <!--解决log4j2依赖问题-->
         <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.4</version>
        </dependency>
  • 让日志获取到traceId
import org.springframework.stereotype.Component;
import reactor.core.publisher.Hooks;
import reactor.core.publisher.Operators;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @author kismet
 */
@Component
public class LogHooks {

    private static final String KEY = "logMdc";

    @PostConstruct
    public void setHook() {
        Hooks.onEachOperator(KEY,
                Operators.lift((scannable, coreSubscriber) -> new MdcSubscriber(coreSubscriber)));
    }

    @PreDestroy
    public void resetHook() {
        Hooks.resetOnEachOperator(KEY);
    }

}

import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.common.utils.JacksonUtils;
import org.jboss.logging.MDC;
import org.reactivestreams.Subscription;
import reactor.core.CoreSubscriber;
import reactor.util.context.Context;

import java.lang.reflect.Field;
import java.util.Optional;

/**
 * @author zuozhuan
 */
public class MdcSubscriber implements CoreSubscriber {

    private static final String TRACE_ID = "traceId";

    private static final String SKYWALKING_CTX_SNAPSHOT = "SKYWALKING_CONTEXT_SNAPSHOT";

    private final CoreSubscriber<Object> actual;

    public MdcSubscriber(CoreSubscriber<Object> actual) {
        this.actual = actual;
    }

    @Override
    public void onSubscribe(Subscription s) {
        actual.onSubscribe(s);
    }

    @Override
    public void onNext(Object o) {
        Context c = actual.currentContext();
        Optional<String> traceIdOptional = Optional.empty();
        if (!c.isEmpty() && c.hasKey(SKYWALKING_CTX_SNAPSHOT)) {
            Object object = c.get(SKYWALKING_CTX_SNAPSHOT);
            Object traceId = findField(object, "traceId");
            String ids = JacksonUtils.toJson(traceId);
            traceIdOptional = Optional.ofNullable(ids)
                    .map(JSON::parseObject)
                    .map(t -> t.get("id"))
                    .map(Object::toString);
        }

        MDC.put(TRACE_ID, traceIdOptional.orElse("N/A"));
        actual.onNext(o);
    }

    private static Object findField(Object object, String field) {
        if (object == null) {
            return null;
        }
        try {
            Class<?> aClass = object.getClass();

            Field mValuesField = null;
            mValuesField = aClass.getDeclaredField(field);
            // 3、打开访问权限
            mValuesField.setAccessible(true);
            // 4、获取 memberValuesMap
            return mValuesField.get(object);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void onError(Throwable throwable) {
        actual.onError(throwable);
    }

    @Override
    public void onComplete() {
        actual.onComplete();
    }

    @Override
    public Context currentContext() {
        return actual.currentContext();
    }
  • 插件添加
    将skywalking-agent下optional-plugins中的apm-spring-cloud-gateway-3.x-plugin-8.14.0.jar和apm-spring-webflux-5.x-plugin-8.14.0.jar移动到plugins下

  • log4j2.xml配置示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [TID:%equals{%X{traceId}}{}{N/A}] [%thread] %-5level %logger{20}  %msg%n"/>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN}"/>
        </Console>
        <Async name="Async">
            <AppenderRef ref="Console"/>
        </Async>
        <!--输出到日志文件,滚动分割日志文件,自动打包gz -->
        <RollingFile name="INFO_FILE" fileName="${env:HOME}/logs/gateway/gateway.log" filePattern="${env:HOME}/logs/gateway/gateway-%d{yyyyMMdd}.log.%i">
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <!--默认一天一个文件 -->
                <TimeBasedTriggeringPolicy />
                <!--一天内大于size就单独分隔-->
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
        </RollingFile>
        <!--skywalking 日志收集 -->
        <GRPCLogClientAppender name="APM_LOG">
            <PatternLayout pattern="${PATTERN}"/>
        </GRPCLogClientAppender>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console">
                <Filters>
                    <PropertyFilter key="spring.profiles.active" value="dev" onMatch="ACCEPT" onMismatch="DENY" />
                </Filters>
            </AppenderRef>
            <AppenderRef ref="INFO_FILE"/>
            <AppenderRef ref="APM_LOG"/>
        </Root>
    </Loggers>
</Configuration>

  • 如果使用skywalking 日志收集启动参数需添加启动参数
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

参考链接:
https://www.jianshu.com/p/40727a0b9604
https://skywalking.apache.org/docs/skywalking-java/v8.14.0/en/setup/service-agent/java-agent/application-toolkit-log4j-2.x/文章来源地址https://www.toymoban.com/news/detail-544509.html

到了这里,关于SpringCloudGateway使用Skywalking时日志打印traceId的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud【SkyWalking日志、SkyWalking告警 、Skywalking自定义告警规则】(十五)

      目录 分布式请求链路追踪_SkyWalking日志 分布式请求链路追踪_SkyWalking告警 

    2024年02月14日
    浏览(39)
  • 鸿蒙开发,使用http返回的响应数据无法正常获取 ,利用hilog打印日志一直结果是object或者代码凭空消失,根本没有打印日志(灵异事件???)

    这里简述项目相关背景:前后端分离项目,使用鸿蒙做前端,后端SpringBoot写好接口(通过商品分类id查询商品列表),鸿蒙前端页面使用Tabs组件导航,展示商品分类,点击分类标签,查询后端接口,返回对应分类商品列表数据 项目场景:鸿蒙开发,使用http返回的响应数据无

    2024年04月27日
    浏览(42)
  • SkyWalking 日志收集

    在k8s环境已经部署了SkyWalking 的 oap 和 ui,本地的java应用接入SkyWalking时,想要将控制台的 日志信息展示 到 UI 界面 预期效果: 参考官方文档: https://skywalking.apache.org/docs/skywalking-java/v8.14.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/ 参考文章: https://blog.csdn.net/hxy793518971/

    2024年02月15日
    浏览(33)
  • skywalking日志收集

    在上一篇文章skywalking全链路追踪中我们介绍了在微服务项目中使用skywalking进行服务调用链路的追踪。 本文在全链路追踪的基础上,我们介绍如何使用skywalking对一次调用链路上进行 日志收集 。 skywalking日志收集方式有两种: 从 日志文件 中收集 在微服务项目中,每一个微服

    2024年02月14日
    浏览(26)
  • Flink使用log4j.properties不打印日志问题

    日志配置文件选择使用log4j.properties flink程序不打印日志。 问题原因         日志依赖包冲突 解决办法         将lib目录下的log4j2依赖移除,如下:         log4j-1.2-api-2.12.1.jar         log4j-api-2.12.1.jar         log4j-core-2.12.1.jar         log4j-slf4j-impl-2.12.

    2024年02月09日
    浏览(46)
  • java项目使用log4jdbc打印sql日志

    场景: 项目开发中,为了方便调试和排查问题,需要打印sql日志,并且显示sql中占位符所代表的参数; 第一种:如果只需简单打印sql日志【一般使用】 第二种:需要打印详细的sql日志【建议使用】 第一步:导入maven依赖 第二步:修改yml配置文件 第三步:启动项目后执行s

    2024年02月12日
    浏览(42)
  • SkyWalking+ElasticSearch7实现日志追踪

    国内es下载地址 修改elasticsearch-env ,elasticsearch7 先去获取本地的jdk 如果jdk 环境不存在则会使用 elasticsearch-7.8.0/jdk 下的jdk ,因为小编本地jdk版本为1.8 运行时会报错 future versions of Elasticsearch will require Java 11; your Java version from [/data/jdk1.8.0_111/jre] does not meet this requirement 因此我们

    2024年02月06日
    浏览(39)
  • springboot日志使用 SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

    还是直接上代码 @Slf4j 这玩意 默认支持 不用引入 yml 配置文件 下面分享 xml 方式 在 资源目录下创建 logback-spring.xml 粘贴走 即可 重启 看控制台变化 还有磁盘 有没有写入 坑 : 我在创建的时候 发现 xml 没有生效 排查了半天 发现 在创建 logback-spring.xml 这个文件的时候 我不是手

    2024年04月22日
    浏览(80)
  • 23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件

    就是springboot的默认的日志依赖实现。创建项目的时候存在这个依赖里面。 下面的日志实现就是基于 SLF4J+Logback SLF4J+Logback:SLF4J是门面,Logback是实现 设置日志的级别,可通过以下方式: ▲ 改变Spring Boot的核心日志级别 ▲ 改变程序组件(包括所有各种框架)的核心日志级别

    2024年02月03日
    浏览(61)
  • skywalking日志落到es字段timestamp不为date问题解决

    在通过skywalking将日志收集到es后,由于skywalking收集的日志(skywalking_log索引)没有date类型的字段导致在es上再索引模式中没有时间范围的查询。 skywalking收集的日志有时间戳字段timestamp,只是默认为long类型 于是我们可以通过提前定义字段类型为data来解决这个问题 以下解决方案

    2024年02月15日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包