java - 将数据库中的值添加到 logback 日志消息
问题描述
我有一个使用 logback 记录应用程序日志的 Spring Boot 应用程序。现在我添加了对 logz.io 的支持,可以将多台机器的日志集中到一个地方。问题是我不知道哪个日志来自哪台机器。
在应用程序数据库中,我有一个唯一的令牌,它对于运行应用程序的每台机器都是唯一的。我的想法是将该令牌值预先附加到每条日志消息中,这样我就可以区分哪个客户端正在发送哪些日志。
我可以通过存储库中扩展JpaRepository
. Logback 配置是通过 logback.xml 完成的
编辑:每个客户端都使用自己的 H2 数据库来存储值。
我目前拥有的消息示例:
2020-03-26 07:58:13,702 [scheduling-1] INFO n.g.service.ScheduledBotService - Test message
成为:
UniqueToken123 2020-03-26 07:58:13,702 [scheduling-1] INFO n.g.service.ScheduledBotService - Test message
解决方案
我在 log4j2 中尝试线程上下文,它似乎对我有用。
测试代码
public class AppTest {
private Logger logger = LogManager.getLogger(AppTest.class);
@Test
public void testMaxFromIntegerList(){
String uniqueToken = getTokenFromJpa();
ThreadContext.put("uniqueToken", uniqueToken);
logger.info("Message Set uniqueToken");
//remove after using
ThreadContext.remove("uniqueToken");
logger.info("Message Clear uniqueToken");
}
// dummy code.
private String getTokenFromJpa() {
return "UniqueToken123";
}
}
Log4j2 配置。
请注意,在您的 PatternLayout 中,使用%X{key}包含指定的键。
appender.rolling.layout.pattern = %X{uniqueToken} %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
日志文件中的内容。
UniqueToken123 2020-03-26 18:18:56 INFO AppTest:30 - Message Set uniqueToken
2020-03-26 18:18:56 INFO AppTest:33 - Message Clear uniqueToken
你可以从这里获得更多关于线程上下文的信息
我希望它会有所帮助。
推荐阅读
- react-native - Auth0:条件多因素规则从 JWT 中删除权限
- angular - 在多模块文件项目中使用 Jasmine 对组件进行 Angular 测试
- java - 如何计算数组中的连续数字组
- spring - 在 Kotlin Hibernate 中擦除多对一列表类型
- ios - 使用 PromiseKit 我想进行多个 API 调用
- javascript - Webpack 库函数不是函数
- c - 在C中的链表开头插入一个元素
- javascript - 进行 API 调用
- kotlin - Kotlin 中的参数多态性
- c - 简单代码块中的内存泄漏(错误:AddressSanitizer:堆缓冲区溢出)