๐[Django] django logger ํ์ผ ๋ถ๋ฆฌํ๊ธฐ?
๋ก๊ทธ๋ฅผ ๋ถ๋ฆฌํ๋ค๋ ๋ง์ด ๋ญ๊น?
์ ๋ฌธ์ ์ผ๋ก ์กด์ฌํ๋ ๋จ์ด๋ ์๋๊ณ , ๊ทธ๋ฅ ์ค์ค๋ก ์ง์ ๋ง์ด๊ธด ํจ..!
๋ด๊ฐ ์๊ฐํ ๋ก๊ทธ์ ๋ถ๋ฆฌ๋, API ๋ณ๋ก ๋ก๊ทธ ํ์ผ์ ๋ฐ๋ก ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ ๋ง์ด๋ค.
์๋ฅผ ๋ค๋ฉด ํ๋์ ๋ ํฌ์งํ ๋ฆฌ๊ฐ ์๋ค๊ณ ํ ๋, ๋ ๊ฐ์ง์ ์๋น์ค๊ฐ ๊ฒฐํฉ๋ ํํ์ผ ์ ์๋ค.
์ฆ, ์๋ํฌ์ธํธ๊ฐ ๋๊ฐ์ง ๊ฐ๋๊ธธ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๊ณ , /api/endpoint-1
, /api/endpoint-2
๋ฅผ ๊ธฐ์ ์ผ๋ก ๋ ๊ฐ์ง์ ์๋น์ค๋ฅผ ํ๋์ ํ๋ก์ ํธ์์ ๊ด๋ฆฌํ๋ ํ๋ก์ ํธ๋ฅผ ์๋ฏธํ๋ค!
์ ์ด๋ ๊ฒ ํ๋๊ฐ? ๋ ๊ฑฐ์ ํ๋ก์ ํธ๊ฐ ์ ์ด์ ์ด๋ ๊ฒ ๋์ด์์๊ณ , ์ด๊ฒ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ธ์ง ์๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๊ธฐ๋ ํ๊ณ , ๋ฆฌํฉํ ๋ง ํ๊ธฐ์๋ ์๊ฐ์ด ๋๋ฌด ๋ง์ด ์์๋ ๊ฒ ๊ฐ์์ ์ผ๋จ ๊ทธ๋๋ก..
๊ทธ๋์ ์ด๋ป๊ฒ ํ๋๋ฐ?
์ฐ์ ์ง๊ธ ์งํ ์ค์ธ ํ๋ก์ ํธ๋ aptifit
์ด๋ผ๋ ํ๋ก์ ํธ์ dashboard
ํ๋ก์ ํธ ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
์ด ๋ ํ๋ก์ ํธ๊ฐ ์์์ ์ธ๊ธํ ๋ด์ฉ์ฒ๋ผ ํ๋์ ๋ ํฌ์งํ ๋ฆฌ์์ ์์ฑ๋์๋ค.
์ฆ django ํ๋ก์ ํธ์์ ๋ ๊ฐ์ง์ app
์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ ํํ๋ผ๊ณ ๋ณด๋ฉด ๋ ๋ฏ ํ๋ค. (์ค์ ๋ก๋ ํ๋์ app์ ์กด์ฌํ๊ธด ํ์ง๋ง..!)
์ด ๋ ํ๋์ ๋ก๊ทธ ํ์ผ์์ ๋ ์ฑ์ ๋ํ ๋ก๊ทธ๋ค์ ๋ชจ๋ ๊ด๋ฆฌํ๋ฉด( DEBUG
, INFO
, WARNING
, ERROR
, CRITICAL
๋ ๋ฒจ์ ๋ก๊ทธ) ์ด๋ค ์ฑ์์ ์ฐํ ๋ก๊ทธ์ธ์ง ํ ๋์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ธ ๊ฒ ๊ฐ์์ ๋ก๊ทธ ํ์ผ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ํด ๊ณ ๋ฏผํด๋ณด๊ฒ ๋์๋ค.
์ฐ์ ๊ฐ์ฅ ๋จผ์ ChatGPT์๊ฒ ๋ฌผ์ด๋ดค๋ค.
๐ฃ๏ธย ย ์ด๋ค api์์๋ a.log ํ์ผ์ ๋ก๊ทธ๋ฅผ ์์ฑํ๊ณ , ๋ ๋ค๋ฅธ api์์๋ b.log ํ์ผ์ ๋ก๊ทธ๋ฅผ ์์ฑํ๊ณ ์ถ์ด.
์๋ฅผ ๋ค๋ฉด views_.py ํ์ผ๋ค์ aptifit.log, dashboard_.py์๋ dashboard.log ํ์ผ์
1. ๋ณ๋ Logger ์ด๋ฆ์ ์ง์ ์ค์ ํ๊ธฐ
๊ฐ ํ์ผ์์ logger = logging.getLogger(<๊ทธ๋ฃน๋ช
>)
์ ์ฐ๊ณ , settings.py
์ LOGGING
์ ํด๋น ๊ทธ๋ฃน์ฉ ํธ๋ค๋ฌ๋ฅผ ๋ถ๋ฆฌํด ์ฃผ๋ ๋ฐฉ์์
๋๋ค.
# views_orders.py
import logging
logger = logging.getLogger('aptifit') # โ aptifit.log ๋ก ๊ฐ๋ค
def order_view(...):
logger.info("Order view called")
...
# dashboard_students.py
import logging
logger = logging.getLogger('dashboard') # โ dashboard.log ๋ก ๊ฐ๋ค
def students(...):
logger.error("Student lookup error", exc_info=True)
...
# settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(asctime)s %(levelname)-8s %(name)s %(message)s'
},
},
'handlers': {
'aptifit_file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/aptifit.log'),
'formatter': 'verbose',
},
'dashboard_file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/dashboard.log'),
'formatter': 'verbose',
},
},
'loggers': {
# getLogger('aptifit') โ aptifit_file
'aptifit': {
'handlers': ['aptifit_file'],
'level': 'DEBUG',
'propagate': False,
},
# getLogger('dashboard') โ dashboard_file
'dashboard': {
'handlers': ['dashboard_file'],
'level': 'DEBUG',
'propagate': False,
},
},
}
์ ์ฉํด๋ณด์!
settings.py
LOGGING = {
"version": 1,
"disable_existing_loggers": False, # Django ๊ธฐ๋ณธ ๋ก๊ฑฐ ์ ์ง
"formatters": {
"custom": {
"format": "[{asctime}] [{filename}:{lineno}] [{levelname}] {message}",
"style": "{",
"datefmt": "%Y-%m-%d %H:%M:%S",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "custom",
"level": "WARNING",
},
"aptifit_file": {
"class": "logging.handlers.TimedRotatingFileHandler",
"formatter": "custom",
"filename": os.path.join(LOG_DIR, "aptifit.log"),
"when": "midnight",
"interval": 1,
"backupCount": 7,
"encoding": "utf-8",
"level": "DEBUG",
},
"dashboard_file": {
"class": "logging.handlers.TimedRotatingFileHandler",
"formatter": "custom",
"filename": os.path.join(LOG_DIR, "dashboard.log"),
"when": "midnight",
"interval": 1,
"backupCount": 7,
"encoding": "utf-8",
"level": "DEBUG",
},
},
"loggers": {
# root: WARNING ์ด์๋ง ์ฝ์๋ก
"": {
"handlers": ["console"],
"level": "INFO",
"propagate": False,
},
# Django ์์ฒด ๋ก๊ทธ๋ WARNING ์ด์๋ง ์ฝ์
"django": {
"handlers": ["console"],
"level": "INFO",
"propagate": False,
},
# views_*.py ์์ getLogger('aptifit') ํธ์ถ ์
"aptifit": {
"handlers": ["console", "aptifit_file"],
"level": "DEBUG",
"propagate": False,
},
# dashboard_*.py ์์ getLogger('dashboard') ํธ์ถ ์
"dashboard": {
"handlers": ["console", "dashboard_file"],
"level": "DEBUG",
"propagate": False,
},
},
}
views.py
import logging
logger = logging.getLogger("aptifit")
...
import logging
logger = logging.getLogger("dashboard")
...
๋ถ๋ฆฌํ๊ณ ์ ํ๋ views
๋ฅผ ๊ฐ๊ฐ ์์ฒ๋ผ getLogger({log_file_name})
์ฒ๋ผ ์์ฑํ๊ณ , ํ์ํ ๊ณณ์ ๋ก๊ทธ๋ฅผ ์ฐ์ผ๋ฉด?
์ด๋ ๊ฒ ๋ก๊ทธ ํ์ผ์ด ๋ถ๋ฆฌ๋์ด ์์ฑ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