我需要在Pyspark中以编程方式知道,这是日志级别。
我知道我可以通过以下操作进行设置:
# spark is a SparkSession object
spark.sparkContext.setLogLevel(log_level)
但是没有等效的方法来检索日志级别。
有什么想法吗?谢谢!
Spark是开源的,对吗?源代码将向您显示文档中未包含的许多内容。并且单元测试将为您提供有关教程中未涵盖的内容的提示。
Demo:浏览the Spark project on Github并搜索setLogLevel
。
[确定,Github内部搜索通常很糟糕,但是在一个特定的关键字上值得尝试。确实,第一个答案确实是从单元测试(此处重置为分支2.4):
给出的有趣片段。val originalLevel = org.apache.log4j.Logger.getRootLogger().getLevel
try {
// Avoid outputting a lot of expected warning logs
spark.sparkContext.setLogLevel("error")
...
} finally {
spark.sparkContext.setLogLevel(originalLevel.toString)
...
}
setLogLevel
方法似乎是Log4J API的(非常薄的)包装器。就是这样:
def setLogLevel(logLevel: String) {
...
Utils.setLogLevel(org.apache.log4j.Level.toLevel(upperCased))
}
def setLogLevel(l: org.apache.log4j.Level) {
org.apache.log4j.Logger.getRootLogger().setLevel(l)
}
我终于通过访问Spark会话的JVM(下面的py4j)提出了一个解决方案:
def get_log_level(spark):
log_manager = spark._jvm.org.apache.log4j.LogManager
debug = spark._jvm.org.apache.log4j.Priority.DEBUG
info = spark._jvm.org.apache.log4j.Priority.INFO
warn = spark._jvm.org.apache.log4j.Priority.WARN
error = spark._jvm.org.apache.log4j.Priority.ERROR
logger = log_manager.getRootLogger()
if logger.isEnabledFor(debug):
return "DEBUG"
elif logger.isEnabledFor(info):
return "INFO"
elif logger.isEnabledFor(warn):
return "WARN"
elif logger.isEnabledFor(error):
return "ERROR"
else:
return None
最有可能是一种更好的方法。