Q3

news/2024/10/22 12:20:50

在Web请求场景中,通过在每次调用日志打印方法时打印出trace_id,可以有效地跟踪日志链路,帮助你更好地进行问题排查和性能监控。Logback是一个非常流行的Java日志框架,可以通过配置和编程方式来实现这一需求。以下是如何在Logback中配置和使用trace_id的步骤:1. 添加依赖确保你的项目中已经添加了Logback的依赖。如果你使用的是Maven,可以在pom.xml中添加以下依赖:
ch.qos.logback
logback-classic
1.2.11

2. 配置Logback在logback.xml或logback-spring.xml文件中,配置一个自定义的日志格式,包含trace_id。你可以使用PatternLayout来自定义日志格式。

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${LOG_PATTERN}</pattern></encoder>
</appender><root level="debug"><appender-ref ref="STDOUT" />
</root>
在这个配置中,%X{trace_id}用于从MDC(Mapped Diagnostic Context)中获取trace_id并打印出来。3. 在Web请求中设置trace_id你需要在每个Web请求开始时生成一个唯一的trace_id,并将其存储在MDC中。这通常在拦截器或过滤器中完成。使用Spring Boot的拦截器如果你使用的是Spring Boot,可以通过实现HandlerInterceptor来设置trace_id。import org.slf4j.MDC; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

@Component
public class TraceIdInterceptor implements HandlerInterceptor {

private static final String TRACE_ID = "trace_id";@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 生成一个唯一的trace_idString traceId = UUID.randomUUID().toString();MDC.put(TRACE_ID, traceId);return true;
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 清理MDC中的trace_idMDC.remove(TRACE_ID);
}

}
然后,在Spring Boot的配置类中注册这个拦截器:import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Autowired
private TraceIdInterceptor traceIdInterceptor;@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(traceIdInterceptor);
}

}
使用Servlet过滤器如果你不使用Spring Boot,可以使用Servlet过滤器来设置trace_id。import org.slf4j.MDC;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;

public class TraceIdFilter implements Filter {

private static final String TRACE_ID = "trace_id";@Override
public void init(FilterConfig filterConfig) throws ServletException {// 初始化操作
}@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;// 生成一个唯一的trace_idString traceId = UUID.randomUUID().toString();MDC.put(TRACE_ID, traceId);try {chain.doFilter(request, response);} finally {// 清理MDC中的trace_idMDC.remove(TRACE_ID);}
}@Override
public void destroy() {// 销毁操作
}

}
然后在web.xml中配置这个过滤器:
TraceIdFilter
com.example.TraceIdFilter


TraceIdFilter
/*

4. 使用日志记录在你的代码中,正常使用Logback的日志记录方法,trace_id会自动包含在日志消息中。import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyService {

private static final Logger logger = LoggerFactory.getLogger(MyService.class);public void doSomething() {logger.info("This is an info message");logger.debug("This is a debug message");logger.error("This is an error message", new RuntimeException("Example exception"));
}

}
总结通过上述步骤,你可以在每次调用日志打印方法时自动打印出trace_id,从而方便地跟踪日志链路。这种方法不仅适用于Web请求,还可以扩展到其他需要跟踪的场景。内容由AI生成

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

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

相关文章

Nuxt.js 应用中的 build:manifest 事件钩子详解

title: Nuxt.js 应用中的 build:manifest 事件钩子详解 date: 2024/10/22 updated: 2024/10/22 author: cmdragon excerpt: build:manifest 是 Nuxt.js 中的一个生命周期钩子,它在 Vite 和 Webpack 构建清单期间被调用。利用这个钩子,开发者可以自定义 Nitro 渲染在最终 H…

如何进行前端单元测试

​前端单元测试的引入为软件开发流程带来了更高的质量和稳定性,需要遵循以下步骤:一、理解单元测试的重要性;二、选择合适的测试框架;三、编写有效的测试用例;四、模拟外部依赖;五、持续维护和优化测试。单元测试的开始,是对前端代码的核心功能进行验证。一、理解单元测…

Jenkins打包Unity游戏环境变量配置

Jenkins打包Unity游戏失败,通过报错日志会查找到sdk环境有问题,解决sdk的环境问题后会出现ndk环境有问题,为了解决这两个问题导致的打包失败需要在Jenkins中配置环境变量打开 Jenkins 首页,选中Manager Jenkins,再点击 System 选项找到全局属性,勾选Environment variable…

【Linux】shell 脚本 (.sh) 编写及执行

shell脚本shell脚本就是一些命令的集合#!/bin/bash echo "文件开头代表:该文件使用的是bash语法" 一、运行.sh文件 方法一:当前文件执行.sh 文件# 文件必须含有x执行权限 [文件赋x权限:chmod u+x hello.sh] ./test.sh# 文件可以没有x权限 sh test.sh 方法二:绝…

人工智能编程助手MarsCode注册和安装步骤

人工智能编程助手MarsCode注册和安装步骤 字节最近推出了人工智能编程助手MarsCode,功能非常强大。在IDEA中安装和使用MarsCode的步骤如下: 一、注册MarsCode账号注册地址:https://www.marscode.cn/events/s/iSMPHK8a/ 二、在Idea中安装插件点击菜单“File”——“Settings”…

服务器开启FTP

服务器开启 FTP操作系统:Windows 服务器镜像:Windows Server 2022 数据中心版(简体中文)64 位一、新建用户以及文件夹 步骤 1:新建用户打开计算机管理。打开”系统工具“中的”本地用户和组“,右键选择”新建组“。右键选择”新用户“,设置用户名和密码,并选择”密码永…

库卡机器人维修常见报警代码KSS故障修复

对库卡机器人工作中一些细节和一些安全的措施有所了解才能防患于未然。库卡机器人故障排查可通过观察KUKA机械手报警代码得知,故障代码以及原因有: ——kuka机械臂提示文字KSS 0121:电流过大 原因:每根轴的电流都受到监视并且在电流输出过大时触发放大器内部 的电流保护装置…

第40篇 ConfuserEx混淆代码,防止反编译

要想自己的dll或程序禁止被反编译成功,可以使用ConfuserEx混淆代码 1.正常反编译 1.1 创建一个demo控制台新建Test类,写个fun1.2 正常编译看的效果 目前有很多.NET的反编译工具,例如ILSpy,JustDecompile,dnSpy.下面使用dnSpy对ConsoleApp进行反编译。2.混淆编译dll流程 使…