首页 > 解决方案 > 将数据库中的值添加到 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

标签: javaspringspring-bootlogback

解决方案


我在 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

你可以从这里获得更多关于线程上下文的信息

我希望它会有所帮助。


推荐阅读