【问题标题】:Adding logs to Airflow Logs将日志添加到 Airflow 日志
【发布时间】:2017-02-28 10:46:30
【问题描述】:

如何将我自己的日志添加到自动生成的 Apache Airflow 日志中?任何打印语句都不会在那里登录,所以我想知道如何添加我的日志以便它也显示在 UI 上?

【问题讨论】:

    标签: python-3.x logging airflow etl


    【解决方案1】:

    如果您查看 PythonOperator:https://github.com/apache/incubator-airflow/blob/master/airflow/operators/python_operator.py#L80-L81,似乎无法将 Python 可调用的 STDOUT/STDERR 记录到气流日志中。

    但是,如果您查看 BashOperator:https://github.com/apache/incubator-airflow/blob/master/airflow/operators/bash_operator.py#L79-L94,则会从那里记录 STDOUT/STDERR 以及气流日志。因此,如果日志对您很重要,我建议将 python 代码添加到单独的文件中并使用 BashOperator 调用它。

    【讨论】:

    • 您可以在 Python 中只使用import logging,然后执行logging.info('whatever logs you want'),这将写入 Airflow 日志。您无需通过 BashOperator 调用您的 Python 代码,只需使用 PythonOperator。这在 Ivan Gozali 的上述答案中得到了展示,该答案是在这个答案之后写的:)
    【解决方案2】:

    我认为您可以通过使用日志记录模块并将配置信任 Airflow 来解决此问题。

    类似:

    import ...
    
    dag = ...
    
    def print_params_fn(**kwargs):
        import logging
        logging.info(kwargs)
        return None
    
    print_params = PythonOperator(task_id="print_params",
                                  python_callable=print_params_fn,
                                  provide_context=True,
                                  dag=dag)
    

    【讨论】:

    • 我仍然只看到*** Reading local file: /home/ubuntu/airflow/logs/<dagname>/<taskname>/2019-08-30T17:26:27.272086+00:00/1.log,而我的日志语句中没有包含任何内容。
    • @benten 在遵循此解决方案中的建议后,我也看不到日志消息中包含的内容。你知道如何让记录器工作吗?
    【解决方案3】:

    在 Python 内部可调用 PythonOperator,您可以使用:

    import logging
    
    LOGGER = logging.getLogger("airflow.task")
    LOGGER.info("airflow.task >>> 2 - INFO logger test")
    

    这将产生正确的输出,例如:

    [2019-12-26 09:42:55,813] {operations.py:86} INFO - airflow.task >>> 2 - INFO logger test
    

    对于您的自定义记录器:

    LOGGER = logging.getLogger(__name__)
    LOGGER.info("__name__ >>> 2 - INFO logger test")
    

    你会得到重复的格式:

    [2019-12-26 09:42:55,813] {logging_mixin.py:112} INFO - [2019-12-26 09:42:55,813] {operations.py:79} INFO - __name__ >>> 2 - INFO logger test
    

    【讨论】:

    • 这如何与 python 模块一起工作?例如,如果我的 callable 从我编写和导入的模块中调用一个函数,那么应该如何设置该模块中的日志记录?现在我调用 logging.getLogger(),我得到了你描述的重复格式。
    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2021-08-08
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多