我的IDE中有多个spark项目。默认情况下,spark会在spark / conf文件夹中选择log4j.properties文件。
由于我有多个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))
答案 0 :(得分:1)
我已经尝试构建自己的自定义日志记录,就像您在问题中所描述的那样,但是最后失败了。我不得不说这完全是浪费。
最后,我选择了java.util.logging而不是log4j。实际上,它是JDK中的原始Logging实用程序。我使用它的目的是我只想将自己的信息记录到指定的文件中。
因此,该类如下所示。
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.")
使用非常简单,希望我的回答对您有所帮助。
答案 1 :(得分:1)
您必须在application_name log
中定义log4j file
记录器属性。当您使用applicaiton_name
调用get logger方法时,您将能够访问自定义的基于应用程序的日志生成。