spring-logback - 在 Spring Boot 中使用 logback 打印特定标题
问题描述
我正在使用 spring-boot 并使用 logback 来生成日志。现在我想在每个日志中记录一个特定的标题。
我怎样才能做到这一点。
我的 logback 文件是
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="appName" source="spring.application.name" defaultValue="apigateway" />
<property name="LOG_PATH" value="${LOG_PATH}" />
<!-- Console logging -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
[%d{YYYY-MM-dd HH:mm:ss.SSS}] [%X{X-B3-CONVID:-}] [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] [${HOSTNAME}] [%level] [${appName}] [%logger{36}.%M] - %msg %n
</pattern>
</encoder>
</appender>
<appender name="APPLICATIONLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/applogs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>
[%d{YYYY-MM-dd HH:mm:ss.SSS}] [%X{X-B3-CONVID:-}] [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] [${HOSTNAME}] [%level] [${appName}] [%logger{36}.%M] - %msg %n
</Pattern>
</encoder>
</appender>
<!-- set logger level: e.g. info, trace, debug, error -->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="APPLICATIONLOG" />
</root>
</configuration>
除此之外,我没有做任何事情来配置日志。刚刚添加了 slf4j 的依赖,然后添加了 logback spring 文件。
任何帮助表示赞赏
解决方案
添加[%X{TrasactionId}]
您的控制台和文件附加器模式,例如
对于 STDOUT 附加程序
<pattern>
[%d{YYYY-MM-dd HH:mm:ss.SSS}] [%X{TrasactionId}] [%X{X-B3-CONVID:-}] [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] [${HOSTNAME}] [%level] [${appName}] [%logger{36}.%M] - %msg %n
</pattern>
和
对于 APPLICATIONLOG 附加程序
<Pattern>
[%d{YYYY-MM-dd HH:mm:ss.SSS}] [%X{TrasactionId}] [%X{X-B3-CONVID:-}] [%X{X-B3-TraceId:-}] [%X{X-B3-SpanId:-}] [${HOSTNAME}] [%level] [${appName}] [%logger{36}.%M] - %msg %n
</Pattern>
和项目中的以下代码。
import org.slf4j.MDC;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ClientFilter implements ContainerRequestFilter, ContainerResponseFilter {
private final String TRANSACTION_ID = "TrasactionId";
@Override
public void filter(ContainerRequestContext requestContext) {
final String transactionId = requestContext.getHeaderString(TRANSACTION_ID);
if (transactionId == null || transactionId == "") {
log.debug("transactionId is null/empty");
return;
}
MDC.put(TRANSACTION_ID, TRANSACTION_ID + ":" + transactionId);
// other logic based on this based on your requirement
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
final String transactionId = requestContext.getHeaderString(TRANSACTION_ID);
if (transactionId == null || transactionId == "") {
return;
}
responseContext.getHeaders().add(TRANSACTION_ID, transactionId);
MDC.remove(TRANSACTION_ID);
}
}
这将添加如下日志以及其他文本
[2018-06-20 11:37:31.638] [TrasactionId:75c2f962-fcdc-452e-bf7e-eddc6453673e] [6e2260ca8c4f51e4] [6e2260ca8c4f51e4] [serverName] [ERROR] [apigateway [c.s.u.c.PerformanceMetricsLogger.logRequestsWithTimeGreaterThanThreshold] - Monitoring Data : API response time : Service : apigateway, API : commonapi/v1/info/getHamburgerData
笔记:
确保标头值与 相同
TrasactionId
,或在任何地方添加相同的字符串以使其工作。注册客户到球衣
jersey.register(ClientFilter.class);
推荐阅读
- swiftui - 获取数据时的SwiftUI URLSession错误(typeMismatch)WEBAPI
- generics - 使用特征和“匹配”的通用数值函数
- python - 复制文件并为 List Python 中的每个文件创建一个副本
- r - 我想按以前的最近日期过滤我的数据框到给定日期
- python - 使用python的TDD
- dns - 我的主机如何知道我拥有我的域名?
- python - 如何使用迭代为不同的变量赋值?Python
- python - 无论输入如何,神经网络都会产生相同的输出
- python-3.x - 如何仅在特定时间后显示 tqdm 进度条?
- python - Python根据关键字在Excel工作表中搜索一行并返回该行