Airflow + python日志记录模块未写入日志文件

时间:2019-08-31 20:05:05

标签: python logging airflow

尝试将“ hello world”写入气流日志(airflow 1.10.3)。基于herehere提出的SO解决方案,我应该能够只使用import logginglogging.info('hello world')。这似乎对我不起作用。

import logging
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python_operator import PythonOperator

default_args = {
    'owner': 'benten',
    'depends_on_past': False,
    'start_date': datetime(2019, 7, 25),
    'email_on_failure': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=1),
    }

def logging_is_fun():
    logging.debug("hellow world")
    logging.info("hello world")
    logging.critical("hello world")
    return None

with DAG('fun_logs', schedule_interval='45 * * * *', default_args=default_args) as dag:
    log_task = PythonOperator(python_callable=logging_is_fun, task_id='log_test_task')

我手动触发了dag,任务执行没有问题。但是可惜的是,当我检查日志时,我看到的是:

*** Reading local file: /home/ubuntu/airflow/logs/fun_logs/log_test_task/2019-08-31T19:22:49.653712+00:00/1.log

令人惊奇的“ hello world”语句在哪里?鉴于我的日志级别设置,我不希望看到所有这些语句。我确实希望看到关键信息。

我的airflow.cfg中包含以下内容(据我所知,所有默认设置):

# The folder where airflow should store its log files
# This path must be absolute
base_log_folder = /home/ubuntu/airflow/logs

# Airflow can store logs remotely in AWS S3, Google Cloud Storage or Elastic Search.
# Users must supply an Airflow connection id that provides access to the storage
# location. If remote_logging is set to true, see UPDATING.md for additional
# configuration requirements.
remote_logging = False
remote_log_conn_id =
remote_base_log_folder =
encrypt_s3_logs = False

# Logging level
logging_level = WARN
fab_logging_level = WARN

# Logging class
# Specify the class that will specify the logging configuration
# This class has to be on the python classpath
# logging_config_class = my.path.default_local_settings.LOGGING_CONFIG
logging_config_class =

# Log format
log_format = [%%(asctime)s] {%%(filename)s:%%(lineno)d} %%(levelname)s - %%(message)s
simple_log_format = %%(asctime)s %%(levelname)s - %%(message)s

# Log filename format
log_filename_template = {{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log
log_processor_filename_template = {{ filename }}.log
dag_processor_manager_log_location = /home/ubuntu/airflow/logs/dag_processor_manager/dag_processor_manager.log

3 个答案:

答案 0 :(得分:1)

logging_level = INFO中设置WARN而不是airflow.cfg,您应该可以看到自己的日志。

原因

logging_level记录气流事件何时达到那些日志级别。例如,不赞成使用气流的操作员将生成一个气流事件,并记录为WARN。

就您的代码而言,它们只是您要记录的普通python语句。因此,它们实际上处于气流的INFO log_level下。因此,如果将logging_level设置为INFO,则应该可以看到日志记录语句。

答案 1 :(得分:0)

您只是缺少运行任务。只需添加log_task.run(),您的日志就会在那里。

只需对其进行测试即可,结果如下所示:

[2019-09-03 02:19:15,990] {main.py:18} CRITICAL - hello world
[2019-09-03 02:19:16,024] {main.py:17} INFO - hello world
[2019-09-03 02:19:16,024] {main.py:18} CRITICAL - hello world
[2019-09-03 02:19:16,060] {main.py:17} INFO - hello world
[2019-09-03 02:19:16,061] {main.py:18} CRITICAL - hello world
[2019-09-03 02:19:16,100] {main.py:17} INFO - hello world
[2019-09-03 02:19:16,100] {main.py:18} CRITICAL - hello world
...
...

希望有帮助。

答案 2 :(得分:0)

免责声明:我仍在弄清楚这一点。但这是我到目前为止的理解。

气流有多种记录方式。任务记录到自己的文件中,而不记录气流服务本身所做的工作。

您可能会通过Web ui找到日志:

  1. 去吧
  2. 单击任务实例
  3. 点击[查看日志]

(已使用我自己的conf在您的示例dag上进行了验证:以上步骤显示“ hello world”,但stdout上的终端不显示)

从我所见,这是唯一受logging_level配置影响的日志类型,顺便说一下,默认情况下,INFO是这种配置。

来自the docs的这些日志存储在{dag_id}/{task_id}/{execution_date}/{try_number}.log

天文学家也有a guide here。但是我还没有尝试一下。