您可以使用HystrixCommandExecutionHook
来确保ThreadLocal
或MDC
变量在所有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