logging은 로그 기록을 생성 및 관리하는 라이브러리입니다. 별도의 설치 없이 사용할 수 있습니다.
코드의 진행상황을 출력하는 로그는 print()를 사용해도 구현할 수 있긴 합니다.
하지만 logging을 사용하면 출력 터미널에 기록이 나타나는 것에서 멈추지 않고 파일로 남기거나, DB에 남기는 것도 가능해집니다.
getLogger( )
logging은 기본적으로 Logger 객체를 생성하는 것에서 시작합니다. Logger 객체는 getLogger()함수로 생성할 수 있습니다.
import logging
logger = logging.getLogger(__name__)
Logger를 통해 띄울 수 있는 로그의 종류는 아래와 같습니다
if __name__ == "__main__":
logger.debug("This is a debug message") # 디버그
logger.info("This is a info message") # 정보
logger.warning("This is a warning message") # 경고
logger.error("This is a error message") # 에러
logger.critical("This is a critical message") # 치명적 에러
basicConfig( )
하지만 이를 실행하면 경고와 에러, 그리고 치명적 에러 로그만 출력됩니다.
This is a warning message
This is a error message
This is a critical message
이는 로그가 출력되는 최소 기준선이 기본적으로 경고(warning) 레벨까지 설정되어 있기 때문입니다. Logger는 이 기준선 이상의 로그만 터미널에 출력하게 됩니다.
Logger의 basicConfig( )함수는 이 기준선을 포함하여 출력 형식, 일자 등 세부사항들을 설정할 수 있습니다.
| 매개변수 | 타입 | 기능 |
| level | logging.DEBUG | ... | logging.CRITICAL | 로그 출력 기준선 설정 |
| format | string | 전체 출력 형식 설정 |
| datefmt | string | 날짜 출력 형식 설정 |
| filename | string | 로그를 저장할 파일 이름 설정할 시 터미널에 출력되지 않는 대신 파일로 저장됨 |
| filemode | 'a' | 'w' | a : 이어서 쓰기 w : 새로 쓰기 |
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='test.log',
filemode='a'
)
logger = logging.getLogger(__name__)
asctime | 로그가 생성된 시간
levelname | 로그 레벨(debug, info 등)
name | Logger 객체의 이름
lineno | 로그가 발생한 소스코드의 줄 번호
message | 실제 로그 내용
이제 새로운 Logger는 이렇게 로그를 생성합니다.
2026-03-26 17:22:38 [DEBUG] __main__:11 - This is a debug message
2026-03-26 17:22:38 [INFO] __main__:12 - This is a info message
2026-03-26 17:22:38 [WARNING] __main__:13 - This is a warning message
2026-03-26 17:22:38 [ERROR] __main__:14 - This is a error message
2026-03-26 17:22:38 [CRITICAL] __main__:15 - This is a critical message
핸들러
핸들러는 로그를 어느 위치에 어떤 방식으로 남길지 결정하는 객체입니다. basicConfig()는 기본적으로 rootLoggerHandler를 사용하는데, 이를 바꾸면 파일을 저장하면서도 터미널에서 로그를 출력할 수 있습니다.
| 핸들러 | 로그 출력 위치 |
| StreamHandler | 터미널에 출력 |
| FileHandler | 파일에 출력 |
| RotatingFileHanlder | 파일에 출력, 파일이 커지면 새 파일을 자동으로 생성 |
| TimedRotatingFileHandler | 파일에 출력, 경과 시간을 넘기면 새 파일을 자동으로 생성 |
import logging
import sys
from logging.handlers import TimedRotatingFileHandler
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
log_format = logging.Formatter(
'%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 터미널 출력용 핸들러 설정
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(log_format) # 출력 형태 설정
console_handler.setLevel(logging.DEBUG) # 출력 기준 설정
logger.addHandler(console_handler) # Logger에 핸들러 추가
# 파일 출력용 핸들러 설정
file_handler = TimedRotatingFileHandler(
filename='test.log',
when='midnight', # 매일 자정에 로그 파일 교체
interval=1, # 1일 간격으로 교체
backupCount=30, # 최대 30개의 백업 파일 유지
encoding='utf-8' # 인코딩 설정
)
file_handler.setFormatter(log_format) # 출력 형태 설정
file_handler.setLevel(logging.INFO) # 출력 기준 설정
logger.addHandler(file_handler) # Logger에 핸들러 추가'Language > Python' 카테고리의 다른 글
| [Python] Uv에 대하여 (1) | 2026.04.09 |
|---|---|
| [Python] Library | 11. typing (0) | 2026.04.08 |
| [Python] Library | 09. dotenv (0) | 2026.03.26 |
| [Python] Syntax | 04. import (0) | 2026.02.17 |
| [Python] Syntax | 03. Decorator(@) (0) | 2026.02.16 |