以类初始化确定的前缀登录

问题描述 投票:2回答:1

我有一个正在使用的模块,它的记录器设置如下:

public class MyClass {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);

    public MyClass(String org, String division) {
        this.org = org;
        this.division = division;
    }

    public void myMethod() {
      if(blah) {
          LOGGER.log("Something happened");
      } else {
          LOGGER.log("Something went Wrong");
      }
    }
}

现在,此模块正在为多个组织和部门运行,所以我的日志在Splunk中看起来像这样:

Something happened
Something went Wrong
Something happened
Something happened
Something went Wrong

没有组织或部门的信息,要解决此问题,有人开始添加addPrefix方法,如下所示:

private String addPrefix() {
    return String.format("(%s, %s)", this.org, this.division);
}

以及更新的日志到LOGGER.log("{} Something happened", addPrefix());LOGGER.log("{} Something went wrong", addPrefix());

现在我们的日志如下:

(org1, div1) Something happened
(org1, div2) Something went Wrong
(org2, div3) Something happened

问题是,随着日志数量的增加,要维护此日志并确保每个人都将{}, addPrefix()添加到其日志中是很痛苦的。有一个更好的方法吗?

我调查了mdc,但在这里不知道如何使用它。

是否应该在我的参数都已知的构造函数中初始化记录器?这会影响静态方法的登录吗?这样做有内存开销吗?

java logging log4j slf4j mdc
1个回答
0
投票

将记录器放入方法中,然后通过消息调用方法

public class MyClass {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);

    public MyClass(String org, String division) {
        this.org = org;
        this.division = division;
    }

    public void myMethod() {
        if(blah) {
            log("Something happened");
        } else {
            log("Something went Wrong");
        }
    }

    private void log(String message) {
        LOGGER.log("({} {})) {}", this.org, this.division, message);
    }
}

或尝试log4j modify logged message using custom appender

© www.soinside.com 2019 - 2024. All rights reserved.