2017-04-25 1 views
4

Das Problem: Ich kann die asynchronen Funktionen von Log4J2 nach der Initialisierung von SparkContext im lokalen Spark-Modus nicht beobachten.Asynchrone Protokollierung mit Log4J2 in der Spark-Scala-Anwendung

Log4j2 Abhängigkeiten in 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 Konfigurationsdatei:

<?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> 

ich die folgende Systemeigenschaft in IntelliJ Set

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

asy Um zu testen, nchronous Verhalten, lief ich den folgenden Code-Schnipsel vor und nach SparkContext Initialisierung:

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") 

Erfolgreiches Ergebnis: Ich konnte die folgende Debug-Zeile, um zu sehen, bestätigt AsyncContext 2017-04-25 14:55:40,541 main DEBUG LoggerContext[[email protected], [email protected]] started OK. aktiviert war. Darüber hinaus wird meine Druckzeilenanweisung "Parsed ..." irgendwo in der Mitte der Loggerausgabe angezeigt, was auf asynchrones Verhalten hinweist.

Sobald ich jedoch diesen Codeblock nach der SparkContext-Initialisierung verschoben habe, beobachte ich nicht mehr Async-Aktivität. Die Druckzeilenanweisung "Parsed ..." wird immer nach der Ausgabe des Loggers angezeigt. Was verwirrend ist, ist das 2017-04-25 14:55:40,541 main DEBUG LoggerContext[[email protected], [email protected]] started OK.. wird immer noch beobachtet.

Für eine Plausibilitätsprüfung habe ich auch das Paket des Loggers api im Rahmen der Funkenanwendung ausgedruckt. Das Ergebnis ergab package org.apache.logging.log4j.scala, Apache Log4j Scala 2.11 wrapper for Log4j API, version 2.8.2. Laut den Log4J2-Dokumenten ist "og4j 2 Scala API von der Log4j 2-API abhängig." Daher glaube ich, dass ich folgern kann, dass ich tatsächlich Log4J2 verwende.

HAUPTFRAGE: FUNKTIONIERT SICH SPARK SOFORT AUF MEINE LOG4J2-KONFIGURATION UND DEFAULTIEREND AUF SEINE LOG4J-KONFIGURATION ODER ERLAUBT ES NICHT ASYNC-LOGGING-VERHALTEN?

Antwort

1

Die einzige Sache, die Sie sicherstellen sollten, ist, dass die Systemeigenschaft gesetzt ist, bevor Log4j2 initialisiert wird.

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

Es scheint mir, dass dies richtig gemacht: Wenn Sie, dass ein AsyncLoggerContext dann können Sie sicher sein, verwendet wird, sehen Sie Disruptor-backed Async Loggers verwenden.

+0

Ja, es erscheint 'AsyncLoggerContext' auch in den Executoren. Ich sehe die Zeilen "2017-04-26 10: 11: 15,660 Executor Taskstart Worker-7 DEBUG LoggerContext [Name = DefaultAsyncContext @ Executor Aufgabe starten Sie Worker-6, [email protected] ] begann OK. 10: 11: 15.662 [Executor Task Start Worker-7] FEHLER LoggingTestWithRDD - Hallo. Asynchrones Verhalten tritt jedoch nicht auf. Vielleicht hat es etwas mit lokalem Spark-Modus zu tun. –

+0

Das Problem liegt wahrscheinlich darin, wie Sie versuchen, asynchrones Verhalten zu überprüfen. Versuchen Sie eine einfachere println-Anweisung ("This is System.out.println") (ohne String-Interpolation), und erhöhen Sie die Anzahl der Iterationen in der for-Schleife auf 10K oder 50K. –

+0

potenziell, leider hat das nicht den Trick –

Verwandte Themen