如何以编程方式获取Pyspark中的日志级别

问题描述 投票:0回答:2

我需要在Pyspark中以编程方式知道,这是日志级别。

我知道我可以通过以下操作进行设置:

# spark is a SparkSession object
spark.sparkContext.setLogLevel(log_level)

但是没有等效的方法来检索日志级别。

有什么想法吗?谢谢!

apache-spark pyspark log4j
2个回答
0
投票

Spark是开源的,对吗?源代码将向您显示文档中未包含的许多内容。并且单元测试将为您提供有关教程中未涵盖的内容的提示。

Demo:浏览the Spark project on Github并搜索setLogLevel

[确定,Github内部搜索通常很糟糕,但是在一个特定的关键字上值得尝试。确实,第一个答案确实是从单元测试(此处重置为分支2.4)

给出的有趣片段。

https://github.com/apache/spark/blob/branch-2.4/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/HiveMetastoreLazyInitializationSuite.scala

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的(非常薄的)包装器。

就是这样:

https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/SparkContext.scala

def setLogLevel(logLevel: String) {
  ...
  Utils.setLogLevel(org.apache.log4j.Level.toLevel(upperCased))
}

https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/util/Utils.scala

def setLogLevel(l: org.apache.log4j.Level) {
  org.apache.log4j.Logger.getRootLogger().setLevel(l)
}

0
投票

我终于通过访问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

最有可能是一种更好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.