SpringCloud日志配置多服务logId传递以及多线程logId传递问题
在Spring Cloud环境中,为了在多个服务间传递日志ID,可以使用MDC(Mapped Diagnostic Context)。MDC是log4j和logback提供的一种方便的方式,用于关联多线程中的日志。
以下是一个简单的例子,展示如何在Spring Cloud微服务中配置日志,并通过MDC传递logId:
- 在pre-filter中设置logId:
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
@Component
public class LogFilter extends OncePerRequestFilter {
private static final String LOG_ID_KEY = "logId";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
try {
String logId = generateLogId(); // 自定义生成logId的方法
MDC.put(LOG_ID_KEY, logId);
chain.doFilter(request, response);
} finally {
MDC.clear();
}
}
private String generateLogId() {
// 自定义生成日志ID的逻辑
return null; // 示例中省略生成逻辑
}
}
- 配置logback.xml使用MDC:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %X{logId} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
在这个配置中,%X{logId}
用于在日志模式中插入MDC中的logId。
通过以上配置,当请求经过LogFilter时,会生成一个logId并存入MDC,随后日志在该请求线程中被记录时会包含这个logId。使用MDC.clear()
确保在请求处理完成后清除MDC,防止内存泄漏。
如果是在多线程环境下,MDC已经做了特殊处理,子线程会自动继承父线程的MDC映射,因此不需要特殊处理。但要注意,在使用线程池时要特别小心,因为线程可能被复用,确保在每个任务执行前后清除和设置MDC。
评论已关闭