0

我必须根据所使用的服务记录到单独的日志文件。因此,假设我有 service1 和 service2,并且日志将分别转到 service1.log 和 service2.log。

问题是这两个服务都使用了一些通用代码。现在我如何制作日志,以便如果任何服务调用公共代码然后登录到该特定日志文件。

我创建记录器的方式是

private static final Logger logger = Logger.getLogger(ClassName.class);

我想处理这个问题的方法是将一个字符串(记录器名称)传递给公共代码并在方法级别而不是类创建记录器。

例子:

someMethodInCommonCode(String loggerName) {
  Logger logger = Logger.getLogger(loggerName);
}

我读过 log4j 维护记录器的缓存,所以我猜在方法中创建记录器不会是开销。

是的,我不喜欢记录器名称被传递。那么有没有一种方法或任何配置可以实现上述场景或任何其他想法。

4

2 回答 2

3

您可以使用 log4j 的嵌套/映射诊断上下文(NDC 或 MDC)功能。本质上,这些是“带外”信息,它们存储在每个线程的基础上,并在执行日志操作时自动附加到日志事件中。NDC 中的信息可以输出到日志文件或用于在 appender 之间路由日志消息,这正是您所需要的。您可以在 log4j 的官方 wiki 上找到有关这些的更多信息。

You can store the service name or some other identifier into the NDC in your services, before calling the common code. Then you can configure a log4j filter to route the common log messages to the appropriate output file according to the service name found in the NDC. The common code doesn't even need to be modified.

于 2012-06-04T01:24:49.577 回答
0

如果您的服务在不同的线程中运行,您可以检查当前线程并相应地选择记录器

于 2012-06-03T20:57:10.657 回答