Scala Spark:将Spark日志与自定义日志分开

Scala Spark:将Spark日志与自定义日志分开,scala,apache-spark,log4j,Scala,Apache Spark,Log4j,我正在尝试构建一个使用log4j生成日志文件的应用程序。日志文件的位置通过log4j.properties文件提供 到目前为止,它工作得很好,但我想将spark日志与我从代码生成的日志分开。或者至少在日志文件中打印我的日志消息 有办法吗 log4j.properties # Root logger option log4j.rootLogger=INFO, stdout, file log4j.appender.stdout=org.apache.log4j.ConsoleAppender lo

我正在尝试构建一个使用log4j生成日志文件的应用程序。日志文件的位置通过log4j.properties文件提供

到目前为止,它工作得很好,但我想将spark日志与我从代码生成的日志分开。或者至少在日志文件中打印我的日志消息

有办法吗

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

不幸的是,我不知道如何使用属性文件来完成它。我只使用xml配置了log4j

但是,在XML中,您可以将以下内容添加到“标准”配置中:

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

这定义了一个appender,它将日志输出到名为spark.log的文件中。 然后使用它:

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


我希望在文档中查找如何将其转换为使用属性格式“不应该”会太困难。

您可以轻松地为不同的包定义不同的appender,或者使用不同的
log4j
appender进行登录

log4j.属性的示例

# 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
快速解释上述文件:

使用
sparkappender
appender
log4j
将所有日志记录到文件
log/spark logs.log
。包
org.apache.spark
org.apache_project.jetty
中非类生成的所有日志都记录到控制台中。这些包也具有不同的日志级别,但具有相同的log4j appender-
sparkappender


在您的示例中,您可以保留
文件
log appender并定义日志级别和
sparkappender
log4j.logger
,就像上面的示例一样。

要隐藏spark日志记录,您可以在log4j配置中将org.apache.spark的记录器设置为高级别。例如错误。或者您可以定义一个不同的日志追加器,将输出到不同的位置,并将其分配给org.apache。spark@ASpotySpot我在问题中添加了log4j的配置文件。您能建议我如何为spark日志定义不同的日志文件吗?您是否在纱线簇上使用提交spark作业。如果是,请提供spark提交时使用的命令。将其转换为.properties格式不会有问题。但这不就是为日志设置输出文件,而不是在代码中为spark日志和我的自定义日志设置单独的输出文件吗?您还有默认的appender,它仍然附加到控制台。在这里,您使用appender ref,而不是返回到根记录器,以引用您想要使用spark文件appender的spark包。我想这大概就是它的工作原理。您可能会得到重复的日志,因为spark日志也可能出现在根日志中。在这种情况下可能会有所帮助。