我必须根据所使用的服务登录到单独的日志文件。那么就说我有service1& service2和日志将转到service1.log& service2.log分别。
问题是这两种服务都使用了一些通用代码。现在如何制作日志,以便如果任何服务调用公共代码,则登录到该特定日志文件。
我创建记录器的方式是
private static final Logger logger = Logger.getLogger(ClassName.class);
我想要处理的方法是将一个字符串(记录器名称)传递给公共代码,并在方法级而不是类中创建记录器。
示例:
someMethodInCommonCode(String loggerName) {
Logger logger = Logger.getLogger(loggerName);
}
我已经读过log4j维护记录器的缓存,所以在方法中创建一个记录器不会是一个开销我猜。
是的,我不喜欢传递记录器名称。那么我可以通过哪种方式或任何配置来实现上述场景或任何其他想法。
答案 0 :(得分:3)
您可以使用log4j的嵌套/映射诊断上下文(NDC或MDC)功能。实质上,这些是“带外”信息,这些信息存储在每个线程的基础上,并在执行日志操作时自动附加到日志记录事件。 NDC中的信息可以输出到日志文件中,也可以用于在appender之间路由日志消息,这正是您所需要的。您可以找到有关这些on the official wiki of log4j的更多信息。
在调用公共代码之前,您可以将服务名称或其他标识符存储到服务中的NDC中。然后,您可以配置log4j过滤器,以根据NDC中找到的服务名称将公共日志消息路由到相应的输出文件。公共代码甚至不需要修改。
答案 1 :(得分:0)
如果您的服务在不同的线程中运行,您可以检查当前线程并相应地选择记录器