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

时间:2013-05-23 20:10:47

标签: java log4j log4j2

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

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

感谢您的帮助

5 个答案:

答案 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配置

缺点:

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