https://lifesteps.tistory.com/175?category=1007014
여기서 추가 개발
수정 이유 : log가 한 파일에 계속 쌓이니까 너무 무거워짐
목표 : log 파일 하루마다 새로 생성, 일별 로그 관리
참고 :
https://toramko.tistory.com/m/entry/python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-logging-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9D%BC%EB%8B%A8%EC%9C%84-%EB%A1%9C%EA%B7%B8-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0-feat-%EB%A1%9C%EA%B9%85%EC%9D%B4%EB%9E%80
처음에 수정했던 코드
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
# log format
formatter = logging.Formatter("%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s")
# log 파일에 기록
console = logging.StreamHandler()
file_handler_info = logging.FileHandler("[경로]/apiLog_info_{:%Y%m%d}.log".format(datetime.datetime.now()), encoding="utf-8")
file_handler_error = logging.FileHandler("[경로]/apiLog_error_{:%Y%m%d}.log".format(datetime.datetime.now()), encoding='utf-8')
# 하루에 한 번 새로운 log 파일 생성
timedfilehandler_info = logging.handlers.TimedRotatingFileHandler(filename='apiLog_info', when='midnight', interval=1,
encoding='utf-8')
timedfilehandler_error = logging.handlers.TimedRotatingFileHandler(filename='apiLog_error', when='midnight', interval=1,
encoding='utf-8')
timedfilehandler_info.setFormatter(formatter)
timedfilehandler_error.setFormatter(formatter)
timedfilehandler_info.suffix = "%Y%m%d"
timedfilehandler_error.suffix = "%Y%m%d"
# level 설정
console.setLevel(logging.INFO)
file_handler_info.setLevel(logging.INFO)
file_handler_error.setLevel(logging.ERROR)
# format
console.setFormatter(formatter)
file_handler_info.setFormatter(formatter)
file_handler_error.setFormatter(formatter)
# handler
logger.addHandler(console)
logger.addHandler(file_handler_info)
logger.addHandler(file_handler_error)
logger.addHandler(timedfilehandler_info)
logger.addHandler(timedfilehandler_error)
return logger
에러 :
- PermissionError: [WinError 32] 다른 프로세스가 파일을 사용 중이기 때문에 프로세스가 액세스 할 수 없습니다: 'C:\\[경로]\\apiLog_error' -> 'C:\\[경로]\\apiLog_error.20221018'
- 로그 레벨 설정이 적용이 안 된 채로 나옴
원인 : logging.FileHandler, logging.handlers.TimedRotatingFileHandler 이 두 개를 같이 적용해야 동작하는 줄 알았는데 (두 개가 별개라고 생각함) TimedRotatingFileHandler 이거만 있어도 되는 거였음. TimedRotatingFileHandler에는 FileHandler에서 주기적으로 새로 로그 파일 생성해주는 기능이 추가된 것 같다.
최종 log 파일
import datetime
import logging
import logging.handlers
def get_logger(name=None):
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
# log format
formatter = logging.Formatter("%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s")
# log 파일에 기록 (일별 생성)
console = logging.StreamHandler()
timedfilehandler_info = logging.handlers.TimedRotatingFileHandler(filename="[경로]/apiLog_info_{:%Y%m%d}.log".format(datetime.datetime.now()),
when="midnight", interval=1, encoding="utf-8")
timedfilehandler_error = logging.handlers.TimedRotatingFileHandler(filename="[경로]/apiLog_error_{:%Y%m%d}.log".format(datetime.datetime.now()),
when="midnight", interval=1, encoding="utf-8")
timedfilehandler_info.setFormatter(formatter)
timedfilehandler_error.setFormatter(formatter)
# timedfilehandler_info.suffix = "%Y%m%d"
# timedfilehandler_error.suffix = "%Y%m%d"
# level 설정
console.setLevel(logging.INFO)
timedfilehandler_info.setLevel(logging.INFO)
timedfilehandler_error.setLevel(logging.ERROR)
# format
console.setFormatter(formatter)
timedfilehandler_info.setFormatter(formatter)
timedfilehandler_error.setFormatter(formatter)
# add handler
logger.addHandler(console)
logger.addHandler(timedfilehandler_info)
logger.addHandler(timedfilehandler_error)
return logger
# timedfilehandler_info.suffix = "%Y%m%d"
이거를 설정하면 기존 로그파일 이름 뒤에 자동으로 %Y%m%d 해당 포맷의 날짜가 붙고, 신규 로그 파일이 생성된다(롤링)
나는 따로 파일명에 날짜를 넣어줬기 때문에 생략.
filename="[경로]/apiLog_info_{:%Y%m%d}.log".format(datetime.datetime.now())
=> apiLog_info_20221020.log
timedfilehandler_info.suffix = "%Y%m%d"
=> apiLog_info.log.20221020
+
로그 주기적으로 삭제하기
1. 주기적으로 삭제해주는 쉘 만들기
#!/bin/sh
/usr/bin/find /log/ -type f -mtime +10 -exec rm {} +
type -f : 파일만 찾는 Option
-mtime +10 : 10일 지난 로그 파일 삭제
출처 : https://khj93.tistory.com/entry/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%9D%BC%EC%A0%95-%EA%B8%B0%EA%B0%84%EC%9D%B4-%EC%A7%80%EB%82%9C-%EB%A1%9C%EA%B7%B8-%EC%9E%90%EB%8F%99-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0
2. 해당 쉘을 크론탭에 추가
크론탭(crontab)이란, 스케줄링을 관리하는 프로그램
crontab -e : 크론탭 수정 및 추가
crontab -l : 현재 크롬탭 내용 확인
- 스케줄링 설정
* * * * *
분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)
0 1 * * * /[경로]/apiLogClean.sh
매일 새벽 1시에 구동되게끔 설정.
출처 : https://jdm.kr/blog/2
'기록 > Python' 카테고리의 다른 글
[Python] 파이썬 아이피 형식 맞춰주기 - 0 채워주는 zfill() 함수 (0) | 2022.10.28 |
---|---|
[Python] 로그 일별 생성 PermissionError: [WinError 32] 오류 해결 기록 (0) | 2022.10.27 |
[Python] 파이썬 로그 찍는 방법 및 오류 해결 (0) | 2022.10.14 |
[Python] 파이썬 requests.post 에 header 추가 (0) | 2022.10.14 |
[Python] 파이썬 flask 서버에서 POST 방식으로 데이터 받기 (0) | 2022.10.14 |