Airflow不会将日志写入s3

时间:2018-05-07 21:41:18

标签: amazon-s3 airflow

我尝试了不同的方法配置Airflow 1.9将日志写入s3,但它只是忽略它。我发现很多人在这样做之后阅读日志时遇到了问题,但我的问题是日志仍然是本地的。我可以毫无问题地阅读它们,但它们不在指定的s3桶中。

我尝试的是先写入airflow.cfg文件

# Airflow can store logs remotely in AWS S3 or Google Cloud Storage. Users
# must supply an Airflow connection id that provides access to the storage
# location.
remote_base_log_folder = s3://bucketname/logs
remote_log_conn_id = aws
encrypt_s3_logs = False

然后我尝试设置环境变量

AIRFLOW__CORE__REMOTE_BASE_LOG_FOLDER=s3://bucketname/logs
AIRFLOW__CORE__REMOTE_LOG_CONN_ID=aws
AIRFLOW__CORE__ENCRYPT_S3_LOGS=False

然而,它会被忽略,日志文件仍然是本地文件。

我从容器中运行气流,我将https://github.com/puckel/docker-airflow改为我的情况,但它不会将日志写入s3。我使用aws连接写入dags中的桶,这可以工作但是Logs只保留在本地,无论我是在EC2上还是在我的机器上本地运行。

3 个答案:

答案 0 :(得分:4)

我终于找到了答案 https://stackoverflow.com/a/48969421/3808066 这是我接下来要做的大部分工作。我在这里重现这个答案,并按照我的方式进行调整:

要检查的一些事项:

  1. 确保您拥有log_config.py文件并且文件位于正确的目录中:./config/log_config.py
  2. 确保您没有忘记该目录中的__init__.py文件。
  3. 确保您定义了s3.task处理程序并将其格式化程序设置为airflow.task
  4. 确保将airflow.task和airflow.task_runner处理程序设置为s3.task
  5. task_log_reader = s3.task
  6. 中设置airflow.cfg
  7. S3_LOG_FOLDER传递给log_config。我使用变量并按照以下log_config.py检索它。
  8. 这是一个有效的log_config.py:

    import os
    
    from airflow import configuration as conf
    
    
    LOG_LEVEL = conf.get('core', 'LOGGING_LEVEL').upper()
    LOG_FORMAT = conf.get('core', 'log_format')
    
    BASE_LOG_FOLDER = conf.get('core', 'BASE_LOG_FOLDER')
    PROCESSOR_LOG_FOLDER = conf.get('scheduler', 'child_process_log_directory')
    
    FILENAME_TEMPLATE = '{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log'
    PROCESSOR_FILENAME_TEMPLATE = '{{ filename }}.log'
    
    S3_LOG_FOLDER = conf.get('core', 'S3_LOG_FOLDER')
    
    LOGGING_CONFIG = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'airflow.task': {
                'format': LOG_FORMAT,
            },
            'airflow.processor': {
                'format': LOG_FORMAT,
            },
        },
        'handlers': {
            'console': {
                'class': 'logging.StreamHandler',
                'formatter': 'airflow.task',
                'stream': 'ext://sys.stdout'
            },
            'file.task': {
                'class': 'airflow.utils.log.file_task_handler.FileTaskHandler',
                'formatter': 'airflow.task',
                'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER),
                'filename_template': FILENAME_TEMPLATE,
            },
            'file.processor': {
                'class': 'airflow.utils.log.file_processor_handler.FileProcessorHandler',
                'formatter': 'airflow.processor',
                'base_log_folder': os.path.expanduser(PROCESSOR_LOG_FOLDER),
                'filename_template': PROCESSOR_FILENAME_TEMPLATE,
            },
           's3.task': {
                'class': 'airflow.utils.log.s3_task_handler.S3TaskHandler',
                'formatter': 'airflow.task',
                'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER),
                's3_log_folder': S3_LOG_FOLDER,
                'filename_template': FILENAME_TEMPLATE,
            },
        },
        'loggers': {
            '': {
                'handlers': ['console'],
                'level': LOG_LEVEL
            },
            'airflow': {
                'handlers': ['console'],
                'level': LOG_LEVEL,
                'propagate': False,
            },
            'airflow.processor': {
                'handlers': ['file.processor'],
                'level': LOG_LEVEL,
                'propagate': True,
            },
            'airflow.task': {
                'handlers': ['s3.task'],
                'level': LOG_LEVEL,
                'propagate': False,
            },
            'airflow.task_runner': {
                'handlers': ['s3.task'],
                'level': LOG_LEVEL,
                'propagate': True,
            },
        }
    }
    

    请注意,这种方式S3_LOG_FOLDER可以在airflow.cfg中指定,也可以在变量AIRFLOW__CORE__S3_LOG_FOLDER的环境中指定。

答案 1 :(得分:0)

导致这种现象的另一件事(Airflow 1.10):

如果您查看airflow.utils.log.s3_task_handler.S3TaskHandler,您会发现在某些情况下静默不会将日志写入S3:

1)记录器实例已经close() d(不确定实际情况如何)
2)本地磁盘上不存在日志文件(这是我到目前为止的方法)

您还将注意到,记录器在多处理/多线程环境中运行,并且Airflow S3TaskHandlerFileTaskHandler对文件系统做一些非常重要的事情。 如果满足有关磁盘上日志文件的假设,则不会写入S3日志文件,并且不会记录此事件,也不会引发任何事件。如果您有特定的,明确定义的日志记录需求,则可能会很好实现所有自己的logging Handlers(请参阅python logging文档)并禁用所有Airflow日志处理程序(请参阅Airflow UPDATING.md)的想法。

答案 2 :(得分:0)

可能导致此行为的另一件事-可能未安装botocore。 确保在安装气流时包括s3软件包pip install apache-airflow[s3]