如何为log4j消息添加前缀(在对象级别)

我使用log4j2,我想为我的所有消息添加一个前缀。 此前缀将传递给构造函数参数,它取决于类的实例。 所以我们处于对象级别(不是类或线程)。

例如,我有一个实例化的A类,如new A(152) ,所以当我在这个类上使用log.error("message")时,就会在消息之前写入152: log.error("message") 对于new A(155) ,将显示155:代替。

谢谢你的帮助

使用MDC来实现这一目标

在你的构造函数中

  MDC.put("prefix", yourvalue); 

并在您的XML中使用它在模式中这样

  %X{prefix} 

基于Bill Clars回答:

 public class LogWrapper { private Logger log; private String prefix; public LogWrapper(Logger log, String prefix) { this.log = log; this.prefix = prefix; } public void error(String msg) { log.error(prefix + ": " + msg); } } 

然后在类中设置为实例变量

 public class MyClass { private LogWrapper log; public MyClass(int prefix) { log = new LogWrapper(Logger.getLogger(this.getClass()), String.valueOf(prefix)); // then log away log.error("Test"); } } 

一种解决方案是包装类。

 public class YourLogger { private Logger log; public void error(int value, String msg) { log.error(String.valueOf(value) + ": " + msg); } } 

试试这个

 public void writeError(String msg,int intValue) { logger.error(intValue+" "+msg); } 

这是一个简单的解决方法:您可以使用为其添加前缀的方法包装字符串,并将连接的字符串返回到error方法。

 public class A { private static final Logger LOG = LogManager.getLogger(); final int index; public A(int index) { this.index = index; } public static void f(String message) { return String.valueOf(index) + ": "; } public void method() { // ... LOG.error(f("message")); } } 

优点:

  • 简单
  • 您可以在一个类/方法中使用和不使用前缀来记录消息
  • 您不必在log4j2配置中永久添加%X{prefix}之类的内容

缺点:

  • 如果要添加前缀,则必须始终使用包装器方法