在Spark Scala应用程序中使用Log4J2进行异步日志记录

时间:2017-04-25 22:31:40

标签: apache-spark log4j sbt spark-streaming log4j2

问题:在Spark本地模式下初始化SparkContext后,我无法观察到Log4J2的异步功能。

SBT中的Log4j2依赖项:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
<Appenders>
    <Console name="Console-Appender" target="SYSTEM_OUT">
        <PatternLayout>
            <pattern>
                [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
            </pattern>>
        </PatternLayout>
    </Console>
    <File name="File-Appender" fileName="logs/xmlfilelog.log" >
        <PatternLayout>
            <pattern>
                [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
            </pattern>
        </PatternLayout>
    </File>
</Appenders>
<Loggers>
    <Logger  name="guru.springframework.blog.log4j2async" level="debug">
        <AppenderRef ref="File-Appender"/>he preceding c
    </Logger>
    <Root level="debug">
        <AppenderRef ref="Console-Appender"/>
    </Root>
</Loggers>

Log4j2配置文件:

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

我在IntelliJ

中设置了以下系统属性
val start = System.nanoTime()

for(i <- 1 to 1000) {
  logger.error("Hello")
}

val end = System.nanoTime()
val timeMS = (end - start)/1000000
println(s"Parsed ${iterations} reports in ${timeMS} ms ${timeMS/1000} sec")

为了测试异步行为,我在初始化SparkContext之前和之后运行了以下代码片段:

2017-04-25 14:55:40,541 main DEBUG LoggerContext[name=AsyncContext@6d9c638, org.apache.logging.log4j.core.async.AsyncLoggerContext@758f4f03] started OK.

成功的结果:我能够看到以下调试行确认启用了AsyncContext 2017-04-25 14:55:40,541 main DEBUG LoggerContext[name=AsyncContext@6d9c638, org.apache.logging.log4j.core.async.AsyncLoggerContext@758f4f03] started OK.。此外,我的打印行声明“Parsed ...”显示在记录器输出的中间某处,表示异步行为。

但是,一旦我在SparkContext初始化之后移动了这个代码块,我就不再观察到异步活动了。记录器输出后始终显示打印行语句“Parsed ...”。令人困惑的是package org.apache.logging.log4j.scala, Apache Log4j Scala 2.11 wrapper for Log4j API, version 2.8.2。仍然观察到。

为了进行健全性检查,我还在spark应用程序的范围内打印了logger api的包。结果产生了{{1}}。根据Log4J2文档,“og4j 2 Scala API依赖于Log4j 2 API。”因此,我相信我可以推断出我实际上在使用Log4J2。

主要问题:SPARK有哪些如何解释我的LOG4J2配置并违反其LOG4J配置,还是不允许ASYNC记录行为?

1 个答案:

答案 0 :(得分:1)

您应该确保唯一的事情是在 Log4j2初始化之前设置系统属性。

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

在我看来,这是正确完成的:如果您看到使用了AsyncLoggerContext,那么您可以确定使用的是Disruptor支持的异步记录器。