Comments (10)
很赞
from transmittable-thread-local.
赞
from transmittable-thread-local.
LOG4J(2)
的集成 想法不错,我理解和思考一下你说的实现过程。
另外,在MDC
的需求说明中,关于日志场景的说明还是比较模糊的,你能给一下更明确实际些的场景说明不?这样做起来更有目标感 😸 @bwzhang2011
from transmittable-thread-local.
@oldratlee 感谢回复。
使用MDC
是用来记录跟应用上下文环境中需要保存的一些数据,比如请求类提取的、跟执行有关的跟踪信息还有当异常发生的时候提取的,这些可以在appender
中的layout
来指定这些信息(比如%X{key1}: %X{key2}
等)。
一般场景可以是:
filter
类中写入parent thread
的内容(MDC.put
)——带有一traceId
或其余标记信息(用户)- 业务类中写入业务类的信息(
MDC.put
)——可提取跟traceId
或标记有关的信息(提取),并保存其余的消息(跟本线程有关的)并进行保存保存 - 清空
filter
的线程变量,finally { ThreadContext.clearAll() }
from transmittable-thread-local.
MtContextThreadLocal
新加上callback
方法:
protected void beforeExecute() {
}
protected void afterExecute() {
}
可以覆盖这个方法 来完成 log4j2
的设置,达到filter
的效果:
static MtContextThreadLocal<Map<String, String>> mtc = new MtContextThreadLocal<Map<String, String>>() {
@Override
protected void beforeExecute() {
final Map<String, String> log4j2Context = get();
for (Map.Entry<String, String> entry : log4j2Context.entrySet()) {
ThreadContext.put(entry.getKey(), entry.getValue());
}
}
@Override
protected void afterExecute() {
ThreadContext.clearAll();
}
@Override
protected Map<String, String> initialValue() {
return new HashMap<String, String>();
}
};
Log的代码:
public static void main(String[] args) throws Exception {
// Init Log Context, set MTC
// More KV if needed
final String TRACE_ID = "trace-id";
final String TRACE_ID_VALUE = "XXX-YYY-ZZZ";
ThreadContext.put(TRACE_ID, TRACE_ID_VALUE);
mtc.get().put(TRACE_ID, TRACE_ID_VALUE);
// Log in Main Thread
logger.info("Log in main!");
// Run task in thread pool
final ExecutorService executorService = Executors.newFixedThreadPool(1);
final Runnable task = new Runnable() {
@Override
public void run() {
// Log in thread pool
logger.info("Log in Runnable!");
}
};
final Future<?> submit = executorService.submit(MtContextRunnable.get(task));
submit.get();
executorService.shutdown();
}
完整示例:Log4j2ContextFilter.java 、 log4j2.xml
输出:
22:50:52.823 [main] INFO log4j2.Log4j2ContextFilter XXX-YYY-ZZZ - Log in main!
22:50:52.826 [pool-2-thread-1] INFO log4j2.Log4j2ContextFilter XXX-YYY-ZZZ - Log in Runnable!
@bwzhang2011 看看这样是不是可以解决你的问题了? 如果OK,我就发一个新版本,加上这个功能。
from transmittable-thread-local.
v1.2.0 已发布。 @bwzhang2011
from transmittable-thread-local.
@oldratlee, 我再仔细看一下,看是否能合到工程中。T.K.S
from transmittable-thread-local.
@oldratlee SL4J
中MDC
类依赖于MDCAdapter
,个人感觉如果集成则需要提供一个针对其的实现。这样我仍然只需要操作MDC
即可。
from transmittable-thread-local.
相关的 SL4J
的MDC
和 multiple-thread-context
的集成,涉及如果设置业务的Log Context
如trace-id
,这个需要业务来完成, multi-thread-context
提供能力。
个人感觉如果集成则需要提供一个针对其的实现
你说能一下 『针对其的实现』如何做,给一下示例代码?
如果你比较清楚了,能直接实现一下,给个PullRequest
吗? 😸 @bwzhang2011
from transmittable-thread-local.
PS: 已提供集成库:
<dependency>
<groupId>com.ofpay</groupId>
<artifactId>logback-mdc-ttl</artifactId>
<version>1.4.0</version>
</dependency>
from transmittable-thread-local.
Related Issues (20)
- 复现TransmittableThreadLocal数据在「不用TtlExecutors包裹的线程池」中概率丢失。 HOT 1
- TTL是否适用于tomcat的StandardThreadExecutor,尝试了agent的方式和显式包装的方式都不行 HOT 1
- 线程池每次执行完成后默认将上下文还原至调用线程的上下文原状,可以执行完成后将线程中的上下文全部清除掉吗 HOT 1
- 集成`Spring Reactor` HOT 1
- jdk11 报错。 HOT 4
- ttl是否不支持rocketMQ的上下文传递 HOT 1
- 在CompletableFuture中使用TTL,主线程执行完成,但CompletableFuture未完成,是否可以可以释放上下文,主线程释放上下文后,CompletableFuture是否还能拿到TTL的值 HOT 1
- 加入agent后报TtlTransformer: Fail to transform class xxx 错误 HOT 4
- agent中对普通Thread场景进行包装,来触发copy方法 HOT 2
- agent方式使用TTL,jdk从8升到11之后项目启动报错 类重复加载: java.lang.LinkageError: loader java.net.URLClassLoader attempted duplicate class HOT 3
- “业务项目”在通过bytebuddy增强后,TTL+CompletableFuture无法再正常地进行上下文传递。 HOT 1
- 关于不修饰runnable使用ttl导致子线程泄露问题 HOT 3
- -
- 与其他探针放在一起使用的时候,如果ttlagent顺序在其他探针之后,探针失效无法跨线程 HOT 7
- 关于registerThreadLocal方法加锁和copy on write疑问 HOT 1
- 有必要关闭Inheritable能力么 HOT 5
- TTL使用完成后需要remove掉当前线程的值吗?如果不删除会不会引发OOM? HOT 3
- 主线程执行完后会remove,但是子线程执行完成后会restore恢复本地变量,子线程中的值变量如何清除? HOT 6
- 如何在ttl里面使用BinaryOperator HOT 1
- 使用Java agent不生效,通过arthas jad看对应的类,均已被transform,但是trace不到TtlRunnable和TransmittableThreadLocal的执行记录 HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from transmittable-thread-local.