记录层次结构并将Spark log4j记录器附加到i

2024-04-19 21:03:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中有一个主脚本和其他模块文件,它们现在都在一个文件夹中。 我现在正试图将日志消息注入到任何地方,但是我并不真正理解python的日志层次结构,尽管我一直在阅读它。在

  1. 所以我来检查一下,因为我的测试结果是这样的: 如果我在我的主模块上配置一个记录器,我导入到这个主模块的模块的日志记录会自动附加到它后面,只要我用logging.getLogger(__name__)调用记录器,对吗?所以导入的模块不必在子文件夹或其他地方?

  2. 我在脚本中使用PySpark,因此按照Spark>;2.0中的建议创建一个Spark会话,并在我的模块中使用它。但是,我希望Spark logger的配置与脚本的logger类似,并将其消息与模块的logger一起输出到一个文件或我配置的任何处理程序中。

直到现在我才发现我能把火花记录器弄通

log4jLogger = sc._jvm.org.apache.log4j
LOGGER = log4jLogger.LogManager.getLogger(__name__)

但我不想在日志中使用log4j,相反。我希望Spark的记录器被附加到我的记录器中,这将是父记录器。在

另外,即使我使用了Spark的log4j,我也不想通过使用conf目录中的静态log4j.properties文件来更改整个Spark的日志配置,但是我希望根据调用脚本进行日志记录。在

有办法吗?如果没有,那么将这两个记录器组合成一个配置和输出的最佳方法是什么?在


Tags: 模块文件name脚本文件夹消息地方记录
1条回答
网友
1楼 · 发布于 2024-04-19 21:03:29

配置spark将日志转发到python logger是不可能的-python和sparkjvm是分开的进程。在

但是,正如您所注意到的,您可以使用py4j网关将事件从pyspark记录到log4j(仅在驱动程序上)。您的log4j配置不需要对所有脚本都是静态的,您可以创建许多log4j配置并在运行时加载它们:

./bin/spark-submit  driver-java-options \
     '-Dlog4j.configuration=file:/tmp/custom_logging.properties' script.py

如果您使用yarn-cluster在YARN内部运行应用程序,请记住使用 files发送配置文件,例如:

^{pr2}$

相关问题 更多 >