我使用log4j2,我想为我的所有消息添加前缀。此前缀传递给构造函数参数,它取决于类的实例。所以我们处于对象级别(而不是类或线程)。
例如,我有A
类实例化new A(152)
,因此当我在此类上使用log.error("message")
时,152:
就会在消息之前写入。对于new A(155)
,将显示155:
。
感谢您的帮助
答案 0 :(得分:6)
使用MDC来实现此
在你的构造函数中添加
MDC.put("prefix", yourvalue);
并在您的XML中使用它在模式中
%X{prefix}
答案 1 :(得分:3)
根据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");
}
}
答案 2 :(得分:0)
一个解决方案是包装类。
public class YourLogger
{
private Logger log;
public void error(int value, String msg)
{
log.error(String.valueOf(value) + ": " + msg);
}
}
答案 3 :(得分:0)
试试这个
public void writeError(String msg,int intValue) {
logger.error(intValue+" "+msg);
}
答案 4 :(得分:0)
以下是一个简单的解决方法:您可以使用方法包装字符串,该方法为其添加前缀并将连接字符串返回到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}
之类的内容永久添加到log4j2配置缺点: