如何在Log4j2中为Logger添加appender

9
在Log4j 1.2中,您可以简单地获取一个记录器并在运行时添加一个appender。这对于测试目的非常方便。我们曾经创建了一个模拟appender并将其添加到记录器中。随后,我们可以进行不同的断言。
那么,在log4j2中等价的操作是什么?
例如,此example展示了其他人如何添加测试appender。 log4j2页面显示了一些关于如何添加appender的示例。但是,它们将appender添加到整个上下文,似乎与为一个特定的logger添加appender不同。
另一个观察是,如果您使用org.apache.logging.log4j.core.Logger而不是org.apache.logging.log4j.Logger,则仍然可以添加appender。但是大多数人使用org.apache.logging.log4j.Logger。实际上,LogManager返回org.apache.logging.log4j.Logger的实例。因此,我不确定如何连接这两个类,是否应该连接它们。
另一个观察是,如果我调用
      LogManager.getContext().getConfiguration().getLoggers()

我可以获取上下文中所有 LoggerConfig 对象的列表。然后,我会向任何 LoggerConfig 对象添加 appenders。但问题是,如何获取与 org.apache.logging.log4j.Logger 实例相关联的 LoggerConfig?这让我感到困惑。
1个回答

15

org.apache.logging.log4j.Logger是位于log4j-api模块中的接口。org.apache.logging.log4j.core.Logger是一个具体类(实现了上述接口),它位于log4j-core模块中。

LogManager(也在log4j-api模块中)返回实现org.apache.logging.log4j.Logger接口的内容,如果类路径中包含log4j-core模块,则返回的实例会是org.apache.logging.log4j.core.Logger

因此,您可以将返回的Logger强制转换为org.apache.logging.log4j.core.Logger并添加Appender。

每个核心Logger都有一个LoggerConfig(1对1关系)。您可以通过它们具有相同名称来查找对应于所需Logger的LoggerConfig。


谢谢。这就解决了。 - Klaus
我如何设置正在添加的appender的日志级别? - JimN
3
这是对我有效的方法。Logger logger = LogManager.getLogger(TheClassYouWantLogsOf.class); org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger; UnitTestAppender appender = new UnitTestAppender(); //你的自定义日志记录器 appender.start(); coreLogger.get().addAppender(appender, Level.ERROR, null); - Dilini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接