2017-04-25 86 views
4

問題:在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配置,或者它不允許異常日誌行爲?

回答

1

你應該確認的唯一的事情是系統屬性設置爲之前 Log4j2被初始化。

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

在我看來,這是正確完成:如果你可以看到一個AsyncLoggerContext被使用,則可以確保您使用干擾器支持異步記錄儀。

+0

是的,看起來'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本地模式有關.. –

+0

問題可能出在你如何驗證異步行爲。嘗試一個更簡單的打印語句'println(「這是System.out.println」)'(不帶字符串插值),並將'for'循環中的迭代次數增加到10K或50K。 –

+0

可能,不幸的是,沒有做到這一點 –

相關問題