์ฌ๋ฌ ์คํ์์ค๋ค์ ๊ณต๋ถํ๋ฉด์ logging์ ๋ํด ์ฒ์ ์ ํ๊ฒ ๋์๋ค. ์ฝ๋๊ฐ ์ด๋๊น์ง ์งํ์ด ๋์๊ณ , ์ด๋์ ์๋ฌ๊ฐ ๋๋์ง ํ์ธํ๊ธฐ ์ํ ๋ก๊ทธ๋ถ์์ ํ๋๋ฐ ์ด๋ฌํ ์์ ์ด ๋ฐ๋ก logging์์ ์ด๋ฃจ์ด์ง๋ ๊ฒ์ด๋ค.
์๋ ํ์ด์ฌ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ก๊น ์ ๋ํด ์ฝ์ด๋ณผ ์ ์๋ค.
https://docs.python.org/ko/3/howto/logging.html
์ด ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด :
๋ก๊น ์ ์ด๋ค ์ํํธ์จ์ด๊ฐ ์คํ๋ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ๋ ์๋จ์ ๋๋ค. ์ํํธ์จ์ด ๊ฐ๋ฐ์๋ ์ฝ๋์ ๋ก๊น ํธ์ถ์ ์ถ๊ฐํ์ฌ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ ๋๋ค. ์ด๋ฒคํธ๋ ์ ํ์ ์ผ๋ก ๊ฐ๋ณ ๋ฐ์ดํฐ (์ฆ, ์ด๋ฒคํธ ๋ฐ์๋ง๋ค ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ)๋ฅผ ํฌํจํ ์ ์๋ ์ค๋ช ๋ฉ์์ง๋ก ๊ธฐ์ ๋ฉ๋๋ค. ์ด๋ฒคํธ๋ ๋ํ ๊ฐ๋ฐ์๊ฐ ์ด๋ฒคํธ์ ๋ถ์ฌํ ์ค์๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค; ์ค์๋๋ ์์ค(level) ๋๋ ์ฌ๊ฐ๋(severity) ๋ผ๊ณ ๋ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
๋ผ๊ณ ํ๋ค.
๋ก๊น ์ฌ์ฉ๋ฐฉ๋ฒ
์ค์น์์ด import ๋ฌธ์ผ๋ก ๋ถ๋ฌ์ฌ ์ ์๋ค.
import logging
๋ก๊น ์ Logger ํด๋์ค(=loggers) ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ํ๋๋ค.
logger = logging.getLogger(__name__)
์ด๋ ๊ฒ ๋ก๊ฑฐ์ ์ด๋ฆ์ ์ง์ ๋๋ ๋ก๊น ์ ์ฌ์ฉํ๋ ๊ฐ ๋ชจ๋์์ ๋ชจ๋ ์์ค ๋ก๊ฑฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
setLevel๋ก ๋ค์๊ณผ ๊ฐ์ ๋ ๋ฒจ์ ์ค์ ํ๋ค.
logger.setLevel(logging.DEBUG)
level | ์ฌ์ฉํ ๋ |
DEBUG | ์์ธํ ์ ๋ณด. ๋ณดํต ๋ฌธ์ ๋ฅผ ์ง๋จํ ๋๋ง ํ์ํฉ๋๋ค. |
INFO | ์์๋๋ก ์๋ํ๋์ง์ ๋ํ ํ์ธ. |
WARNING | ์์์น ๋ชปํ ์ผ์ด ๋ฐ์ํ๊ฑฐ๋ ๊ฐ๊น์ด ๋ฏธ๋์ ๋ฐ์ํ ๋ฌธ์ (์๋ฅผ ๋ค์ด ใ๋์คํฌ ๊ณต๊ฐ ๋ถ์กฑใ)์ ๋ํ ํ์. ์ํํธ์จ์ด๋ ์ฌ์ ํ ์์๋๋ก ์๋ํฉ๋๋ค. |
ERROR | ๋์ฑ ์ฌ๊ฐํ ๋ฌธ์ ๋ก ์ธํด, ์ํํธ์จ์ด๊ฐ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ํํ์ง ๋ชปํ์ต๋๋ค. |
CRITICAL | ์ฌ๊ฐํ ์๋ฌ. ํ๋ก๊ทธ๋จ ์์ฒด๊ฐ ๊ณ์ ์คํ๋์ง ์์ ์ ์์์ ๋ํ๋ ๋๋ค. |
**๋ก๊ฑฐ๊ฐ ์ฒ๋ฆฌํ ๊ฐ์ฅ ๋ฎ์ ์ฌ๊ฐ๋์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ง์ ํฉ๋๋ค. debug์ ๊ฐ์ฅ ๋ฎ์ ๋ด์ฅ ์ฌ๊ฐ๋ ์์ค์ด๊ณ critical์ ๊ฐ์ฅ ๋์ ๋ด์ฅ ์ฌ๊ฐ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๊ฐ๋ ์์ค์ด INFO์ด๋ฉด ๋ก๊ฑฐ๋ INFO, WARNING, ERROR ๋ฐ CRITICAL ๋ฉ์์ง๋ง ์ฒ๋ฆฌํ๊ณ DEBUG ๋ฉ์์ง๋ ๋ฌด์ํฉ๋๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ฉด ๋ก๊ฑฐ๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
3. ๋ก๊น ๋ฉ์์ง ์ปค์คํฐ๋ง์ด์ง
๋ก๊น ๋ฉ์์ง๋ ํ์ด์ฌ์์ ๋ฌธ์์ด ํฌ๋งคํ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ปค์คํ ํ ์ ์์ต๋๋ค.
logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
์๋์ ๊ฐ์ ์์ฑ๋ค์ ์ฐธ์กฐํ๋ฉด ๋ฉ๋๋ค.
์ดํธ๋ฆฌ๋ทฐํธ ์ด๋ฆ | ํฌ๋งท | ์ค๋ช |
args | ์ง์ ํฌ๋งทํ ํ์๋ ์์ต๋๋ค. | message ๋ฅผ ์์ฑํ๊ธฐ ์ํด msg ์ ๋ณํฉ๋๋ ์ธ์์ ํํ. ๋๋ (์ธ์๊ฐ ํ๋๋ฟ์ด๊ณ ๋์ ๋๋ฆฌ์ผ ๋) ๋ณํฉ์ ์ํด ๊ฐ์ด ์ฌ์ฉ๋๋ ๋์ ๋๋ฆฌ. |
asctime | %(asctime)s | ์ฌ๋์ด ์ฝ์ ์ ์๋, LogRecord ๊ฐ ์์ฑ๋ ์๊ฐ. ๊ธฐ๋ณธ์ ์ผ๋ก ใ2003-07-08 16:49:45,896ใ ํ์์ ๋๋ค (์ผํ ๋ค์ ์ซ์๋ ๋ฐ๋ฆฌ ์ด ๋ถ๋ถ์ ๋๋ค). |
created | %(created)f | LogRecord ๊ฐ ์์ฑ๋ ์๊ฐ (time.time() ์ด ๋ฐํํ๋ ์๊ฐ). |
exc_info | ์ง์ ํฌ๋งทํ ํ์๋ ์์ต๋๋ค. | ์์ธ ํํ (sys.exc_info ์์ ์ ๊ณต) ๋๋, ์์ธ๊ฐ ๋ฐ์ํ์ง ์์๋ค๋ฉด, None. |
filename | %(filename)s | pathname ์ ํ์ผ๋ช ๋ถ๋ถ. |
funcName | %(funcName)s | ๋ก๊น ํธ์ถ์ ํฌํจํ๋ ํจ์์ ์ด๋ฆ. |
levelname | %(levelname)s | ๋ฉ์์ง์ ํ ์คํธ ๋ก๊น ์์ค ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'). |
levelno | %(levelno)s | ๋ฉ์์ง์ ์ซ์ ๋ก๊น ์์ค (DEBUG, INFO, WARNING, ERROR, CRITICAL). |
lineno | %(lineno)d | ๋ก๊น ํธ์ถ์ด ์ผ์ด๋ ์์ค ํ ๋ฒํธ (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ). |
message | %(message)s | ๋ก๊ทธ ๋ ๋ฉ์์ง. msg % args ๋ก ๊ณ์ฐ๋ฉ๋๋ค. Formatter.format() ์ด ํธ์ถ ๋ ๋ ์ค์ ๋ฉ๋๋ค. |
module | %(module)s | ๋ชจ๋ (filename ์ ์ด๋ฆ ๋ถ๋ถ). |
msecs | %(msecs)d | LogRecord ๊ฐ ์์ฑ๋ ์๊ฐ์ ๋ฐ๋ฆฌ ์ด ๋ถ๋ถ. |
msg | ์ง์ ํฌ๋งทํ ํ์๋ ์์ต๋๋ค. | ์๋ ๋ก๊น ํธ์ถ์์ ์ ๋ฌ๋ ํฌ๋งท ๋ฌธ์์ด. args ์ ๋ณํฉํ์ฌ message ๋ฅผ ๋ง๋ญ๋๋ค. ๋๋ ์์์ ๊ฐ์ฒด (์์์ ๊ฐ์ฒด๋ฅผ ๋ฉ์์ง๋ก ์ฌ์ฉํ๊ธฐ ๋ฅผ ๋ณด์ธ์). |
name | %(name)s | ๋ก๊น ํธ์ถ์ ์ฌ์ฉ๋ ๋ก๊ฑฐ์ ์ด๋ฆ. |
pathname | %(pathname)s | ๋ก๊น ํธ์ถ์ด ์ผ์ด๋ ์์ค ํ์ผ์ ์ ์ฒด ๊ฒฝ๋ก๋ช (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ). |
process | %(process)d | ํ๋ก์ธ์ค ID (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ). |
processName | %(processName)s | ํ๋ก์ธ์ค ์ด๋ฆ (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ). |
relativeCreated | %(relativeCreated)d | logging ๋ชจ๋์ด ๋ก๋๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก LogRecord๊ฐ ์์ฑ๋ ์๊ฐ (๋ฐ๋ฆฌ ์ด). |
stack_info | ์ง์ ํฌ๋งทํ ํ์๋ ์์ต๋๋ค. | ํ์ฌ ์ค๋ ๋์ ์คํ ๋ฐ๋ฅ์์ ์ด ๋ ์ฝ๋๋ฅผ ์์ฑํ ๋ก๊น ํธ์ถ์ ์คํ ํ๋ ์๊น์ง์ ์คํ ํ๋ ์ ์ ๋ณด (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ). |
thread | %(thread)d | ์ค๋ ๋ ID (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ). |
threadName | %(threadName)s | ์ค๋ ๋ ์ด๋ฆ (์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ). |
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')
์คํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:::
DEBUG:This message should appear on the console
INFO:So should this
WARNING:And this, too
***ํ์ง๋ง, ๊ฐ๋จํ ์ฌ์ฉ์ ์ํด์๋ levelname (์ฌ๊ฐ๋), message (์ด๋ฒคํธ ์ค๋ช , ๋ณ์ ๋ฐ์ดํฐ ํฌํจ) ์ ์๋ง๋ ๋ฐ์ ์๊ฐ์ ํ์ํด์ผ ํ ๊ฒ์ ๋๋ค.
๋ฉ์์ง์ ๋ ์ง/์๊ฐ ํ์
์ด๋ฒคํธ์ ๋ ์ง์ ์๊ฐ์ ํ์ํ๋ ค๋ฉด, ํฌ๋งท ๋ฌธ์์ด์ ‘%(asctime)s’ ์ ๋ฃ๊ธฐ
import logging
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')
์คํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:::
2010-12-12 11:41:42,612 is when this event was logged.
***(์์ ๋์จ) ๋ ์ง/์๊ฐ ํ์์ ๊ธฐ๋ณธ ํฌ๋งท์ ISO8601 ๋๋ RFC 3339์ ๊ฐ์ต๋๋ค. ๋ ์ง/์๊ฐ์ ํฌ๋งท์ ์ข ๋ ์ ์ดํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ด ์์ ์์์๊ฐ์ด basicConfig ์ datefmt ์ธ์๋ฅผ ์ ๊ณตํ์ญ์์ค:
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
์คํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:::
12/12/2010 11:46:36 AM is when this event was logged.
datefmt ์ธ์์ ํ์์ time.strftime() ์ ์ํด ์ง์๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
'Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
flask requests.post ์์ ๋ณด๋ธ ๋ฐ์ดํฐ ๋ค ๋ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ (0) | 2024.03.19 |
---|---|
json.load()์ json.loads()์ ์ฐจ์ด (0) | 2024.03.14 |