반응형
작성일: 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' 카테고리의 다른 글
주기적 화면 캡처 및 OCR 적용된 PDF 파일로 변환 (나만의 eBook 만들기) (0) | 2025.01.12 |
---|---|
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 |