-
[Django] Logging - 장고 로그(debug_sql)공부/Django 2023. 4. 14. 00:20
장고를 사용하다보면 print()로 로그를 찍는 방법도 있지만 실제 서비스에서는 절대적으로 사용하 면 안된다고 생각을 하며, 로그를 확인하기 위해서 장고에서는 Logging이 잘 돼 있다고 생각한다.
- 이전에 Logging 관련 글을 작성했지만 Cloud Watch를 활용해서 작성한 방법을 기록하였습니다.(Cloud Watch에 기록하고 싶으시다면 이전 글을 참고 해주세요.) - 링크
1. settings.py에 LOGGING을 만듭니다.
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { # DEBUG = False '()': 'django.utils.log.RequireDebugFalse', }, 'require_debug_true': { # DEBUG = True '()': 'django.utils.log.RequireDebugTrue', }, }, 'formatters': { 'test': { 'format': u'%(asctime)s [%(levelname)-8s] %(funcName)s - %(message)s [%(pathname)s:%(lineno)d] ', 'datefmt': '%Y-%m-%d %H:%M:%S' }, }, 'handlers': { 'file': { 'level': 'DEBUG', 'filters': ['require_debug_true'], 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_DIR , 'logs/test.log'), 'maxBytes': 1024*1024*5, # 5 MB 'backupCount': 5, 'formatter': 'test', }, }, 'loggers': { 'django': { 'level': 'INFO', 'handlers': ['file'], 'propagate': False, }, 'django.db.backends': { 'level': 'DEBUG', 'handlers': ['file'], 'propagate': False, }, }, }
- filter : DEBUG가 True, False 인지 여부를 확인하기 위해서 사용하였습니다. (handlers- filters에서는 True일때를 사용하였습니다.)
- formatters : 로그를 어떻게 출력하고 싶은지 작성하면 됩니다.(여러개의 formatters를 만들어서 사용할 수 있습니다.)
- handlers : 생성한 로그들을 어디에, 어떤 level까지, 어떤 형식으로 보여주고 저장 할지를 설정하는 곳입니다.
- loggers : 어떤 서비스의 log를 어떤 level부터 보여줄지 정하는 부분입니다.
전반적으로 설정한다고 생각해 주시면됩니다.
handlers, loggers를 뜯어보려고 합니다. formatters는 직접 설정을 하시면된다고 생각합니다.(참고 링크)
# handlers
'handlers': { 'file': { 'level': 'DEBUG', 'filters': ['require_debug_true'], 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_DIR , 'logs/test.log'), 'maxBytes': 1024*1024*5, # 5 MB 'backupCount': 5, 'formatter': 'test', }, },
- file 이라는 이름으로 설정하였습니다. 어떤 이름으로 설정하셔도 상관없습니다.
- level은 로깅의 단계가 존재 합니다. file로 사용하는 loggers는 DEBUG단계까지 보여 줄 수 있도록 설정 하였습니다.
(심각도: CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET)
더보기CRITICAL: 시스템의 심각한 에러를 나타냅니다. 프로그램의 실행을 중단시켜야 하는 심각한 오류가 발생한 경우에 사용됩니다.ERROR: 에러가 발생한 것을 나타냅니다. 프로그램의 실행은 계속될 수 있지만, 에러가 발생했음을 알립니다.WARNING: 경고를 나타냅니다. 프로그램의 실행은 계속될 수 있지만, 주의가 필요한 상황임을 알립니다.INFO: 정보를 나타냅니다. 프로그램의 실행 상태나 이벤트를 알리는 용도로 사용됩니다.DEBUG: 디버깅 정보를 나타냅니다. 개발자가 문제를 해결하기 위해 사용됩니다.NOTSET: 로그 수준을 지정하지 않은 경우 사용됩니다. 로그 수준이 가장 낮은 값입니다.- 만일, level 단계가 DEBUG까지 필요없으시면 INFO로 설정하시면 됩니다. 그러면 DEBUG 레벨의 로그는 표시되지않습니다.
- class는 로컬에서 logging을 사용하기 위한 핸들러를 설정하였습니다.
- filename은 로그가 저장될 위치를 지정하였습니다.
# loggers
'loggers': { 'django': { 'level': 'INFO', 'handlers': ['file'], 'propagate': False, }, 'django.db.backends': { 'level': 'DEBUG', 'handlers': ['file'], 'propagate': False, }, },
- 'django', 'django.db.backends' 2가지를 사용 하는 이유는 'django'는 INFO level에 맞는 로그를 남기기 위함입니다.(서버 실행 후 상태나 이벤트를 기록하기 위함)
- 'django.db.backedns'는 DEBUG level에 맞는 로그를 남기기 위함입니다.(sql_debug를 사용하기 위해서입니다.)
- 'django.db.backedns' 를 사용하면 쿼리를 로그에 남길 수 있습니다. (level은 꼭 DEBUG로 설정해야합니다. db.backends는 level이 INFO보다 낮은 DEBUG로 설정 돼 있기 때문입니다.)# 로그
# 실제 사용된 코드
import os import logging LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', }, 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, 'formatters': { 'test': { 'format': u'%(asctime)s [%(levelname)-8s] %(funcName)s - %(message)s [%(pathname)s:%(lineno)d] ', 'datefmt': '%Y-%m-%d %H:%M:%S' }, }, 'handlers': { 'file': { 'level': 'DEBUG', 'filters': ['require_debug_true'], 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_DIR , 'logs/test.log'), 'maxBytes': 1024*1024*5, # 5 MB 'backupCount': 5, 'formatter': 'test', }, }, 'loggers': { 'django': { 'level': 'INFO', 'handlers': ['file'], 'propagate': False, }, 'django.db.backends': { 'level': 'DEBUG', 'handlers': ['file'], 'propagate': False, }, }, } log = logging.getLogger('django') # django만 getLogger해도 sql_debug도 출력됩니다.
로그 찍고 싶은 곳에 settings를 import 해서 사용하시면 됩니다. (위에 링크 참조)
[AWS] CloudWatch에 기록하는 방식도 글을 작성하였습니다.
api요청 할 때마다 로그를 찍을 수 있도록 하는 방법(middleware)을 사용하는 글을 작성하도록 하겠습니다.- 어떤 문제를 해결하기위해 검색하고 블로그에 작성한 글입니다. 부족한점이 많지만 틀린점이나 부족한점이 있다면 말씀해주시면 감사하겠습니다.
Ref.
4-14 로깅
`[완성 소스]` : [github.com/pahkey/jump2django/tree/4-14](https://github.com/pahkey/jump2django/tree/4-…
wikidocs.net
https://hikoding.tistory.com/49
Django에서 로깅 사용하기 (로그기록 파일로 남기기)
안녕하세요 장고로 서버를 구동하고 사이트에 접속하면 콘솔에 로그가 찍힙니다. 실제 서버 구동시 콘솔로 관리하기가 어렵습니다. 파일로 로그를 남겨두면 사이트를 관리하는데 좋겠죠 바로
hikoding.tistory.com
https://velog.io/@jusung-c/%EB%A1%9C%EA%B7%B8-%EB%82%A8%EA%B8%B0%EA%B8%B0
로그 남기기
장고의 로깅은 파이썬의 로깅 체계를 그대로 따르면서 일부만 추가됐다. 파이썬의 로깅 모듈은 로거, 핸들러, 필터, 포맷터 4가지 주요 컴포넌트를 정의하고 있다. 장고의 runserver나 웹 서버에 의
velog.io
'공부 > Django' 카테고리의 다른 글
[Django] - AWS CloudWatch 사용시 로그가 2번 찍히는 이유 (0) 2023.05.27 [Django] Custom Middleware를 이용해서 log 작성하기 (0) 2023.04.26 [Django]Fernet을 사용한 양방향 암호화 (0) 2023.04.07 Django - CloudWatch : 장고 로깅을 CloudWatch에 입력하기 (0) 2023.04.05 Django - S3 - nginx - 이미지업로드, 정적파일 (0) 2023.03.07