我在python中有一个主脚本和其他模块文件,目前将它们全部放在一个文件夹中。我试图在各处注入日志记录消息,但是尽管我一直在阅读它,但我并不真正了解记录层次结构python。
-
所以只是要检查,因为这是我的测试发生的事情:如果我在主模块上配置了一个记录器,则只要我用
logging.getLogger(__name__)
调用记录器,就会将导入到此主模块导入的模块的记录自动加入其中,对吗?因此,导入的模块不必在子文件夹中或其他东西? -
我在脚本中使用pyspark,因此我按照Spark> 2.0中的建议创建一个Spark会话,并在模块中使用它。但是,我希望Spark Logger像脚本的记录器一样配置,并将其消息与我的模块的记录器一起输出到文件或我配置的任何处理程序。
到目前为止,我只能发现我可以通过
获得火花记录器log4jLogger = sc._jvm.org.apache.log4j
LOGGER = log4jLogger.LogManager.getLogger(__name__)
,但我不想将log4j用于记录,但相反。我希望Spark的记录器将其附加到我的记录器上,这将是父logger。
此外,即使我确实使用了Spark的Log4J,我也不想通过使用conf Directory中的static log4j.properties文件更改整个SPARK的记录配置,但是我想根据调用脚本来登录。
有什么办法做到这一点吗?如果不是,那么将这两个记录器组合为一种配置和输出的最佳方法是什么?
不可能将火花配置为向前日志到python logger -Python和Spark JVM是分开的过程。
但是,正如您所注意到的那样,您可以使用PY4J网关来记录从Pyspark到Log4J(仅在驱动程序上)的事件。您的log4j配置不需要所有脚本静态,您可以创建许多log4j配置并在运行时加载它们:
./bin/spark-submit --driver-java-options
'-Dlog4j.configuration=file:/tmp/custom_logging.properties' script.py
如果您使用yarn-cluster
在纱线内运行应用程序,请记住有关使用--files
发送配置文件的信息,例如:
./bin/spark-submit --master yarn --deploy-mode cluster
--driver-java-options '-Dlog4j.configuration=file:logging.properties'
--files /tmp/logging.properties script.py