Skip to content

Commit c477729

Browse files
241114 포스트 업로드
1 parent f8c51f1 commit c477729

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

_posts/2024-11-14-python-logger.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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

Comments
 (0)