Java 如何向slf4j提供我自己的MDCAdapter?
我正在使用slf4j和logback为我的微服务集提供日志服务 我希望确保我添加到MDC的任何条目始终具有小写名称,因此我正在研究用类似的实现替换LogBackMDCAdapter类,该实现仅强制密钥名称为小写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的副本 更
这是明智的做法吗?如果是,我如何使我的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>字符,因为有时它不起作用