|
| 1 | +--- |
| 2 | +title: "[Python] logger를 사용하여 코드 기록 남기기" |
| 3 | +excerpt: "Description of linux command by sehoon-lee" |
| 4 | + |
| 5 | +categories: |
| 6 | + - python |
| 7 | +tags: |
| 8 | + - [python] |
| 9 | + |
| 10 | +toc: true |
| 11 | +toc_sticky: true |
| 12 | + |
| 13 | +date: 2024-11-14 |
| 14 | +last_modified_at: 2024-11-14 |
| 15 | + |
| 16 | +math: true |
| 17 | +--- |
| 18 | + |
| 19 | +이번 게시물에는 파이썬의 logging 라이브러리를 이용해 코드 진행상황을 기록하여 활용하는 방법을 알아보겠습니다. |
| 20 | + |
| 21 | +## 1. 로그(log)란? |
| 22 | + |
| 23 | +로그는 시스템이나 어플리케이션에서 발생하는 다양한 이벤트와 활동을 기록한 데이터를 의미합니다. 로그에는 주로 아래와 같은 내용들을 기록합니다. |
| 24 | +- 타임 스탬프 : 시스템상 로그를 기록한 시간 정보를 의미합니다. |
| 25 | +- 이벤트 유형 : 이벤트 유형에는 Error, Warning, Info 등 이 있습니다. 이는 로깅 레벨에도 사용하는 것들입니다. |
| 26 | +- 이벤트 원본 : 어떤 프로그램 또는 프로세스 등이 이벤트를 발생 시켰는지 지록합니다. |
| 27 | +- 메세지 내용 : 유저가 기록하고 싶은 메세지 내용을 의미합니다. |
| 28 | + |
| 29 | +<br> |
| 30 | + |
| 31 | +## 2. 로깅 레벨 |
| 32 | + |
| 33 | +로그를 기록할 때 파일이나 스트림으로 어떤 로그 레벨부터 나타낼 것인지 설정을 할 수 있습니다. 중요도에 따라 각 레벨이 나누어 집니다. 아래에 중요도가 높은 순서 대로 나열 해 보았습니다. |
| 34 | + |
| 35 | +- Debug : 디버깅 정보, 개발 중 기록할만한 상세 정보를 나타냄 |
| 36 | +- Info : 일반 적인 메세지를 의미함. 주로 정상 작동에 대한 내용을 기록함 |
| 37 | +- Warning : 문제가 될 수 있는 가능성에 대한 정보를 기록함 |
| 38 | +- Error : 오류 내용에 대한 기록 |
| 39 | + |
| 40 | +특정 중요도로 로깅 레벨을 설정하면 해당 로깅 레벨보다 중요도가 약한 정보들은 모두 기록됨 |
| 41 | + |
| 42 | + |
| 43 | +## 3. 예시 로깅 설정 |
| 44 | + |
| 45 | +```python |
| 46 | +import os |
| 47 | +import logging |
| 48 | +from datetime import datetime |
| 49 | +from logging.handlers import TimedRotatingFileHandler |
| 50 | + |
| 51 | +class Logger: |
| 52 | + def __init__(self, logger_name="my_logger", log_dir="logs"): |
| 53 | + # 날짜별 폴더 생성 |
| 54 | + current_date = datetime.now().strftime("%Y-%m-%d") |
| 55 | + self.log_dir = os.path.join(log_dir, current_date) # logs/YYYY-MM-DD 폴더 생성 |
| 56 | + os.makedirs(self.log_dir, exist_ok=True) # 폴더가 없으면 생성 |
| 57 | + |
| 58 | + # 로그 파일 이름 설정 (logger name 포함) |
| 59 | + log_file = os.path.join(self.log_dir, f"{logger_name}_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.log") |
| 60 | + |
| 61 | + # 로거 설정 |
| 62 | + self.logger = logging.getLogger(logger_name) |
| 63 | + self.logger.setLevel(logging.DEBUG) # 원하는 로그 레벨 설정 |
| 64 | + |
| 65 | + # 파일 핸들러 생성 |
| 66 | + file_handler = TimedRotatingFileHandler(log_file, when="midnight", interval=1) |
| 67 | + file_handler.suffix = "%Y-%m-%d_%H-%M-%S.log" # 파일명에 날짜 및 시간 형식 추가 |
| 68 | + file_handler.setLevel(logging.DEBUG) |
| 69 | + |
| 70 | + # 콘솔 핸들러 생성 |
| 71 | + console_handler = logging.StreamHandler() |
| 72 | + console_handler.setLevel(logging.DEBUG) |
| 73 | + |
| 74 | + # 로그 형식 설정 (파일 이름과 함수 이름 포함) |
| 75 | + formatter = logging.Formatter( |
| 76 | + '%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(funcName)s] - %(message)s' |
| 77 | + ) |
| 78 | + file_handler.setFormatter(formatter) |
| 79 | + console_handler.setFormatter(formatter) |
| 80 | + |
| 81 | + # 로거에 핸들러 추가 |
| 82 | + self.logger.addHandler(file_handler) |
| 83 | + self.logger.addHandler(console_handler) |
| 84 | + |
| 85 | + def get_logger(self): |
| 86 | + return self.logger |
| 87 | +``` |
| 88 | +위 설정대로 파일을 작성하여 import 하여 사용이 가능하다. 현재 설정으로는 파일에도 기록하고, 스트림으로 커맨드창에도 나타내게 설정을 하였습니다. |
| 89 | + |
| 90 | +위 코드에서 중요한 부분은 우선 TimedRotationgFileHandler 를 사용한 부분으로 로그를 계속 기록하다가 자정이 넘어가면 새로운 파일에 기록이 되도록 설정하였습니다. |
| 91 | + |
| 92 | +다음으로는 foratter 로 로그가 기록되는 형태에 대해 설정하는 부분이다. 각자가 표현하고 싶은대로 순서를 변환하여 사용할 수 있습니다. |
| 93 | + |
| 94 | +위 코드는 기본 설정이므로 각자 상황에 맞게 설정을 추가하거나 변형하여 사용이 가능합니다. |
| 95 | + |
0 commit comments