open:logging

Logging

  • DEBUG: 일반적으로 화면에 표시되지 않는다. 디버깅을 지원하기 위한 것이기 때문이다.
  • INFO: 정상적인 실행 경로에 따른 처리 관련 정보를 제공한다.
  • WARNING: 어떤 식으로 처리 시 문제가 발생할 수 있음을 의미한다. 가장 널리 쓰이는 예는 함수 혹은 클래스가 노후화된 경우다. 동작은 하지만 가급적 대체하는 것이 바람직한 것이다. 화면에 표시되는 것이 일반적이다.
  • ERROR: 유효하지 않은 처리로서 출력 결과는 틀렸거나 불완전하다. 장기간에 걸쳐 실행되는 서버에서는 개별 처리에 문제가 발생해도 서버 전체적으로는 계속 동작할 수 있는 경우가 많다.
  • CRITICAL: ERROR 중에서도 매우 심각한 것이다. 일반적으로 장기간에 걸쳐 실행되는 서버조차도 더 이상 동작을 계속할 수 없는 치명적인 상황을 의미한다.
  • version 키의 값은 반드시 1이어야 한다.
  • formatters 키의 값은 로그 포맷을 정의하는데, 이 값이 지정되지 않으면 기본 포맷이 사용되며 심각도 수준 등의 정보 없이 메시지 본문만 표시된다.
    • default 포매터는 basicConfig() 함수가 생성한 포맷을 그대로 반영한다.
    • timestamp 포매터는 더 복잡한 포맷으로서 날짜-시간 스탬프를 포함한다. 파싱하기 쉽도록 열 구분자로서 // 가 사용됐다.
  • handlers 키는 두 개의 로거에 대한 두 개의 핸들러를 정의한다.
    1. console 핸들러는 sys.stderr 스트림에 기록한다. 이 핸들러가 사용할 포매터를 지정했으며, 이 정의는 basicConfig() 함수가 생성한 설정에 대응된다.
    2. file 핸들러는 파일에 기록한다. 파일을 열 때 사용되는 기본 모드는 a로서, 이 모든 기존 파일에 내용을 추가하며 파일 크기에 제한이 없다. 반면에 크기가 제한된 파일들을 번갈아 사용하는 핸들러들도 있다. 파일명과 포매터를 명시적으로 지정했는데, 이 포매터는 화면에 보이는 것보다 더 자세한 세부 정보를 파일에 저장한다.
    3. loggers 키는 애플리케이션이 생성할 두 개의 로거를 위한 설정을 제공한다. overview_state.detail 로 시작하는 로거는 console 핸들러에 보내지며, overview_state.write 로 시작하는 로거는 console 핸들러와 file 핸들러에 모두 보내진다.
    4. root 키는 최상위 로거를 정의한다. 코드에서 이 로거를 참조할 때는 ''(빈 문자열) 로서 참조된다. 루트 로거에 설정된 심각도 수준은 그 이하의 모든 자식 로거들에 동일하게 적용된다.

애플리케이션에 로깅 기능을 추가하는 과정은 3단계를 거친다.

  • 로거 객체를 생성
  • 중요한 상태 변경이 일어나는 위치 부근에 로그 요청을 배치
  • 로깅 시스템을 전반적으로 설정

일반적인 방법은 모듈과 같은 이름의 로거를 생성하는 것이다.

logger = logging.getLogger(__name__)

로거의 이름은 소프트웨어의 구조를 따른다. 중요한 상태 변경 부근에 로깅 요청을 배치하는 것이 좋은데, 한 개의 로그 내에 수많은 상태 변경이 존재할 수 있다.

  • 영속적 자원에 어떤 변경이 발생하면 INFO 수준의 메시지를 포함시키는 것이 좋다. 운영체제상의 변경(주로 파일시스템)도 로깅하기에 적합하고, 데이터베이스를 갱신하거나 웹 서버의 상태를 변경하는 요청 역시 로깅하는 것이 바람직하다.
  • 영속적인 상태 변경을 초래하는 문제점은 ERROR 수준의메시지를 포함시켜야 한다. 운영체제 수준의 예외를 포착했을 때도 역시 마찬가지다.
  • 매우 길고 복잡한 계산이 수행되고 있을 때는 특히 중요한 대입문이 실행된 직후에 DEBUG 수준의 메시지를 기록하면 도움이 된다. 길고 복잡한 계산을(테스트하기 쉽도록) 더 작은 단위로 쪼개야 한다는 힌트 역할을 할 수 있기 때문이다.
  • 내부 애플리케이션 자원에 대한 어떤 변경도 DEBUG 메시지를 기록할 필요가 있다. 객체의 상태 변경을 로그를 통해 추적하기 위해서다.
  • 애플리케이션이 잘못된 상태로 진입했을 때도 로깅해야 한다. 주로 예외가 발생한 경우가 이에 해당되는데, assert문을 사용해 프로그램의 상태를 탐지하고 문제 탐지 시 예외를 발생시킬 수 잇다. 예외는 EXCEPTIONS 수준으로 기록될 수 있고, 조용히 넘어가거나 변환되는 예외인 경우 DEBUG 수준으로 기록될 수 있다. 혹은 CRITICAL이나 ERROR 수준으로 기록돼야 하는 심각한 예외도 존재한다.
  • open/logging.txt
  • 마지막으로 수정됨: 2021/02/16 00:14
  • 저자 127.0.0.1