我使用log4j2,我想在我的所有消息中添加一个前缀。这个前缀被传递给构造函数参数,它依赖于类的实例。因此,我们处于对象级别(而不是类或线程)。
例如,我有一个像new A(152)
一样实例化的A
类,所以当我在这个类上使用log.error("message")
时,152:
就写在消息之前。对于new A(155)
,将改为显示155:
。
谢谢你的帮忙
发布于 2013-05-23 20:18:10
使用MDC来实现这一点
在你的构造函数中放入
MDC.put("prefix", yourvalue);
在您的XML中,就像这样在pattern中使用它
%X{prefix}
发布于 2013-05-23 20:23:44
根据比尔·克拉尔的回答:
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");
}
}
发布于 2014-08-25 18:13:16
这里有一个简单的变通办法:您可以使用方法对字符串进行包装,该方法向字符串添加前缀,并将连接后的字符串返回给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"));
}
}
优势:
中永久添加像%X{prefix}
这样的内容
缺点:
,则必须始终使用包装器方法
https://stackoverflow.com/questions/16723016
复制