【问题标题】:Configuring Apache Spark Logging with Scala and logback使用 Scala 和 logback 配置 Apache Spark 日志记录
【发布时间】:2017-07-10 11:02:12
【问题描述】:

我对使用 Apache Spark 设置日志记录感到非常困惑。 Apache spark 使用 Log4j 进行日志记录,它会生成大量的日志数据。 有没有办法为 spark 日志设置 log4j 并为应用程序日志使用 logback。我对 logback 非常熟悉,但 似乎 spark 只支持 log4j。 在我介绍 apache spark 之前,下面的代码运行良好。这方面的任何帮助都会有所帮助。

import com.typesafe.scalalogging.LazyLogging

import scala.util.{Failure, Success}
import scala.xml.{Elem, XML}



object MainApp extends App with LazyLogging  {



  val currency = new YahooCurrencyLoader() with CurrencyParameters
  val ccy = currency.getXML(currency.ccyUrl) match {

    case Success(v) => XML.save("PreviousRun.xml",v); logger.info("XML has been saved for use")
    case Failure(ex) => logger.error("XML extraction failed. Look at Yahoo extraction class. ${ex.getMessage}" )

  }

  val xmllocation: String = "./PreviousRun.xml"
  val loadxml: Elem = XML.loadFile(xmllocation)
  //print(loadxml)
  //print(currency.findCurrency(loadxml,"GBP"))

  logger.info("USD CAD Cross is " + currency.findCurrency(loadxml,"CAD").head)

【问题讨论】:

标签: scala apache-spark log4j2 logback


【解决方案1】:

我不知道你是使用sbt 还是maven,但这就是一切的开始。我自己使用sbt,所以我会给你一个例子,我们是如何解决这个问题的。

  1. Apache Spark 使用 log4j 1.2.xx

确实如此,如果您不想使用相同的日志记录实现,这确实是个问题。但是有帮助!

首先,从spark 依赖项中排除以下库:

  • log4j
  • slf4j-log4j12

对于sbt(使用sbt-assembly),它看起来像这样:

lazy val spark16 = Seq("spark-core", "spark-sql", "spark-hive")
  .map("org.apache.spark" %% _ % "1.6.1")
  .map(_.excludeAll(
    ExclusionRule(name = "log4j"),
    ExclusionRule(name = "slf4j-log4j12")
  ))
  1. 将 log4j 日志重定向到 slf4j

详细说明可以在这里找到:https://www.slf4j.org/legacy.html
我们感兴趣的模块是:log4j-over-slf4j

log4j-over-slf4j 模块包含最广泛使用的 log4j 类的替换,即 org.apache.log4j.Category、org.apache.log4j.Logger、org.apache.log4j.Priority、org.apache.log4j.Level、 org.apache.log4j.MDC 和 org.apache.log4j.BasicConfigurator。 这些替换类将所有工作重定向到其对应的 SLF4J 类。

所以我们可以将所有日志重定向回slf4j,其他日志记录实现可以从那里获取它。

简单,只需将此依赖项添加到您的应用程序中

"org.slf4j" % "log4j-over-slf4j" % "1.7.25"
  1. 添加所需的日志记录实现

在我们的例子中,它是(和你的一样)logback,所以我们将它添加为依赖项:

"ch.qos.logback" % "logback-classic" % "1.2.3"

将一些 logback.xml 配置添加到您的类路径中,例如在 src/main/resources 中并享受吧!

火花提交

如果您在使用spark-submit 部署您的应用程序时需要使用Logback 的帮助,请遵循以下答案:https://stackoverflow.com/a/45480145/1549135

【讨论】:

    【解决方案2】:

    我使用了以下导入:

    import org.slf4j.Logger
    import org.slf4j.LoggerFactory
    

    示例代码如下所示。

    Object SparkCode {
    
    val logger = LoggerFactory.getLogger(this.getClass.getName)
    
      def main(args: Array[String]) {
    
      logger.info("Connection Started . ")
    
      // Create Spark Context and go on..
    
      }
    
    }
    

    你已经排序了。

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 1970-01-01
      • 2016-01-14
      • 2022-11-07
      • 2017-05-06
      • 2011-12-29
      • 2014-10-25
      • 2014-07-18
      • 2015-01-09
      相关资源
      最近更新 更多