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

Java 记录层次结构并将Spark log4j记录器附加到该层次结构,java,python,logging,apache-spark,pyspark,Java,Python,Logging,Apache Spark,Pyspark,我有一个python主脚本和其他模块文件,目前都在一个文件夹中。 我现在尝试在任何地方都注入日志消息,但我并不真正理解python的日志层次结构,尽管我一直在阅读它 所以,请检查一下,因为这是我测试中发生的事情: 如果我在我的主模块上配置了一个记录器,那么只要我使用logging.getLogger(\uuuu name\uuuu)调用记录器,我导入到这个主模块的模块的日志就会自动附加到它上面,对吗?所以导入的模块不必在子文件夹或其他地方 我在脚本中使用PySpark,因此我按照Spark>2.

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

  • 所以,请检查一下,因为这是我测试中发生的事情: 如果我在我的主模块上配置了一个记录器,那么只要我使用
    logging.getLogger(\uuuu name\uuuu)
    调用记录器,我导入到这个主模块的模块的日志就会自动附加到它上面,对吗?所以导入的模块不必在子文件夹或其他地方

  • 我在脚本中使用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的日志记录配置,但我想根据调用脚本进行日志记录


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

    不可能将spark配置为将日志转发到python记录器-python和spark jvm是分开的进程

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

    ./bin/spark-submit --driver-java-options \
         '-Dlog4j.configuration=file:/tmp/custom_logging.properties' script.py
    
    如果您使用
    纱线群集
    在纱线内部运行应用程序,请记住使用
    --文件
    发送配置文件,例如:

    ./bin/spark-submit --master yarn --deploy-mode cluster \
        --driver-java-options '-Dlog4j.configuration=file:logging.properties' \
        --files /tmp/logging.properties script.py
    

    欢迎来到堆栈溢出!你的帖子很好,所以没有必要为你刚开始的时候是初学者而道歉(我已经为你编辑了)。祝你好运找到答案!我明白了,谢谢。不过,从措辞上可以肯定:我理解将spark自身配置为转发日志是不可能的,但这是否意味着也不可能配置属性文件并通过py4j网关从python捕获这些消息?此外,如果我使用Spark的py4j,如果我通过
    getLogger(\uuuu name\uuuu)
    调用每个模块上的记录器,它在层次结构方面是否也会与python一样工作?最后,我可以在模块的开头获取记录器,还是需要先创建一个SparkContext?啊,是的,还有一个问题:如果我导入模块,同时导入顶部的记录器,然后从主模块获取根记录器,py4j是否也会禁用现有记录器?或者,调用spark submit时,配置从一开始就完成了,这不重要吗?更重要的是,如果上下文在主模块中,我如何在子模块中导入py4j记录器?好的,所以我尝试使用log4j记录器处理消息。我将配置文件添加到提交参数中,它确实找到了它。我使用了spark的默认属性模板,带有
    rootCategory=INFO
    ,但是每次运行脚本时,我都会收到消息
    在开始时将默认日志级别设置为“WARN”。
    。如果我更改此自定义属性文件详细部分的格式或其他选项,例如
    log4j.logger.org.spark_project.jetty=INFO
    ,它们会显示出来,但rootLogger仍处于警告状态,我看不到自定义信息消息。无法将日志消息从python日志模块捕获到log4j,在驱动程序上,您可以通过py4j调用log4j。如果spark上下文位于主应用程序模块中,则获取log4j logger对象并将其传递给子模块,日志应该可以工作。此
    将默认日志级别设置为“WARN”
    消息来自
    pyspark shell
    ,使用
    spark submit
    完全加载请求的log4j.properties.OK,再次非常感谢。我还没有在集群上尝试它,因为它还没有准备好。目前,我只能在Windows上使用Eclipse环境。因此,我将
    --master local[*]--queue PyDevSpark2.0.1--driver java options“-Dlog4j.configuration=file:C:/log4j.properties“pyspark shell
    添加到
    pyspark\u SUBMIT\u ARGS
    环境变量中,我得到了第一条消息。如果我将
    pyspark shell
    更改为
    spark submit
    ,或将其完全删除,则会出现异常:
    Java网关进程在向驱动程序发送其端口号之前退出。你知道我怎样才能在这里工作吗?