【问题标题】:How do I supply my own MDCAdapter to slf4j?如何向 slf4j 提供我自己的 MDCAdapter?
【发布时间】:2019-09-30 06:43:26
【问题描述】:

我正在使用 slf4j 和 logback 为我的一组微服务提供日志记录服务。

我想确保我添加到 MDC 的任何条目总是具有小写名称,因此我正在研究用类似的实现替换 LogBackMDCAdapter 类,该实现只是强制键名称为小写。

这是一种明智的做法吗?如果是,我如何让我的 MDC 适配器优先使用 Logback 版本?

【问题讨论】:

  • 只需创建转换属性名称的包装器。
  • 感谢@talex - 但这不会阻止开发人员直接调用MDC.put("KEY","value"),我正在努力防范
  • 你有理由这样做吗?强制小写键似乎是一个奇怪的问题。
  • 我想向 MDC 添加一个消息 ID,然后将该消息 ID 传播到任何其他被调用的微服务。在 HTTP 调用的情况下,我将它们作为请求标头传递,并且我正在运行的 servlet 容器始终强制请求标头名称为小写。因此,如果我向 messageId 的 MDC 添加一个值,它会在它进入我的下游微服务时转换为 messageid
  • 确保同时删除 _ 字符,因为有时它不起作用 stackoverflow.com/questions/22856136/…

标签: java slf4j logback-classic


【解决方案1】:

这是我最终使用的解决方案。

在您的项目中创建一个名为org.slf4j.impl.StaticMDCBinder 的类。这可以是 slf4j 附带的 org.slf4j.impl.StaticMDCBinder 的副本。

更改该类以返回您自己的 MDCAdapter 实例。因为我知道我将使用 Logback 作为底层日志系统,所以我只是继承了 ch.qos.logback.classic.util.LogbackMDCAdapter 并覆盖了 put 方法以强制将密钥输入小写。

活页夹:

public class StaticMDCBinder {
   public static final StaticMDCBinder SINGLETON = new StaticMDCBinder();

   private StaticMDCBinder() {
   }

   public MDCAdapter getMDCA() {
      return new DavesMDCAdapter();
   }

   public String getMDCAdapterClassStr() {
       return DavesMDCAdapter.class.getName();
   }
}

还有 MDC 适配器

public class DavesMDCAdapter extends LogbackMDCAdapter {

public void put(String key, String val) throws IllegalArgumentException{
    super.put(key.toLowerCase(),val);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2011-03-24
    • 2011-11-09
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多