Шаг 4 из 6

Кастомная настройка логеров

Но одним лишь remote logging мы не ограничены. Так как Apache Airflow использует стандартный пакет logging для журналирования, то у вас есть возможность расширить его возможности на своё усмотрение. Если вы не знакомы с logging, то рекомендую мою статью для ознакомления перед чтением этого раздела. Далее мы разберём как выглядит конфигурация для Airflow logging, и напишем свой Handler для отправки ошибок в телеграм.

Шаблон из которого формируется logging config лежит тут. Это стандартный словарь для конфигурирования пакета logging в Python. Apache Airflow позволяет указать свой конфиг, переопределив опцию logging_config_class. Для неё необходимо прописать путь до переменной, хранящей словарь с logging-конфигурацией. Я не рекомендую перезаписывать существующие настройки logging без надобности, т.к. это может привести к некорректной работе системы журналирования Airflow. Вместо перезаписи будем расширять.

Представим, что вам нужно оперативно получать всю информацию об ошибках в тасках в телеграм. Есть несколько способов решить эту задачу:

  • Определить on_failure_callback
  • Самостоятельно в коде тасков отправлять сообщения об ошибках в телеграм (не делайте так)
  • Добавить свой Handler в logging-конфигурацию

Неудобство callback-функции в том, что нужно не забыть прописать её везде. Самостоятельный контроль и отправка ошибок в телеграм неудобен для готовых non-Python операторов. А вот создание своего Handler-класса кажется универсальным решением, которое будет работать для всех DAG-классов и операторов, входящих в них.

В Apache Airflow есть несколько логеров:

  • airflow.processor
  • airflow.task
  • flask_appbuilder
  • root

airflow.task это то, что нам нужно. Его использует класс TaskInstance для записи логов обо всех операторах, выполняющихся в DAG-объекте.

airflow.processor используется при парсинге DAG из python-модулей, за это отвечает планировщик.

flask_appbuilder это логер самого веб-приложения, построенного на веб-фреймворке Flask.

root это корневой логер, который пишет в stdout.

Комментарии