如何将记录器添加到LogContext



我将编写一个Hadoop2.x MapReduce程序。通常,日志或MapReduce作业的Mapper或Reducer的任何输出都记录在YARN应用程序日志中。但我最感兴趣的是Mapper内部发生的事情。因此我想在Mapper中使用log4j2来登录到每个数据节点上的一个单独的本地文件

我的计划是在Mapper的开头初始化org.apache.logging.log4j.core.LoggerContext,这样我就可以重新配置一个单独的日志文件,然后初始化org.apache.logging.log4j.Logger。问题是两者都已成功初始化,但它们没有相互连接。此外,只有调用hadoop作业的节点初始化了空日志文件。

我的问题是:

  • 为什么只有调用Hadoop作业的节点初始化了空日志文件,而其他节点没有初始化,尽管我确信其他节点也有映射程序
  • 如何将记录器添加到初始化的日志上下文

默认的ContextSelector是ClassLoaderContextSelector,它根据所使用的ClassLoader创建LoggerContext。对getLogger()的每次调用都会进行检查以确定getLogger调用方的ClassLoader,并使用与该类ClassLoader关联的LoggerContext。

如果每个映射器都有自己的ClassLoader,那么每个映射器将有自己的LoggerContext。但每个LoggerContext都必须能够定位其配置并对其进行初始化。如果log4j2.xml不在ClassLoader(或其父级)的类路径上,那么它将使用默认配置,这可能不是您想要的。

我还没有写过Mapper,也不太熟悉它,但根据您的描述,我想说您可能想做的是使用Configurator类初始化每个Mapper中的日志记录,并传入您想要使用的配置。请注意,您不应该让配置尝试写入相同的文件。你要么必须使用文件锁定,要么你可能会得到损坏的文件。

最新更新