在Spring Boot 2中如何在hystrix中使用MDC?

我们在我们的Spring Boot应用程序中使用hystrix。我们希望使用MDC将特定属性(例如请求ID和请求URI以及登录用户)附加到每个日志语句中。无论何时实施hystrix,此机制均不起作用。

@HystrixCommand(fallbackMethod = "callFallback",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInmilliseconds",value = "10000")},ignoreExceptions = Exception.class)
public GenericResponse callUser(User user) {
  //Implementation
   log.info("Creating user called");
}

对于非hystrix注释方法,它工作得很好。我确实知道MDC是线程特定的,并且hystrix确实在单独的线程上执行。请提出解决方法,因为我无法评论hystrix。

xue5227980 回答:在Spring Boot 2中如何在hystrix中使用MDC?

您可以使用HystrixCommandExecutionHook来确保ThreadLocalMDC变量在所有hystrix线程中的流动。

您可以通过netflix here找到完整的文档。

有关如何使用钩子实现目标的更多帮助,可以参考此blog

在博客中,您可以使用MDC.get("key")MDC.set("key",value)代替getThreadLocals()setThreadLocals()来解决您的目的。

,

如果使用的是logback,则可以创建logback.xml文件并创建自己的模式。就我而言,我添加了一个自定义属性,名为TXN_ID

logback.xml文件可以像这样:

</configuration>
    <appender name="FILE-AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOGS_DIR}/${LOG_FILENAME}.log</file>

        <encoder>
            <pattern>
                <!-- Using TXN_ID from MDC -->
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{TXN_ID}] [%thread] %-5level %logger{0} - %msg%n
            </pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${LOGS_DIR}/${LOG_FILENAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- each file should be at most 100MB,keep 60 days worth of history,but at most 20GB -->
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>60</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="FILE-AUDIT" />
    </root>
</configuration>

添加自定义模式后,则需要在代码中用TXN_ID键填充MDC,例如:

@HystrixCommand(
        fallbackMethod = "callFallback",commandProperties = {
                @HystrixProperty(
                        name = "execution.isolation.thread.timeoutInMilliseconds",value = "10000")
        },ignoreExceptions = Exception.class)
public GenericResponse callUser(User user) {
    MDC.put("TXN_ID",UUID.randomUUID.toString());

    //Implementation
    log.info("Creating user called");

    MDC.remove("TXN_ID");
}

如果您使用的是Spring Boot,那么最好创建logback-spring.xml而不是logback.xml,这样您就可以让SpringBoot控制记录仪的初始化

本文链接:https://www.f2er.com/2903957.html

大家都在问