← 학습 카테고리

Learn

Airflow

151개 모듈 · 현재 84번째

Airflow 모듈 84/151 airflow-learn-84

고급 로깅 설정: 커스텀 로거와 로그 크기 제한

Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation administration-and-deployment/logging-monitoring/advanced-logging-configuration.rst (전체)

이 모듈을 다 읽으면

  • logging_config_class로 커스텀 로깅 설정을 적용하는 절차를 설명할 수 있다
  • 원격 로깅 사용 시 REMOTE_TASK_LOG/DEFAULT_REMOTE_CONN_ID를 정의하는 목적을 설명할 수 있다
  • 오퍼레이터/훅/태스크별로 로거를 다르게 설정하는 방법을 판단할 수 있다

airflow.cfg만으로는 표현할 수 없는 로깅 커스터마이징(핸들러 교체, 오퍼레이터별 로그 레벨, 원격 로깅 백엔드 커스터마이징, 로그 크기 제한)은 logging_config_class를 통해 파이썬 dictConfig 딕셔너리를 직접 제공하는 방식으로 이뤄진다.

커스텀 로깅 config 만들기

``airflow.cfg``의 모든 옵션으로 로깅을 설정할 수 있는 것은 아니다. 커스텀 로깅 클래스를 만들려면 ``logging_config_class`` 옵션을 사용한다. 이름에 ``_class``가 붙어 있지만 실제 값은 파이썬 클래스가 아니라 ``logging.config.dictConfig``를 만족하는 dict로의 점(dot) 경로다. ``_class`` 접미사는 하위 호환을 위해 남아있는 역사적 흔적이다.

절차는 다음과 같다: PYTHONPATH 환경변수를 알려진 디렉터리(예: ``~/airflow/``)로 설정하고, 그 아래 config 디렉터리를 만든 뒤 ``log_config.py`` 파일에 ``DEFAULT_LOGGING_CONFIG``를 deepcopy해 ``LOGGING_CONFIG``라는 이름으로 만든다. 파일 끝에서 이 딕셔너리를 원하는 대로 수정하고, ``airflow.cfg``의 ``[logging] logging_config_class = log_config.LOGGING_CONFIG``로 지정한 다음 애플리케이션을 재시작한다.

``logging_config_class``는 원격 로깅과 함께 쓸 수도 있다. ``[logging] remote_logging = True``와 함께 설정하면, deepcopy된 딕셔너리에는 이미 원격 로깅용 설정이 자동 생성되어 들어있고, 여러분의 수정 사항은 그 원격 로깅 설정이 추가된 이후에 적용된다.

핵심 포인트

  • logging_config_class는 이름과 달리 실제로는 dictConfig를 만족하는 dict로의 임포트 경로다
  • DEFAULT_LOGGING_CONFIG를 deepcopy해 수정한 뒤 airflow.cfg에 경로를 지정하고 재시작한다
  • remote_logging=True와 함께 쓰면 원격 로깅 설정이 이미 채워진 딕셔너리 위에 커스텀 수정이 얹힌다

원격 로깅 커스텀 모듈 정의

``[logging] remote_logging = True``이면서 ``logging_config_class``가 자체 모듈을 가리키게 한다면, 그 모듈에 두 개의 모듈 레벨 속성을 정의해야 한다: ``REMOTE_TASK_LOG``는 태스크 로그를 업로드하고 UI를 위해 다시 읽어오는 ``RemoteLogIO``(또는 ``RemoteLogStreamIO``) 인스턴스이고, ``DEFAULT_REMOTE_CONN_ID``는 ``[logging] remote_log_conn_id``가 설정되지 않았을 때 쓰이는 기본 Airflow 커넥션 ID다.

``REMOTE_TASK_LOG``가 없으면 Airflow는 시작 시 WARNING을 하나 남기고, UI는 원격 백엔드에서 태스크 로그를 다시 읽어올 수 없게 된다. ``REMOTE_TASK_LOG``는 (배포 예정인) ``airflow.config_templates.airflow_local_settings``에서 재수출하지 말고 자신의 모듈에 직접 정의해야 한다.

핵심 포인트

  • REMOTE_TASK_LOG는 업로드/재조회를 담당하는 RemoteLogIO(또는 RemoteLogStreamIO) 인스턴스다
  • DEFAULT_REMOTE_CONN_ID는 remote_log_conn_id 미설정 시 쓰이는 기본 커넥션 ID다
  • REMOTE_TASK_LOG가 없으면 시작 시 경고가 나고 UI가 원격 백엔드에서 로그를 읽어올 수 없다

오퍼레이터/훅/태스크별 커스텀 로거

오퍼레이터와 훅은 기본적으로 ``airflow.task`` 로거의 자식으로, 각각 ``airflow.task.operators.<package>.<module_name>``, ``airflow.task.hooks.<package>.<module_name>`` 네이밍 규칙을 따른다. 커스텀 로깅 클래스를 만든 뒤에는 이 특정 로거들에 개별 설정(handlers, level, propagate)을 지정할 수 있다. 예를 들어 ``SQLExecuteQueryOperator``는 DEBUG 레벨로, ``HttpHook``은 WARNING 레벨로 설정하면서 propagate 여부를 다르게 줄 수 있다.

또한 Dag의 태스크에 ``logger_name`` 속성으로 커스텀 로거 이름을 지정할 수 있다. 같은 오퍼레이터를 여러 태스크가 쓰지만 일부 태스크만 로깅을 끄고 싶을 때 유용하다. 태스크에 ``logger_name="sql.big_query"``를 지정하면, 커스텀 ``log_config.py``에서 ``airflow.task.operators.sql.big_query``라는 로거를 별도로 설정할 수 있다.

핵심 포인트

  • 오퍼레이터/훅 로거는 각각 airflow.task.operators.*, airflow.task.hooks.* 네이밍을 따른다
  • 커스텀 config에서 특정 오퍼레이터/훅 로거에만 handlers/level/propagate를 다르게 줄 수 있다
  • 태스크의 logger_name 속성으로 같은 오퍼레이터를 쓰는 태스크들도 서로 다른 로거로 분리할 수 있다

태스크 로그 크기 제한

태스크 로그 크기를 제한하고 싶다면 ``handlers.task.max_bytes`` 파라미터를 추가하면 된다. 예를 들어 ``max_bytes: 104857600``(100MB)와 ``backup_count: 1``을 설정하면 100MB 단위로 로그를 로테이션하면서 과거 로그 1개만 보관한다.

핵심 포인트

  • handlers.task.max_bytes와 backup_count로 태스크 로그 파일 크기와 보관 개수를 제한할 수 있다