【问题标题】:Logging with prefix determined at a Class Initialization使用在类初始化时确定的前缀进行日志记录
【发布时间】:2020-08-31 13:05:39
【问题描述】:

我正在处理一个模块,它的记录器设置如下:

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】:

    您是什么意思“我查看了 mdc 但无法弄清楚如何在这里使用它。”。您所描述的是当您想要使用 MDC 时的“典型代表”。您将在请求开始时将组织名称和部门名称添加到 MDC(无论您使用的技术可能是什么),然后配置您选择的日志框架以将组织和部门添加到您的输出中。您尚未提供有关您使用的框架或配置的详细信息,但您可以使用 Log4j 2 进行配置

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

    假设您选择存储数据的键名为“组织”和“部门”。这将导致与您上面的示例一样的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-04
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2015-05-13
      相关资源
      最近更新 更多