importlogging# logging 표준 라이브러리를 사용한다.
deflogging_basic():# 로거 객체를 생성
logger_name="logging_basic"# 로거 이름 설정
logger=logging.getLogger(logger_name)# 로깅 설정
filename="logs/logging_basic_log.log"# 로그를 기록할 파일 경로 설정
logging.basicConfig(filename=filename,# 로그를 기록할 파일 경로
level=logging.DEBUG,# 로거가 처리할 최소 로그 레벨
encoding='utf-8'# 파일 인코딩
)# basicConfig : 간단한 기본 로깅 설정
# filename 을 지정하면 FileHandler 로 파일에 로그를 기록하며,
# filename 을 지정하지 않으면 StreamHandler 로 콘솔에 로그를 출력한다.
# 로그 메시지를 기록한다.
logger.info("info 메시지입니다.")logger.debug("debug 메시지입니다.")logger.warning("warning 메시지입니다.")logger.error("error 메시지입니다.")if__name__=="__main__":logging_basic()
로그 레벨
로그 레벨은 기본적으로 NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL 6단계로 구성된다.
이들은 각각 정수값으로 표현되는데, 순서대로 0, 10, 20, 30, 40, 50 이다.
importloggingfromloggingimportLogRecorddeflog_level_test():# 로거 객체를 생성
logger_name="log_level"logger=logging.getLogger(logger_name)# 로깅 설정
filename="logs/log_level_log.log"logging.basicConfig(filename=filename,level=logging.INFO,# 로거가 처리할 최소의 로그 레벨을 INFO 로 정함
encoding='utf-8')# 로그 레벨은 기본적으로 6개의 단계로 이루어져 있다.
# 그리고 이들은 정수값을 가지고 있다.
# logging.__init__.py 파일에서 자세하게 살펴볼 수 있다.
"""
CRITICAL = FATAL = 50
ERROR = 40
WARNING = WARN = 30
INFO = 20
DEBUG = 10
NOTSET = 0
"""# 로그 메시지를 기록한다.
# 설정한 레벨 미만의 로그는 기록되지 않는다.
logger.debug("debug 메시지입니다.")logger.info("info 메시지입니다.")logger.warning("warning 메시지입니다.")logger.error("error 메시지입니다.")if__name__=="__main__":log_level_test()
아래는 로그가 저장된 log_level_log.log 파일이다.
로거의 로그 레벨인 INFO 미만인 logger.debug()를 통해 보내진 로그메시지는 기록되지 않은 것을 볼 수 있다.
importlogging# logging 표준 라이브러리를 사용한다.
deflogging_to_file():# 로거 객체를 생성
logger_name="log_to_file"logger=logging.getLogger(logger_name)logger.propagate=False# 전파 방지
# 로깅 설정
filename="logs/log_to_file_log.log"logging.basicConfig(filename=filename,level=logging.INFO,encoding='utf-8')"""
파일에 로그를 작성할 때에는 "편집 모드" 를 지정할 수 있다.
편집모드는 w(쓰기), a(추가), r(읽기) 세 가지가 있다.
"""# 기본 편집 모드는 a(추가) 이다.
logger.info("file에 로깅하는 첫 메시지입니다.")logger.info("file에 로깅하는 두 번째 메시지입니다.")withopen(filename,'r')asf:print(f.readlines())# 편집 모드를 w(쓰기)로 하면 -> 이전의 내용이 없어지고, 새로 쓰여진다.
logger.handlers.clear()file_handler=logging.FileHandler(filename=filename,mode='w',encoding='utf-8')file_handler.setLevel(logging.INFO)logger.addHandler(file_handler)logger.error("w(쓰기 모드)로 로깅한 새로운 로그입니다.")withopen(filename,'r')asf:print(f.readlines())# 편집 모드를 a(추가)로 바꾼다면 -> 이전의 내용에 이어서 로그가 작성된다.
logger.handlers.clear()file_handler=logging.FileHandler(filename=filename,mode='a',encoding='utf-8')file_handler.setLevel(logging.INFO)logger.addHandler(file_handler)logger.error("a(추가 모드)로 로깅한 추가 편집 메시지입니다.")withopen(filename,'r')asf:print(f.readlines())# 로깅 설정을 "읽기"로 바꾼다면
logger.handlers.clear()file_handler=logging.FileHandler(filename=filename,mode='r',encoding='utf-8')file_handler.setLevel(logging.INFO)logger.addHandler(file_handler)logger.error("읽기 전용 메시지입니다.")# 에러 발생 : io.UnsupportedOperation: not writable
if__name__=="__main__":logging_to_file()
importlogging# logging 표준 라이브러리를 사용한다.
defchange_message_format():# 로거 객체를 생성
logger_name="message_format"logger=logging.getLogger(logger_name)# 로깅 설정
filename="logs/message_format_log.log"logging.basicConfig(filename=filename,level=logging.INFO,encoding='utf-8')# 기본적인(basicConfig) 메시지 포맷 테스트
logger.error("기본적인(basicConfig) 메시지 포맷 테스트")# 포맷 변경
# 자세한 포맷 작성법은 logging.__init__.py 의 Formatter 클래스 부분에서 확인 가능
logger.propagate=False# 전파 방지
logger.handlers.clear()new_format=logging.Formatter("%(lineno)s %(levelname)s - %(process)s %(filename)s %(message)s")# 새로운 포맷
file_handler=logging.FileHandler(filename=filename,mode='a',encoding='utf-8')file_handler.setLevel(logging.INFO)file_handler.setFormatter(new_format)# 포맷 설정
logger.addHandler(file_handler)logger.error("로깅 포맷 설정을 바꿔보았습니다.")if__name__=="__main__":change_message_format()
아래는 로그파일
1
2
ERROR:message_format:기본적인(basicConfig) 메시지 포맷 테스트
24 ERROR - 8912 logging_04_message_format.py 로깅 포맷 설정을 바꿔보았습니다.
날짜 표시 형식 바꾸기
로그 생성 날짜(asctime) 의 표현 방식을 datefmt 파라미터로 지정할 수 있다.
importlogging# logging 표준 라이브러리를 사용한다.
importtimedeflog_datetime():# 로거 객체를 생성
logger_name="datetime_format"logger=logging.getLogger(logger_name)# 로깅 설정
filename="logs/datetime_format_log.log"logging.basicConfig(filename=filename,level=logging.INFO,encoding='utf-8',format="%(asctime)s - %(message)s")# 기본적인 시간 표현
logger.info("기본적인 datetime format 입니다.")# 시간 표현 방법 변경
logger.propagate=Falsenew_format=logging.Formatter(fmt="%(asctime)s - %(message)s",datefmt="%Y년 %m월 %d일 %H시 %M분 %S초")# 새로운 포맷
file_handler=logging.FileHandler(filename=filename,mode='a',encoding='utf-8')file_handler.setLevel(logging.INFO)file_handler.setFormatter(new_format)# 포맷 설정
logger.addHandler(file_handler)logger.error("변경된 datetime format 입니다.")if__name__=="__main__":log_datetime()
출력된 로그파일은 아래와 같다.
1
2
2025-11-03 22:22:21,510 - 기본적인 datetime format 입니다.
2025년 11월 03일 22시 22분 21초 - 변경된 datetime format 입니다.
댓글 남기기