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?
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.
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)
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.
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