我遇到了这个post的问题
下面是我的代码示例
public class StackOverflow implements RequestHandler<Map<String, String>, ApiGatewayResponse> {
private static final Logger LOGGER = LogManager.getLogger(StackOverflow.class);
public abstract class StreamGobbler extends Thread {
// Working Interceptor using this.print("message")
public abstract void print(String line);
}
private class ErrStreamGobbler extends StreamGobbler {
ErrStreamGobbler(InputStream in) { super(in); }
@Override
public void print(String line) { LOGGER.error(line); }
}
private class OutStreamGobbler extends StreamGobbler {
OutStreamGobbler(InputStream in) { super(in); }
@Override
public void print(String line) { LOGGER.info(line); }
}
// MAIN METHOD
@Override
public ApiGatewayResponse handleRequest(Map<String, String> params, Context context) {
// ThreadContext propagation
System.setProperty("isThreadContextMapInheritable", "true");
ThreadContext.put("foo", "bar");
LOGGER.info("Hello from main");
// My process will return value on System.in & System.out
ProcessBuilder pb = new ProcessBuilder("sh", String.format("batchs/JOB_FOO/run.sh"));
Process p = pb.start();
// Intercept those logs
new ErrStreamGobbler(p.getErrorStream()).start();
new OutStreamGobbler(p.getInputStream()).start();
p.waitFor();
}
}来自LOGGER.info("Hello from main");的ThreadContext可以正常工作,并且还可以打印foo: bar。
但是我的子线程StreamGobbler没有得到ThreadContext,并且如果isThreadContextMapInheritable被设置为true,也不会将foo: bar作为log4j属性事件输出。
发布于 2022-01-15 00:33:45
刚刚遇到了这个问题。发现在应用程序启动时设置-DisThreadContextMapInheritable=true有效,即使在代码中设置它不起作用。
发布于 2020-09-30 18:04:19
使用自定义的ThreadPoolExecutor确实解决了我的问题。
使用此answer找到此解决方案。
https://stackoverflow.com/questions/64121046
复制相似问题