Java 在类初始化时确定前缀的日志记录

Java 在类初始化时确定前缀的日志记录,java,logging,log4j,slf4j,mdc,Java,Logging,Log4j,Slf4j,Mdc,我正在开发一个模块,该模块的记录器设置如下: public class MyClass { private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class); public MyClass(String org, String division) { this.org = org; this.division = division; } pu

我正在开发一个模块,该模块的记录器设置如下:

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");
      }
    }
}
private String addPrefix() {
    return String.format("(%s, %s)", this.org, this.division);
}
(org1, div1) Something happened
(org1, div2) Something went Wrong
(org2, div3) Something happened
现在,该模块针对多个组织和部门运行,因此我的日志在Splunk中如下所示:

Something happened
Something went Wrong
Something happened
Something happened
Something went Wrong
由于没有组织或部门的信息,为了解决此问题,有人开始添加addPrefix方法,如下所示:

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");
      }
    }
}
private String addPrefix() {
    return String.format("(%s, %s)", this.org, this.division);
}
(org1, div1) Something happened
(org1, div2) Something went Wrong
(org2, div3) Something happened
并将日志更新到
LOGGER.log(“{}发生了什么事”,addPrefix())
LOGGER.log(“{}出了问题”,addPrefix())

现在我们的日志如下所示:

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");
      }
    }
}
private String addPrefix() {
    return String.format("(%s, %s)", this.org, this.division);
}
(org1, div1) Something happened
(org1, div2) Something went Wrong
(org2, div3) Something happened
问题是,随着日志数量的增加,维护日志并确保每个人都将
{},addPrefix()
添加到日志中是一件痛苦的事情。有更好的方法吗

我研究了mdc,但不知道如何在这里使用它

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

你说的“我研究了mdc,但不知道如何在这里使用它”是什么意思。您所描述的是您希望何时使用MDC的“海报儿童”。您可以在请求开始时将组织名称和部门名称添加到MDC中(无论您使用的技术是什么),然后配置所选的日志框架以将组织和部门添加到输出中。您没有提供任何关于您正在使用的框架或您的配置的详细信息,但是使用log4j2您可以进行配置

<PatternLayout pattern="(%X{organization, division}) %msg%n"/>

假设您选择存储数据的键名为“organization”和“division”。这将产生与上述示例相同的输出