当前位置: 首页 > 知识库问答 >
问题:

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

姚高韵
2023-03-14

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

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

谢谢你的帮忙

共有3个答案

林德惠
2023-03-14

这里有一个简单的解决方案:您可以使用一个方法包装字符串,该方法将前缀添加到字符串中,并将连接的字符串返回给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"));

    }

}

优势:

  • 简单

缺点:

  • 如果要添加前缀,必须始终使用wrapper方法
杨晟
2023-03-14

根据比尔·克拉斯的回答:

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");
    }
}
赵河
2023-03-14

使用MDC来实现这一点

在你的构造器里

 MDC.put("prefix", yourvalue);

在XML中,在模式中使用它

      %X{prefix}
 类似资料:
  • 我正在将我的java项目从Rabbit MQ迁移到Kafka(出于某些原因)。 在当前的工作流中,我将所有消息发布到rabbit mq exchange中,并根据消息的路由密钥将消息重定向到一个或多个队列中。我也想保留Kafka同样的功能。(我知道Kafka本来就不适合,但我想要一个变通办法)。 基本上,我想要这样的东西:每当一个主题接收到一个消息时,基于消息中存在的元,该消息应该被重定向到其他一

  • 我是新手颤动,我使用Firebase消息发送通知到设备,我们使用Web API发送请求到Firebase发送通知和Firebase发送通知到Android。我想在通知标题和身体显示两个按钮(接受和拒绝)像瓦特应用程序通知标记为已读选项我想要这样的东西。 我添加的Android清单文件: 颤振码 Web api服务代码

  • 问题内容: 我想为每个列名添加后缀,如下所示: 我该怎么做呢?另外,如果要添加后缀,解决方案将如何更改? 问题答案: 您可以使用一种理解: 也有内置方法,如和在另一个答案中提到的。

  • 我需要填充一个json文件,现在我有如下内容: 我需要添加另一个“元素”。我的第一步是使用,现在我需要添加新元素。我想我必须使用添加另一个元素,我尝试了以下方法: 但是当我尝试做时,我得到了错误"对象没有方法推送",我认为我做了一些非常错误的事情,因为我没有告诉任何地方的"元素"。 我该怎么做? 编辑:对不起,我脑子里有很多困惑。 我认为从,但我首先得到了我在JSON中输入的内容。 用数组代替对象