Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据库中的值添加到logback日志消息_Java_Spring_Spring Boot_Logback - Fatal编程技术网

Java 将数据库中的值添加到logback日志消息

Java 将数据库中的值添加到logback日志消息,java,spring,spring-boot,logback,Java,Spring,Spring Boot,Logback,我有一个Spring引导应用程序,它使用logback来记录应用程序日志。现在,我添加了对logz.io的支持,以将多台计算机的日志集中到一个位置。问题是我不知道哪个日志来自哪个机器 在应用程序数据库中,我有一个唯一的令牌,它对于运行应用程序的每台机器都是唯一的。我的想法是将该令牌值预先附加到每个日志消息中,以便区分哪个客户端正在发送哪个日志 我可以通过存储库中扩展JpaRepository的方法访问令牌值。 Logback配置通过Logback.xml完成 编辑: 每个客户端都使用自己的H2数

我有一个Spring引导应用程序,它使用logback来记录应用程序日志。现在,我添加了对logz.io的支持,以将多台计算机的日志集中到一个位置。问题是我不知道哪个日志来自哪个机器

在应用程序数据库中,我有一个唯一的令牌,它对于运行应用程序的每台机器都是唯一的。我的想法是将该令牌值预先附加到每个日志消息中,以便区分哪个客户端正在发送哪个日志

我可以通过存储库中扩展
JpaRepository
的方法访问令牌值。 Logback配置通过Logback.xml完成

编辑: 每个客户端都使用自己的H2数据库来存储值

我当前收到的消息示例:

2020-03-2607:58:13702[scheduling-1]信息n.g.service.ScheduledBotService-测试消息

将是:


UniqueToken123 2020-03-26 07:58:13702[scheduling-1]信息n.g.service.ScheduledBotService-测试消息

我尝试了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
您可以从中获得有关线程上下文的更多信息


我希望它能有所帮助。

用MDC设置这个值怎么样?您确定不想将它保存在环境变量中吗?它可以随时访问,无需昂贵的数据库查询。更不用说在日志消息中输入代码是很容易的,不需要任何代码。此外,您可以选择是使用“real”env变量(例如
export MACHINE=“foo1”
)还是使用Java系统属性
-DMACHINE=“foo1”
)。@Kayaman将其保留为env变量对我来说不是一个选项。它必须是数据库中的红色。每个客户端都有自己的小型H2数据库,因此性能不是问题。在应用程序启动时从数据库中读取一次,然后将其存储在系统属性中如何?除非您打算在应用程序的生命周期内更改它的值。是的,这是可行的,但问题是,只有从该线程生成的日志才能访问它。我需要找到一个不同的解决方案,可以从任何线程访问数据。我也尝试过使用MDC,也是一样的。