gpt4 book ai didi

logback - 如何使用现代 logback 取回 MDC "inheritance"?

转载 作者:行者123 更新时间:2023-12-02 21:06:52 27 4
gpt4 key购买 nike

在返回旧项目并更新其依赖项后,我必须意识到,自版本 1.1.5 以来,logback 不再将 MDC 传播给子项:https://github.com/qos-ch/logback/commit/aa7d584ecdb1638bfc4c7223f4a5ff92d5ee6273

此更改使大多数日志几乎毫无用处。

虽然我可以理解链接问题中给出的论点,但我无法理解为什么不能以更向后兼容的方式进行这种更改(这在java中通常是常见的......) .

:除了必须将所有内容从 Runnables 子类化为 Threads 之外,现在实现相同行为的正确方法是什么?

最佳答案

我认为没有直接的方法可以将其改回来。我想到的两种选择是:

方法#1:包装所有 Runnable

引入一个抽象类,它将把 MDC 从原始 Thread 复制到新的 Thread 并使用它来代替 Runnable

public abstract class MdcAwareRunnable implements Runnable
{
private Map<String, String> originalMdc;

public MdcAwareRunnable()
{
this.originalMdc = MDC.getCopyOfContextMap();
}

@Override
public void run()
{
MDC.setContextMap(originalMdc);
runImpl();
}

protected abstract void runImpl();

/**
* In case some Runnable comes from external API and we can't change that code we can wrap it anyway.
*/
public static MdcAwareRunnable wrap(Runnable runnable)
{
return new MdcAwareRunnable()
{
@Override
protected void runImpl()
{
runnable.run();
}
};
}
}

如果某些 Runnable 来自外部 API,而您无法更改该代码,请使用 wrap 辅助方法。

缺点:需要分析和更改整个代码。

方法#2:搞乱 slf4j 内部

恢复在提交之前使用 InheritableThreadLocal 的原始 LogbackMDCAdapter 实现,并将其以其他名称放在代码中的某个位置。然后在启动时使用反射来覆盖 MDC.mdcAdapter属性以及该自定义实现的实例。这显然是一个肮脏的黑客行为,但与#1 相比,它省去了很多麻烦。

注意:出于性能原因,它需要从现有的 LogbackMDCAdapter 继承复活版本,并使用旧实现覆盖所有方法。请参阅LoggingEvent.javaLogbackMDCAdapter.getPropertyMap内部方法的一些细节。

方法#3:搞乱 logback jar(甚至更奇怪的替代方案)

这对我来说听起来是一个非常糟糕的计划,但为了完整性,它就是这样。

再次复活原来的LogbackMDCAdapter,但这次不要重命名、编译它并覆盖 logback.jar 中的 .class 文件。

或者通过重命名复活原始的 LogbackMDCAdapter,从 logback.jar 中删除 org.slf4j.impl.StaticMDCBinder 的 .class 文件并添加您自己的类,该类将返回复活的类LogbackMDCAdapter 的版本到 logback.jar 或您的代码。 MDC 似乎通过名称绑定(bind)到该类,以创建要使用的 MDCAdapter 实现。

或者,您可以通过使用自定义 ClassLoader 来实现类似的结果,该自定义 ClassLoader 将把 org.slf4j.impl.StaticMDCBinder 映射到您的类,而不是 logback.jar 中的类。注意:这可能无法在将添加自己的自定义类加载器的 Web 容器内实现。

关于logback - 如何使用现代 logback 取回 MDC "inheritance"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43053482/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com