Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向slf4j提供我自己的MDCAdapter?_Java_Slf4j_Logback Classic - Fatal编程技术网

Java 如何向slf4j提供我自己的MDCAdapter?

Java 如何向slf4j提供我自己的MDCAdapter?,java,slf4j,logback-classic,Java,Slf4j,Logback Classic,我正在使用slf4j和logback为我的微服务集提供日志服务 我希望确保我添加到MDC的任何条目始终具有小写名称,因此我正在研究用类似的实现替换LogBackMDCAdapter类,该实现仅强制密钥名称为小写 这是明智的做法吗?如果是,我如何使我的MDC适配器优先于Logback版本使用?以下是我最终使用的解决方案 在项目中创建一个名为org.slf4j.impl.StaticMDCBinder的类。这可以是slf4j附带的org.slf4j.impl.StaticMDCBinder的副本 更

我正在使用slf4j和logback为我的微服务集提供日志服务

我希望确保我添加到MDC的任何条目始终具有小写名称,因此我正在研究用类似的实现替换LogBackMDCAdapter类,该实现仅强制密钥名称为小写


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

以下是我最终使用的解决方案

在项目中创建一个名为
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);
}

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

在项目中创建一个名为
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);
}

只需创建转换属性名的包装器即可。谢谢@talex-但这不会阻止开发人员直接调用
MDC.put(“KEY”,“value”)
,我正试图保护这一点。您这样做的原因是什么?强制使用小写键似乎是一个需要解决的奇怪问题。我想向MDC添加一个消息id,然后将该消息id分发给任何其他被调用的微服务。在HTTP调用的情况下,我将它们作为请求头传递,而我运行的servlet容器总是将请求头名称强制为小写。因此,如果我向
messageId
的MDC添加一个值,当它进入我的下游微服务时,它会被翻译成
messageid
。请确保删除
字符,因为有时它不工作,只需创建转换属性名称的包装器。谢谢@talex-但这不会阻止开发人员直接调用
MDC.put(“KEY”,“value”)
,我要保护的是你为什么要这么做?强制使用小写键似乎是一个需要解决的奇怪问题。我想向MDC添加一个消息id,然后将该消息id分发给任何其他被调用的微服务。在HTTP调用的情况下,我将它们作为请求头传递,而我运行的servlet容器总是将请求头名称强制为小写。因此,如果我向
messageId
的MDC中添加一个值,当它进入我的下游微服务时,它会被转换为
messageId
。请确保也删除
\ucode>字符,因为有时它不起作用