【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上

【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上

1.下载SkyWalking APM

https://skywalking.apache.org/downloads/

jdk8 不支持 SkyWalking APM 9.3.0以上版本,所以这里我们下载 9.3.0版本

在这里插入图片描述

在这里插入图片描述

2.下载 Java Agent

https://skywalking.apache.org/downloads/

Java Agent 我们现在最新版本的 9.2.0

在这里插入图片描述

3.启动 SkyWalking APM 服务

3.1 windows环境

3.1.1 解压apache-skywalking-apm-9.3.0.tar.gz
3.1.2 进入解压后的bin目录,点击 startup.bat 启动SkyWalking APM服务

在这里插入图片描述

3.1.3 访问 http://127.0.0.1:8080/

如果访问出现空白页面,等待1分钟左右

在这里插入图片描述

3.2 linux环境

3.2.1 上传apache-skywalking-apm-9.3.0.tar.gz到服务器并解压
tar -zxvf apache-skywalking-apm-9.3.0.tar.gz
3.2.2 开放端口 8080,11800,12800
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=11800/tcp --permanent
firewall-cmd --zone=public --add-port=12800/tcp --permanent

##  开放或者关闭,需要刷新防火墙规则
firewall-cmd --reload
3.2.3 启动SkyWalking APM,进入解压后的bin目录
sh startup.sh

在这里插入图片描述

3.2.4 访问 http://IP:8080/

如果访问出现空白页面,等待1分钟左右

在这里插入图片描述

4.SpringBoot项目中引入以下依赖

        <!-- lombok ↓ -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- lombok ↑ -->

        <!-- hutool ↓ -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.28</version>
        </dependency>
        <!-- hutool ↑ -->
        <!-- aspectjrt 切面编程 ↓ -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <!-- aspectjrt 切面编程 ↑ -->

        <!-- skywalking-trace skyWalking监控相关 ↓ -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>9.1.0</version>
        </dependency>
        <!-- skywalking-trace ↑ -->

        <!-- skywalking-logback skyWalking中的traceId记录到logback日志 ↓ -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>9.1.0</version>
        </dependency>
        <!-- skywalking-logback ↑ -->

