問題:在Spark本地模式下初始化SparkContext後,我無法觀察到Log4J2的異步功能。在Spark Scala應用程序中使用Log4J2的異步記錄
Log4j2依賴於SBT:
"com.lmax" % "disruptor" % "3.3.5",
"org.apache.logging.log4j" % "log4j-api" % "2.8.2",
"org.apache.logging.log4j" % "log4j-core" % "2.8.2",
"org.apache.logging.log4j" %% "log4j-api-scala" % "2.8.2"
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>
我設置的IntelliJ
下面的系統屬性-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
爲了測試ASY nchronous行爲,我跑了下面的代碼片段之前和初始化SparkContext後:
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")
成功的結果:我能看到下面的調試行確認AsyncContext啓用2017-04-25 14:55:40,541 main DEBUG LoggerContext[[email protected], [email protected]] started OK.
。另外,我的打印行語句「Parsed ...」顯示在記錄器輸出中間的某處,表示異步行爲。
但是,一旦我在SparkContext初始化後移動了這個代碼塊,我不再是觀察者的異步活動。打印行語句「Parsed ...」始終顯示在記錄器輸出之後。令人困惑的是2017-04-25 14:55:40,541 main DEBUG LoggerContext[[email protected], [email protected]] started OK.
。仍然被觀察到。
爲了進行健全性檢查,我還在火花應用程序的範圍內打印了記錄器api的包。結果產生package org.apache.logging.log4j.scala, Apache Log4j Scala 2.11 wrapper for Log4j API, version 2.8.2
。根據Log4J2文檔,「og4j 2 Scala API依賴於Log4j 2 API」。因此,我相信我可以推斷出我實際上在使用Log4J2。
主要問題:是SPARK有時候會攔截我的LOG4J2配置並修改LOG4J配置,或者它不允許異常日誌行爲?
是的,看起來'AsyncLoggerContext'即使在執行者中也被使用。我看到行'2017-04-26 10:11:15,660 Executor任務啓動worker-7 DEBUG LoggerContext [name = DefaultAsyncContext @ Executor任務啓動worker-6,[email protected] ]開始確定。 10:11:15.662 [執行程序任務啓動工作人員-7] ERROR LoggingTestWithRDD - Hello'。但是,異步行爲不會發生。也許它與Spark本地模式有關.. –
問題可能出在你如何驗證異步行爲。嘗試一個更簡單的打印語句'println(「這是System.out.println」)'(不帶字符串插值),並將'for'循環中的迭代次數增加到10K或50K。 –
可能,不幸的是,沒有做到這一點 –