반응형
작성일: 2024월 3월 26일
내 밥벌이가 Python 언어로 개발하는 일이 아니다보니, Python으로 뭔가 만드는 일이 1년에 한 번 있을까 말까한다.
(누가 시켜서 만든다기 보다는 일하다가 자동화가 필요한 상황이 생길 때 ~~~)
오늘도 Python Logging 기능을 5년 만에 쓸 일이 있어서 다시 작성하려고 보니,
구글링해야 하고.. 예제 코드 작성해서 확인하고, 그런 후에 작성하려고 한 application에 적용하고...
이렇게 시간을 보내고 나니까 나 스스로 참 답답한 느낌이다.
다음 5년 뒤에도 이런 답답함이 없기를 바라면서 오늘 작성한 것을 잘 메모해야 겠다 ^^
#!/usr/bin/python3
import logging
import logging.handlers
import os
import datetime
import threading
import time
class MyLog():
def __init__(self, dir, logname) -> None:
self.logname = logname
self.dir = os.path.join(dir,logname)
self.InitLogger()
def InitLogger(self):
## Log format 설정하기
formatter = logging.Formatter("[%(asctime)s] %(levelname)s %(filename)s:%(lineno)d - %(message)s")
if os.path.exists(self.dir) == False :
os.makedirs(self.dir)
log_File = os.path.join(self.dir, self.logname + ".log")
timedfilehandler = logging.handlers.TimedRotatingFileHandler(filename=log_File, when='midnight', interval=1, encoding='utf-8')
timedfilehandler.setFormatter(formatter)
timedfilehandler.suffix = "%Y%m%d.log"
self.logger = logging.getLogger(self.logname)
self.logger.addHandler(timedfilehandler)
self.logger.setLevel(logging.INFO)
self.delete_old_log(self.dir, 3)
now = datetime.datetime.now()
self.toDay = "%04d-%02d-%02d" % (now.year, now.month, now.day)
self.th_auto_delete = threading.Thread(target=self.auto_delete, daemon=True)
self.th_auto_delete.start()
'''
함수 인자 설명:
- fpath:삭제할 파일이 있는 디렉토리,
- age:경과일수
'''
def delete_old_log(self, fpath, age):
for fp in os.listdir(fpath):
fp = os.path.join(fpath, fp)
if os.path.isfile(fp):
timestamp_now = datetime.datetime.now().timestamp()
if os.stat(fp).st_mtime < timestamp_now - (age * 24 * 60 * 60):
try:
os.remove(fp)
except OSError:
print(fp, 'this log file is not deleted')
def auto_delete(self):
while True:
now = datetime.datetime.now()
day = "%04d-%02d-%02d" % (now.year, now.month, now.day)
if self.toDay != day:
self.toDay = day
self.delete_old_log(self.dir, 3)
time.sleep(600)
## This is test code.
if __name__ == '__main__':
log = MyLog("my_log_test_dir", logname="sejong")
for idx in range(3):
log.logger.info(f"로그 메시지가 잘 기록되는지 테스트 중 {idx}")
테스트는 아래와 같이 하면 된다. 일단, 잘 동작함, OK !!
$ ./my_log.py
...
위 'MyLog' 클래스를 다른 Application code에서 참고한다면, 아래 예제와 같이 작성하면 된다.
참고: my_log.py는 아래 소스 코드 my_sample_app.py와 같은 디렉토리에 있어야 한다.
#!/usr/bin/python3
import my_log
...
... 중간 생략 ...
...
if __name__ == '__main__':
log = my_log.MyLog("log_my_sample_dir", logname="my_sample")
log.logger.info("##### Start program #####")
... 중간 생략 ...
$ ./my_sample_app.py
...
'Python' 카테고리의 다른 글
Python 온라인 자습서(Tutorial), Reference, Howto, API 문서 (0) | 2024.03.27 |
---|---|
Bind9 Zone 파일의 Serial 변경하는 Python Script, Bash Script (0) | 2024.03.25 |
Prometheus 설치 + Python 예제 코드 (0) | 2023.06.13 |
YAML, JSON 파일 내용 비교 (변경 내역 비교) (0) | 2021.11.18 |