[Django] Logging Handler

2022. 4. 28. 13:41TIL/Django

Python logging Handler

Django의 로깅은 파이썬에서 제공하는 logging 모듈을 그대로 가져와서 사용한다. 파이썬에서 로깅을 할 때 사용되는 핸들러는 여러 종류가 있다.

StreamHandler


StreamHandler 클래스는 sys.stdout, sys.stderr와 같은 스트림으로 로깅을 출력한다. 즉, 쉽게 얘기하여 Console에 log를 남기게 된다.

FileHandler


FileHandler 클래스는 로깅 출력을 디스크 파일로 보낸다. StreamHandler 에서 출력 기능을 상속받는다. 지정된 파일이 열리고 로깅을 위한 스트림으로 사용된다. 모드는 기본값이 a(추가 모드) 이다.

NullHandler


NullHandler 클래스는 포맷이나 출력을 하지 않는다. 기본적으로 라이브러리 개발자가 사용한다. 라이브러리 개발자가 로깅을 적용했지만 사용자가 로깅을 원치 않을 때 No handlers could be found for logger XXX라는 메세지가 뜬다고 한다. 그것을 피하기 위해 설정하는 핸들러이다.

WatchedFileHandler


WatchedFileHandler 클래스는 로깅 중인 파일을 감시하는 FileHandler 이다. 파일의 장치나 inode가 변경되면 파일이 변경된 것으로 보고, 변경이 되었으면 이전 파일 스트림이 닫히고, 새 스트림을 얻기 위해 파일을 연다. (사실 무슨 소리인지 잘 모르겠다.)

BaseRotatingHandler


BaseRotatingHandler 클래스는 로테이팅 핸들러(RotatingFileHandler, TimeRotatingFileHandler)의 베이스 클래스이다. 인스턴스를 만들 필요는 없지만 재정의하기 위해 필요하다.

RotatingFileHandler


RotatingFileHandler 클래스는 디스크 로그 파일 회전을 지원한다. 파일 크기가 설정된 크기보다 커지려고 하면, 이전 파일을 닫고 새 파일을 열어 출력을 계속 한다. maxBytes 파라미터를 이용하여 파일의 크기를 설정할 수 있다. backupCount 파라미터에 숫자를 전달하면 로그 파일 끝에 ".1", ".2" 등을 추가하여 지난 로그 파일을 저장한다. 예를 들어, backupCount 가 5이고 기본 파일명이 app.log 면, app.log, app.log.1, app.log.2, ..., app.log.5 까지의 파일을 얻을 수 있다.

TimedRotatingFileHandler


TimedRotatingFileHandler 클래스는 특정 시간 간격의 디스크 로그 파일 회전을 지원한다. 시간 흐름에 따라 로테이팅되는 로그를 설정하려면 두 번째 인수인 when 파라미터에 시간 단위를 잘 전달해야 한다.

  • 시간 단위
    • second (s)
    • minute (m)
    • hour (h)
    • day (d)
    • w0 - w6 (weekday, 0 = Monday)
    • midnight (atTime 을 지정하지 않으면 자정에, 그렇지 않으면 atTime 에 롤오버 한다.)
  • 대소 문자 구분하지 않음
  • utc 파라미터가 참이면 utc 시간이 사용되고, 그렇지 않으면 local time이 적용된다.

SMTPHandler


SMTPHandler 클래스는 SMTP를 통해 전자 메일 주소로 로깅 메시지를 보내는 것을 지원한다.

MemoryHandler


MemoryHandler 클래스는 메모리에 로깅 레코드를 버퍼링하고, 주기적으로 타겟처리기로 플러시하는 것을 지원한다. 어떠한 상황이 발생할 때까지 로그 된 이벤트를 버퍼링 할 수 있도록 하고, 때가 되면 버퍼링 된 이벤트들이 flush 된다.

HTTPHandler


HTTPHandler 클래스는 로깅 메시지를 웹서버로 보내는 역할을 한다. method 파라미터의 기본 값은 GET 이다. secure 파라미터가 참이면 HTTPS, 아니면 HTTP를 사용한다.

반응형

'TIL > Django' 카테고리의 다른 글

[Django] connection.queries always empty  (0) 2022.10.13
[Django] DRF란?  (0) 2022.10.12
[Django] pending되는 이슈에 대한 고찰  (0) 2022.08.02
[Django] Logging 설정  (0) 2022.04.26
[Django] timezone  (0) 2022.04.15