Jost Do It.

그냥 IT해.

서버 및 환경/Utils

[Airflow] 파이썬에서 Error 로그가 airflow에서는 INFO로 뜨는 이유

그냥하Jo. 2023. 3. 30. 17:48
반응형

[아래는 ChatGPT와 나눈 대화내용]

 

 

 

파이썬에서 에러 로그가 airflow에서는 INFO정보로 뜨는데 왜그래?
Airflow는 기본적으로 로그 레벨이 INFO로 설정되어 있기 때문에, 파이썬에서 발생한 에러 로그도 INFO 레벨로 출력됩니다. 이는 Airflow가 파이썬 코드를 실행하는 방식 때문입니다. Airflow는 DAG(Directed Acyclic Graph)을 기반으로 작업을 스케줄링하며, 각 작업은 PythonOperator, BashOperator, DockerOperator 등의 Operator를 통해 실행됩니다. 이 때, Operator 내부에서 파이썬 코드를 실행하면서 발생하는 에러 로그도 Airflow에서 INFO 레벨의 로그로 처리됩니다.
하지만, 이러한 로그 레벨을 변경할 수 있습니다. Airflow의 설정 파일인 airflow.cfg에서 LOGGING_LEVEL 설정을 수정하여 원하는 로그 레벨로 변경할 수 있습니다. 예를 들어, LOGGING_LEVEL을 WARNING으로 설정하면 INFO 레벨보다 높은 WARNING 레벨 이상의 로그만 출력되게 됩니다.

 

Operator 내부에서 파이썬 코드를 실행하면서 발생하는 에러 로그를 Airflow는 왜 INFO 레벨의 로그로 처리하는거야?
Airflow에서 Operator 내부에서 파이썬 코드를 실행할 때 발생하는 에러 로그를 INFO 레벨의 로그로 처리하는 이유는, Airflow에서는 에러가 발생하더라도 해당 Operator의 실행이 실패한 것이 아니기 때문입니다. 예를 들어, BashOperator에서 실행된 스크립트에서 에러가 발생하더라도 Airflow는 해당 Operator를 실패한 것이 아니며, 해당 Operator의 상태는 성공(Success)으로 표시됩니다.
또한, Airflow에서는 Operator가 실행되는 동안 로그를 자세하게 기록하므로, INFO 레벨 이상의 로그도 기록됩니다. 따라서, 에러가 발생했을 때 해당 에러 메시지가 INFO 레벨의 로그로 출력되는 것입니다. 이렇게 함으로써, Airflow는 Operator의 실행 결과를 성공/실패로 구분하면서도 실행 도중 발생하는 에러 메시지를 로그로 기록할 수 있게 됩니다.

 

INFO는 INFO로 출력되고, WARNING은 WARNING으로 출력되게 할 수 없는거야?

 

Airflow의 로그 레벨은 로그 레벨 조정 기능을 통해 변경할 수 있습니다. 이를 통해 INFO 로그 레벨에서 WARNING 로그 레벨까지 출력되는 로그 레벨을 조정할 수 있습니다.
로그 레벨 조정 기능은 Airflow의 설정 파일인 airflow.cfg 파일에서 수행할 수 있습니다. airflow.cfg 파일에서 logging_level 옵션의 값을 원하는 로그 레벨로 변경하면 됩니다. 예를 들어, logging_level 값을 WARNING으로 변경하면 INFO 로그는 출력되지 않고, WARNING 로그부터 출력되게 됩니다.
하지만, 이 설정 변경은 전체적으로 Airflow에서 적용되기 때문에, 특정 Task에서만 로그 레벨을 조정하는 것은 불가능합니다. 따라서 특정 Task에서만 INFO 또는 WARNING 로그를 출력하고 싶은 경우, 해당 Task 내부에서 로그 레벨을 조정하는 코드를 추가해야 합니다.
아래는 Airflow에서 로그 레벨을 조정하는 예시 코드입니다.
from airflow.utils.log.logging_mixin import LoggingMixin
import logging

class MyOperator(BaseOperator, LoggingMixin):
    
    def execute(self, context):
        
        # 로그 레벨을 DEBUG로 조정
        self.log.info("INFO 메시지 출력")
        self.log.warning("WARNING 메시지 출력")
        
        self.log.setLevel(logging.DEBUG)
        self.log.debug("DEBUG 메시지 출력")
위 코드에서
self.log.setLevel(logging.DEBUG)
라인을 통해 로그 레벨을 DEBUG로 조정하고 있습니다. 이를 통해 INFO, WARNING, DEBUG 로그 레벨에 해당하는 로그 메시지를 모두 출력할 수 있습니다.

마지막 답변은 내가 원하던 결과는 아니지만ㄴ....

 

생각해보면 airflow에서 출력하는 level 자체를 설정해 그 level 이상을 출력하는건 맞다.

 

근데 bashOperator로 실행 시, 파이썬 에러도 사실 bash 실행 자체의 error는 아니라서 INFO로 출력되는듯... ㅜㅜ

 

바꾸려면 PythonOperator를 써야할듯?

 

반응형