2016-10-24 3 views
1

Ich versuche, eine Anwendung zu erstellen, die log4j verwendet, um Protokolldateien zu erstellen. Der Speicherort der Protokolldatei wird durch log4j.properties Datei bereitgestellt.Spark: Separate Spark-Protokolle von benutzerdefinierten Protokollen

Bisher funktioniert es gut, aber ich möchte die Spark-Protokolle von den Protokollen, die ich aus meinem Code generieren, trennen. Oder zumindest meine Log-Nachrichten in der Log-Datei ausdrucken.

Gibt es eine Möglichkeit, das zu tun?

log4j.properties

# Root logger option 
log4j.rootLogger=INFO, stdout, file 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

# Redirect log messages to a log file 
log4j.appender.file=org.apache.log4j.rolling.RollingFileAppender 
log4j.appender.file.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy 
log4j.appender.file.rollingPolicy.fileNamePattern=../log/abc%d{yyyyMMdd_HHmmss}.log 
    log4j.appender.file.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy 
log4j.appender.file.TriggeringPolicy.maxFileSize=5000000 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 
+0

Um die Funkenprotokollierung einfach zu verbergen, können Sie den Logger für org.apache.spark auf eine hohe Ebene in Ihrer log4j-Konfiguration setzen. zB FEHLER. Oder Sie könnten einen anderen Log-Appender definieren, der an einen anderen Ort ausgibt und diesen org.apache.spark zuweist –

+0

@ASpotySpot Ich habe die Konfigurationsdatei für log4j in der Frage hinzugefügt. Könnten Sie mir vorschlagen, wie ich eine andere Protokolldatei für die Funkenprotokolle definieren kann? – Amber

+0

verwendest du das Einreichen eines Funkenjobs auf Garncluster. Wenn ja kannst du bitte die Befehle angeben, die du benutzt hast, während der Funke einreicht. –

Antwort

0

Leider bin ich nicht sicher, wie es zu tun, um die Eigenschaften-Datei. Ich habe log4j nur mit XML konfiguriert.

jedoch in XML können Sie den folgenden auf einen ‚Standard‘ Config hinzu:

<appender name="spark-file" class="org.apache.log4j.FileAppender"> 
    <param name="File" value="spark.log" /> 
    <param name="Append" value="true" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> 
     </layout> 
</appender> 

Dies definiert eine appender das wird Ausgabeprotokolle in eine Datei namens spark.log. Dann, es zu benutzen:

<logger name="org.apache.spark" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="spark-file" /> 
</logger> 

ich lookinginto die Dokumentation erwarten, wie dies wandeln die Eigenschaften Format ‚sollte nicht‘ zu benutzen, zu schwierig.

+0

Die Konvertierung in das .properties-Format ist kein Problem. Aber würde das nicht nur die Ausgabedatei für die Protokolle festlegen, statt separate Ausgabedateien für Sparklogs und meine benutzerdefinierten Protokolle im Code festzulegen? – Amber

+0

Sie haben auch Ihren Standard-Appender, der noch an die Konsole angehängt wird.Hier verwenden Sie jedoch Appender-Ref, anstatt auf Root-Logger zurückzufallen, um auf das für das Funke-Paket zu verweisen, das Sie mit Spark-File Appender verwenden möchten. Ich denke, das ist ungefähr so, wie es funktioniert. Sie können doppelte Protokolle erhalten, da Ihre Funkenprotokolle auch in Ihren Stammprotokollen angezeigt werden. In diesem Fall können http://stackoverflow.com/questions/13627235/log4j-multiple-loggers-levels-and-appenders helfen. –

0

können Sie leicht verschiedene Appen für verschiedene Pakete definieren Sie anders oder mit unterschiedlichen log4j Appen anmelden möchten.

Beispiel log4j.properties:

# Set root logger level to DEBUG and its only appender to A1. 
log4j.rootLogger=INFO, A1, sparkappender 

# A1 is set to be a ConsoleAppender. 
log4j.appender.A1=org.apache.log4j.ConsoleAppender 

# A1 uses PatternLayout. 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=%-4r [%t]%-5p %c %x - %m%n 

# org.apache.spark package will log TRACE logs 
log4j.logger.org.apache.spark=TRACE, sparkappender 
log4j.logger.org.spark_project.jetty=ERROR, sparkappender 
log4j.additivity.org.apache.spark=false 

log4j.appender.sparkappender=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.sparkappender.datePattern='-'dd'.log' 
log4j.appender.sparkappender.File=log/spark-logs.log 
log4j.appender.sparkappender.layout=org.apache.log4j.PatternLayout 
log4j.appender.sparkappender.layout.ConversionPattern=%-4r [%t]%-5p %c %x - %m%n 

Kurze Erklärung der Datei oben:

Mit sparkappender appender log4j protokolliert alle Protokolle in Datei log/spark-logs.log. Alle Protokolle, die nicht von der Klasse in Paket org.apache.spark oder erzeugt werden, werden in der Konsole protokolliert. Diese Pakete haben auch verschiedene Protokollebene, aber die gleichen log4j Appender - sparkappender

In Ihrem Beispiel können Sie file lügen appender halten und Protokollebene und sparkappender-log4j.logger wie in Beispiel oben definieren.

Verwandte Themen