【问题标题】:Spark: Separate spark logs from custom logsSpark:将 Spark 日志与自定义日志分开
【发布时间】:2016-10-24 12:08:50
【问题描述】:

我正在尝试构建一个使用 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

【问题讨论】:

  • 要隐藏 spark 日志记录,您可以在 log4j 配置中将 org.apache.spark 的记录器设置为高级别。例如错误。或者您可以定义一个不同的日志附加器,它输出到不同的位置并将其分配给 org.apache.spark
  • @ASpotySpot 我在问题中添加了 log4j 的配置文件。您能否建议我如何为 spark 日志定义不同的日志文件?
  • 您是否在纱线集群上使用提交火花作业。如果是,请提供您在火花提交时使用的命令。

标签: scala apache-spark log4j


【解决方案1】:

您可以轻松地为要以不同方式记录的不同定义不同的附加程序或使用不同的log4j附加程序。

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

上面文件的快速解释:

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

在您的示例中,您可以保留file 日志附加程序并定义日志级别和sparkappenderlog4j.logger,如上例所示。

【讨论】:

    【解决方案2】:

    不幸的是,我不确定如何使用属性文件来执行此操作。我只使用 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>
    

    这定义了一个将日志输出到名为 spark.log 的文件的附加程序。 然后使用它:

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

    我希望查看有关如何将其转换为使用“不应该”属性格式的文档。

    【讨论】:

    • 将其转换为 .properties 格式不会有问题。但这不只是为日志设置输出文件,而不是在代码中为 spark 日志和我的自定义日志设置单独的输出文件吗?
    • 你还有你的默认附加程序,它仍然附加到控制台。在这里,尽管您使用 appender ref 而不是回退到 root logger 来引用您想要使用 spark-file appender 的 spark 包。我认为这大致就是它的工作原理。您可能会得到重复的日志,因为您的 spark 日志也可能出现在您的根日志中。在这种情况下,stackoverflow.com/questions/13627235/… 可能会有所帮助。
    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 2017-06-26
    • 2018-09-17
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多