본문 바로가기
기록/Python

[Python/Linux] 파이썬 로그 일별 생성 및 주기적으로 삭제 설정 방법 기록

by 자임 2022. 10. 20.

 

https://lifesteps.tistory.com/175?category=1007014 

 

[Python] 파이썬 로그 찍는 방법 및 오류 해결

### log 세팅 import logging def get_logger(name=None): # 1 logger instance를 만듭니다. logger = logging.getLogger(name) # 2 logger의 level을 가장 낮은 수준인 DEBUG로 설정합니다. logger.setLevel(logg..

lifesteps.tistory.com

여기서 추가 개발



수정 이유 : 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