4.1 resources文件夹下创建 logback-spring.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 读取application.yml中的日志配置 -->
    <springProperty scope="context" name="LOG_PATH" source="logging.file.path"/>
    <springProperty scope="context" name="LOG_NAME" source="logging.file.log-name"/>
    <springProperty scope="context" name="MAX_HISTORY" source="logging.file.days"/>

    <!-- 定义控制台输出格式 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{50} - %msg%n</pattern>
            </layout>
        </encoder>
    </appender>

    <!--skywalking grpc 日志收集-->
    <appender name="SKYWALKING" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{50} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 定义每天生成一个日志文件,并归档生成压缩包 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./${LOG_NAME}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天生成一个日志文件 -->
            <fileNamePattern>${LOG_PATH}/${LOG_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 最多保留指定天数的日志文件 -->
            <maxHistory>${MAX_HISTORY}</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{50} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 日志级别设置 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="SKYWALKING"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

4.2 application.yml 文件中增加

# 日志配置
logging:
  file:
    # 日志生成的目录
    path: ./log
    # 日志文件名称
    log-name: log
    # 日志文件保留天数
    days: 3
  level:
    ROOT: info
    # com.xhs 包名称  
    com.xhs: info

4.2 定义 接口日志切面

package com.xhs.aspect;

import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.ActiveSpan;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.ServletRequest;

/**
 * @desc: 接口日志切面,目的是将接口的入参、出参、异常等信息上报到SkyWalking链路追踪服务器上,以便我们进行日志分析
 * @projectName: spring-boot-skywalking
 * @author: xhs
 * @date: 2024-06-17 017 10:24
 * @version: JDK 1.8
 */

@Slf4j
@Aspect
@Component
public class ControllerLogAspect {

    public static final String BIG_STR_SUB_PATTERN = "(:s*\"[^,\":]{8192,}?\")";

    /**
     * API的切点,拦截所有controller
     */
    @Pointcut("execution(public * com.xhs.controller.*.*(..))")
    public void apiPointcut() {
    }

    /**
     * 在方法执行前进行参数判断、在方法执行后记录日志
     *
     * @param joinPoint 入参
     */
    @Around("apiPointcut()")
    public Object executeFaceAspect(ProceedingJoinPoint joinPoint) throws Throwable {
        Object returnObj = null;
        Object[] parameters = joinPoint.getArgs();
        try {
            returnObj = joinPoint.proceed();
        } catch (Exception e) {
            log.error("SkyWalking aspect catch exception {}", TraceContext.traceId(), e);
            ActiveSpan.tag("异常", ExceptionUtil.getRootCauseMessage(e));
            throw e;
        } finally {
            if (parameters != null && parameters.length > 0) {
                for (int i = 0; i < parameters.length; i++) {
                    try {
                        Object nowObj = parameters[i];
                        if (nowObj instanceof ServletRequest) {
                            continue;
                        }
                        ActiveSpan.tag("入参" + i, replaceLog(JSON.toJSONString(nowObj)));
                    } catch (Exception ignore) {

                    }
                }
            }

            if (returnObj != null) {
                try {
                    ActiveSpan.tag("出参", replaceLog(JSON.toJSONString(returnObj)));
                } catch (Exception ignore) {

                }
            }
        }
        return returnObj;
    }

    /*
     * 格式化日志
     *
     * @param logStr 入参
     * @return String
     */
    public static String replaceLog(String logStr) {
        if (StringUtils.hasLength(logStr)) {
            return logStr.replaceAll(BIG_STR_SUB_PATTERN, ":\"*\"");
        }
        return StrUtil.EMPTY;
    }
}

4.3 创建测试接口,并添加jvm参数启动

# D:\soft-ware\skywalking-agent\skywalking-agent.jar 解压apache-skywalking-java-agent-9.2.0.tgz 后的skywalking-agent.jar jar包的地址
-javaagent:D:\soft-ware\skywalking-agent\skywalking-agent.jar
# xhs1.0: skywalking 服务的 service groups 名称
# spring-boot-skywalking:service names 名称
-Dskywalking.agent.service_name=xhs1.0::spring-boot-skywalking
# 127.0.0.1 skywalking apm 服务地址
-Dskywalking.collector.backend_service=127.0.0.1:11800

linux环境下需要把 apache-skywalking-java-agent-9.2.0.tgz上传到服务器解压,然后在启动命令后面加上上面的三个参数

#!/bin/bash

# jar包名称
JAR_FILE="spring-boot-skywalking.jar"
# pid 名称
PID_FILE="spring-boot-skywalking.pid"
# skywalking-agent jar包地址
SKYWALKING_AGENT_URL="/root/skywalking-agent/skywalking-agent.jar"
# skywalking SERVICE_NAME
SKYWALKING_SERVICE_NAME="xhs1.0::spring-boot-skywalking"
# skywalking SERVICE_NAME
SKYWALKING_BACKEND_SERVICE="127.0.0.1:11800"

start() {
    if [ -f "$PID_FILE" ]; then
        echo "应用程序已在运行,PID: $(cat $PID_FILE) .........."
    else
        # 后台启动jar包,并将启动日志输出到log.log文件中
        nohup java -javaagent:$SKYWALKING_AGENT_URL -Dskywalking.agent.service_name=$SKYWALKING_SERVICE_NAME -Dskywalking.collector.backend_service=$SKYWALKING_BACKEND_SERVICE -jar -Dloader.path=.,3rd-li $JAR_FILE >/dev/null 2>&1 &
        echo $! > $PID_FILE
        echo "应用程序已成功启动,PID: $(cat $PID_FILE) .........."
    fi
}

stop() {
    if [ -f "$PID_FILE" ]; then
        kill -9 $(cat $PID_FILE)
        rm $PID_FILE
        echo "应用程序已成功停止.........."
    else
        echo "应用程序未运行.........."
    fi
}

restart() {
    echo "正在重启.........."
    stop
    start
    echo "重启成功.........."
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        echo "使用: $0 {start|stop|restart} 命令"
        exit 1
        ;;
esac

4.3 访问创建的测试接口,刷新浏览器查看 SkyWalking APM 服务

在这里插入图片描述

4.3.1 SpringBoot 日志

在这里插入图片描述

4.3.2 SkyWalking APM 服务查看接口调用的情况及日志信息

在这里插入图片描述
在这里插入图片描述

5. 项目源码地址

https://gitee.com/xhs101/spring-boot-skywalking.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/718156.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网站的图片都是怎么处理的

我们平常见到的很多网站里面都有很多地图片&#xff0c;那么这些图片的文件是怎么处理的呢。图片是一个网站的重要元素之一&#xff0c;图片可以给用户直接的视觉冲击&#xff0c;好的图片则可以迎来不少的流量。图片有大有小&#xff0c;都是根据网站的局部需要而确定图片的尺…

清远mes管理系统助力企业降本增效

清远MES管理系统可以帮助企业降本增效的方式包括但不限于以下几个方面&#xff1a; 生产过程优化&#xff1a;清远MES系统可以实时监控生产过程中的各个环节&#xff0c;包括设备状态、生产进度、质量指标等&#xff0c;帮助企业管理人员及时了解生产情况并做出相应的调整和控制…

Redis作者长文总结LLMs, 能够取代99%的程序员

引言 这篇文章并不是对大型语言模型&#xff08;LLMs&#xff09;的全面回顾。很明显&#xff0c;2023年对人工智能而言是特别的一年&#xff0c;但再次强调这一点似乎毫无意义。相反&#xff0c;这篇文章旨在作为一个程序员个人的见证。自从ChatGPT问世&#xff0c;以及后来使…

10+分享:适合外包的开源后台管理系统【送源码】

1. D2admin 开源地址&#xff1a;https://github.com/d2-projects/d2-admin 文档地址&#xff1a;https://d2.pub/zh/doc/d2-admin/ 效果预览&#xff1a;https://d2.pub/d2-admin/preview/ 开源协议&#xff1a;MIT 2. vue-element-admin 开源地址&#xff1a;https://gi…

git删除已创建tag标签

前言 一不小心把tag标签名称复制错了&#xff0c;现将删除 1.删除本地标签 1.1.执行下面命令 git tag -d 1.5.2401161.5.240116是创建的tag标签名称 2.如果是删除远程的tag标签名称的话&#xff0c;看下面命令 2.1.删除远程标签 git push --delete origin <tagname>…

C++ SIMD性能优化

// 使用SIMD指令优化的向量加法 //<mmintrin.h> MMX //<xmmintrin.h> SSE //<emmintrin.h> SSE2 //<pmmintrin.h> SSE3 //<tmmintrin.h> SSSE3 //<smmintrin.h> SSE4.1 //<nmmintrin.h> SSE4.2 //<wmmintrin.h> AES //<imm…

算法解析:有序数组的平方(以JS为例)

题目&#xff1a; 算法解析 算法概述 这个算法的目标是计算一个数组中每个元素的平方&#xff0c;并将结果存储在一个新的数组中&#xff0c;同时保持结果数组的排序顺序。它使用了三个指针&#xff1a;i、j和k&#xff0c;分别指向当前考虑的较小元素、较大元素和结果数组的…

【数据结构】排序(下)

个人主页~ 排序&#xff08;上&#xff09; 栈和队列 排序 二、常见排序的实现8、快速排序的优化9、非递归快速排序&#xff08;1&#xff09;基本思想&#xff08;2&#xff09;代码实现&#xff08;3&#xff09;时间复杂度&#xff08;4&#xff09;空间复杂度 10、归并排序…

kali中安装zsteg教程

1、下载文件 git clone http://www.github.com/zed-0xff/zsteg 2、第一步需要保证虚拟机是有网络的&#xff0c;不然无法克隆 3、可以将网络设置成如下后重启&#xff0c;访问百度看看能不能访问&#xff0c;若可以访问&#xff0c;则进行下一步 4、查看源&#xff0c;删除源&…

✊构建浏览器工作原理知识体系(网络协议篇)

🌻 前言 书接上回~ 系列文章目录: # ✊构建浏览器工作原理知识体系(开篇)# ✊构建浏览器工作原理知识体系(浏览器内核篇)# ✊构建浏览器工作原理知识体系(网络协议篇)✊构建浏览器工作原理知识体系(网页加载超详细全过程篇)为什么你觉得偶尔看浏览器的工作原理,…

程序员日志之计算机相关专业还值得选择吗?

目录 传送门正文日志1、概要2、专业选择2.1、专业2.2、学校2.3、城市 3、计算机相关专业还值得选择吗&#xff1f; 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#xff08;精品&#xff09; MyB…

【会议】一张图片讲清楚:项目启动会议

另附上启动会前需要准备的内容&#xff1a;

【吉林大学Java程序设计】第10章:Java数据库编程技术(JDBC)

第10章&#xff1a;Java数据库编程技术&#xff08;JDBC&#xff09; 1. 数据库系统概述数据库系统SQL语言 2.JDBC概述JDBC APIJDBC Driver API 3.JDBC编程步骤示例1&#xff1a;MySQL数据库操作程序示例2&#xff1a;Java DB数据库操作程序 重点小结 1. 数据库系统概述 数据库…

当OpenHarmony遇上OpenEuler

1、 安装openEuler 虚拟机、物理机器当然都可以安装。虚拟机又可以使用WSL、或者VMWare、VirtualBox虚拟机软件&#xff0c;如果需要安装最新版本&#xff0c;建议使用后者。当前WSL只支持OpenEuler 20.03。 1.1 WSL openEuler WSL的安装都是程序员的必备技能了&#xff0c;…

掌控未来:用决策树算法揭秘胜利者的必胜策略!

掌控未来&#xff1a;用决策树算法揭秘胜利者的必胜策略&#xff01; 一、引言1.1. 决策树的定义1.2. 发展历程1.3. 当前应用概况1.4. 本文内容安排 二、决策树的基本概念2.1 节点和叶节点2.2 决策树的结构结构图示不同结构的决策树 三、决策树的算法原理3.1 基本思想3.2 核心算…

设计灵感源泉!7个令人赞叹的网页界面设计展示

网页的界面设计主要是指视觉设计和风格设计。高质量的界面更容易吸引用户的注意力&#xff0c;从而更准确地向用户传达信息。对于设计师来说&#xff0c;他们需要从高质量的作品中获得稳定的灵感&#xff0c;以帮助他们更高效地实现设计目标。在本文中&#xff0c;梳理了7个高质…

黄金价格与美元的关系变了?

在一些传统的定价框架中&#xff0c;现货黄金的价格走势取&#xff0c;决于美元的实际利率水平——实际利率越高&#xff0c;黄金价格越低&#xff0c;反之亦然。在大多数的时候&#xff0c;美元的实际利率决定了美元指数的高低所以人们通常认为&#xff0c;现货金价与美元呈反…

猫头虎推荐20个值得体验的通用大模型

猫头虎推荐20个值得体验的通用大模型 &#x1f680; 大家好&#xff0c;我是猫头虎&#xff0c;一名专注于科技领域的自媒体博主。今天是周一&#xff0c;新的开始&#xff0c;我们来深入探讨一下当前最值得体验的通用大模型。这些AI模型不仅功能强大&#xff0c;而且在各自领…

10.无代码爬虫软件做网页数据抓取流程——工作流程设置与数据预览

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a;https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…

LLaMA Factory多卡微调的实战教程(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…