web-dev-qa-db-fra.com

Suppression des journaux de tâches Airflow

J'exécute 5 DAG qui ont généré un total d'environ 6 Go de données de journal dans le base_log_folder sur une période d'un mois. Je viens d'ajouter un remote_base_log_folder mais il ne semble pas exclure la connexion à base_log_folder.

Est-il possible de supprimer automatiquement les anciens fichiers journaux, de les faire pivoter ou de forcer le flux d'air à ne pas se connecter au disque (base_log_folder) uniquement dans le stockage distant?

21
jompa

Veuillez vous référer https://github.com/teamclairvoyant/airflow-maintenance-dags

Ce plugin a des DAG qui peuvent tuer les tâches interrompues et les nettoyages de journaux. Vous pouvez saisir les concepts et proposer un nouveau DAG qui peut nettoyer selon vos besoins.

12
Vinod Vutpala

Nous supprimons les journaux des tâches en implémentant notre propre FileTaskHandler, puis en le pointant dans le airflow.cfg. Ainsi, nous remplaçons le LogHandler par défaut pour ne conserver que N journaux de tâches, sans planifier de DAG supplémentaires.

Nous utilisons Airflow==1.10.1.

[core]
logging_config_class = log_config.LOGGING_CONFIG

log_config.LOGGING_CONFIG

BASE_LOG_FOLDER = conf.get('core', 'BASE_LOG_FOLDER')
FOLDER_TASK_TEMPLATE = '{{ ti.dag_id }}/{{ ti.task_id }}'
FILENAME_TEMPLATE = '{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log'

LOGGING_CONFIG = {
    'formatters': {},
    'handlers': {
        '...': {},
        'task': {
            'class': 'file_task_handler.FileTaskRotationHandler',
            'formatter': 'airflow.job',
            'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER),
            'filename_template': FILENAME_TEMPLATE,
            'folder_task_template': FOLDER_TASK_TEMPLATE,
            'retention': 20
        },
        '...': {}
    },
    'loggers': {
        'airflow.task': {
            'handlers': ['task'],
            'level': JOB_LOG_LEVEL,
            'propagate': False,
        },
        'airflow.task_runner': {
            'handlers': ['task'],
            'level': LOG_LEVEL,
            'propagate': True,
        },
        '...': {}
    }
}

file_task_handler.FileTaskRotationHandler

import os
import shutil

from airflow.utils.helpers import parse_template_string
from airflow.utils.log.file_task_handler import FileTaskHandler


class FileTaskRotationHandler(FileTaskHandler):

    def __init__(self, base_log_folder, filename_template, folder_task_template, retention):
        """
        :param base_log_folder: Base log folder to place logs.
        :param filename_template: template filename string.
        :param folder_task_template: template folder task path.
        :param retention: Number of folder logs to keep
        """
        super(FileTaskRotationHandler, self).__init__(base_log_folder, filename_template)
        self.retention = retention
        self.folder_task_template, self.folder_task_template_jinja_template = \
            parse_template_string(folder_task_template)

    @staticmethod
    def _get_directories(path='.'):
        return next(os.walk(path))[1]

    def _render_folder_task_path(self, ti):
        if self.folder_task_template_jinja_template:
            jinja_context = ti.get_template_context()
            return self.folder_task_template_jinja_template.render(**jinja_context)

        return self.folder_task_template.format(dag_id=ti.dag_id, task_id=ti.task_id)

    def _init_file(self, ti):
        relative_path = self._render_folder_task_path(ti)
        folder_task_path = os.path.join(self.local_base, relative_path)
        subfolders = self._get_directories(folder_task_path)
        to_remove = set(subfolders) - set(subfolders[-self.retention:])

        for dir_to_remove in to_remove:
            full_dir_to_remove = os.path.join(folder_task_path, dir_to_remove)
            print('Removing', full_dir_to_remove)
            shutil.rmtree(full_dir_to_remove)

        return FileTaskHandler._init_file(self, ti)
3
Franzi

Les responsables du flux d'air ne pensent pas que la troncature des journaux fait partie de la logique principale du flux d'air, pour voir this , puis dans ce problème, les responsables suggèrent de modifier LOG_LEVEL pour éviter trop de données de journal.

Et dans this PR, nous pouvons apprendre comment changer le niveau de journalisation dans airflow.cfg.

bonne chance.

1
zhongjiajie

Je ne pense pas qu'il existe un mécanisme de rotation mais vous pouvez les stocker dans le stockage cloud S3 ou Google comme décrit ici: https://airflow.incubator.Apache.org/configuration.html#logs

0
nono