Spark Custom Logging - PullRequest
       23

Spark Custom Logging

0 голосов
/ 04 июля 2019

У меня есть несколько искровых проектов в моей IDE. По умолчанию spark выбирает файл log4j.properties в папке spark / conf.

Поскольку у меня есть несколько проектов spark, я хочу иметь несколько файлов log4j.properties (для одного проекта). Возможно, как часть кода проекта (папка ресурсов)

Есть ли способ, которым мы можем забрать указанный log4j.properries вместо стандартного log4j.properties.

Примечание: Я попробовал это

--driver-java-options "-Dlog4j.configuration=file:///usr/local/Cellar/apache-spark/2.4.1/libexec/conf/driver_log4j.properties"

и все работало без проблем, однако я ищу что-то вроде ниже.

однако я хочу загрузить файл log4j.properties, который находится в папке ресурсов при создании искрового регистратора.

class SparkLogger():
    def __init__(self, app_name, sparksession = None):
        self._spark = sparksession
        self.log4jLogger = None

        if self._spark is not None:
            sparkContext =self._spark.sparkContext
            self.log4jLogger = sparkContext._jvm.org.apache.log4j
            self.log4jLogger = self.log4jLogger.LogManager.getLogger(app_name)

    def info(self, info):
        if self.log4jLogger:
            self.log4jLogger.info(str(info))

    def error(self, info):
        if self.log4jLogger:
            self.log4jLogger.error(str(info))

    def warn(self, info):
        if self.log4jLogger:
            self.log4jLogger.warn(str(info))

    def debug(self, info):
        if self.log4jLogger:
            self.log4jLogger.debug(str(info))

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вы должны определить application_name log свойства регистратора в log4j file. Когда вы вызываете метод get logger, используя applicaiton_name, вы можете получить доступ к генерации настраиваемых журналов приложений.

1 голос
/ 04 июля 2019

Я попытался создать свое собственное логирование так же, как вы описали в своем вопросе, но в итоге не получилось. Я должен сказать, что это была пустая трата времени.

Наконец, я выбрал java.util.logging вместо log4j. На самом деле это оригинальная утилита регистрации в JDK. Цель, которую я использую, заключается в том, что я хочу записывать информацию только для себя в указанный файл.

Так что класс как ниже.

package org.apache.spark.internal

import java.io.File
import java.text.SimpleDateFormat
import java.util.Date
import java.util.logging._

import scala.collection.mutable

protected [spark] object YLogger extends Serializable with Logging {

  private var ylogs_ = new mutable.HashMap[String, Logger]()

  private def initializeYLogging(className: String): Unit = {
    // Here we set log file onto user's home.
    val rootPath = System.getProperty("user.home")
    val logPath = rootPath + File.separator + className + ".log"
    logInfo(s"Create ylogger for class [${className}] with log file named [${logPath}]")
    val log_ = Logger.getLogger(className)
    val fileHandler = new FileHandler(logPath, false)
    val formatter = new Formatter {
      override def format(record: LogRecord): String = {
        val time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date)
        new StringBuilder()
          .append("[")
          .append(className)
          .append("]")
          .append("[")
          .append(time)
          .append("]")
          .append(":: ")
          .append(record.getMessage)
          .append("\r\n")
          .toString
      }
    }
    fileHandler.setFormatter(formatter)
    log_.addHandler(fileHandler)
    ylogs_.put(className, log_)
  }

  private def ylog(logName: String): Logger = {
    if (!ylogs_.contains(logName)) {
      initializeYLogging(logName)
    }
    ylogs_.get(logName).get
  }

  def ylogInfo(logName: String)(info: String): Unit = {
    if (ylog(logName).isLoggable(Level.INFO)) ylog(logName).info(info)
  }

  def ylogWarning(logName: String)(warning: String): Unit = {
    if (ylog(logName).isLoggable(Level.WARNING)) ylog(logName).warning(warning)
  }
}

И вы можете использовать его, как показано ниже.

YLogger.ylogInfo("logFileName") ("I am not a gay.")

Это довольно просто использовать, я надеюсь, что мой ответ может помочь вам.

...