9

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

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

谢谢你的帮助

4

5 回答 5

7

使用 MDC 来实现这一点

在你的构造函数中

 MDC.put("prefix", yourvalue);

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

      %X{prefix}
于 2013-05-23T20:18:10.100 回答
5

基于比尔克拉斯的回答:

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");
    }
}
于 2013-05-23T20:23:43.870 回答
1

这是一个简单的解决方案:您可以使用一种方法来包装字符串,该方法为其添加前缀并将连接的字符串返回给该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 配置中永久添加类似的内容

缺点:

  • 如果要添加前缀,则始终必须使用包装器方法
于 2014-08-25T18:13:15.500 回答
0

一种解决方案是包装类。

public class YourLogger
{
    private Logger log;

    public void error(int value, String msg)
    {
        log.error(String.valueOf(value) + ": " + msg);
    }
}
于 2013-05-23T20:13:57.173 回答
0

尝试这个

public void writeError(String msg,int intValue) {
logger.error(intValue+" "+msg);
}
于 2013-05-23T20:23:30.563 回答