# -*- coding: utf-8 -*-
# @Time : 2019/3/27 21:52
# @Author : cd
import logging
# 按文件大小滾動備份
from logging.handlers import RotatingFileHandler
# 控制檯日誌輸入顏色
import colorlog
import time
import datetime
import os
# log_path是存放日誌的路徑
log_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'logs')
# 如果不存在這個logs文件夾,就自動創建一個
# if not os.path.exists(log_path): os.mkdir(log_path)
os.makedirs(log_path, exist_ok=True)
# log文件按照時間命名 2019-3-27.log 命名
logName = os.path.join(log_path, '%s.log' % time.strftime('%Y-%m-%d'))
# 終端打印用顏色顯示
log_colors_config = {
'DEBUG': 'cyan',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'red',
}
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = colorlog.ColoredFormatter(
'%(log_color)s[%(asctime)s] [%(levelname)s]- %(message)s [%(filename)s:%(lineno)d]',
log_colors=log_colors_config) # 日誌輸出格式
# self.handle_logs()
# 創建一個FileHandler,用於寫到本地
# 使用RotatingFileHandler類,滾動備份日誌 每份log文件5Mb
fh = RotatingFileHandler(filename=logName, mode='a', maxBytes=1024 * 1024 * 5, backupCount=5, encoding='utf8')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
# 創建一個StreamHandler,用於輸出到控制檯
ch = colorlog.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)
def get_file_sorted(file_path):
"""最後修改時間順序升序排列 os.path.getmtime()->獲取文件最後修改時間"""
dir_list = os.listdir(file_path)
if not dir_list:
return
else:
dir_list = sorted(dir_list, key=lambda x: os.path.getmtime(os.path.join(file_path, x)))
return dir_list
def TimeStampToTime(timestamp):
"""格式化時間"""
timeStruct = time.localtime(timestamp)
return str(time.strftime('%Y-%m-%d', timeStruct))
def handle_logs():
"""處理日誌過期天數和文件數量"""
os.makedirs('logs', exist_ok=True)
dir_list = ['logs'] # 要刪除文件的目錄名
for dir in dir_list:
dirPath = os.path.join(os.path.abspath(os.path.dirname(__file__)), dir) # 拼接刪除目錄完整路徑
# 返回按修改時間排序的文件list
file_list = get_file_sorted(dirPath)
if file_list: # 目錄下沒有日誌文件
for i in file_list:
# 拼接文件的完整路徑
file_path = os.path.join(dirPath, i)
t_list = TimeStampToTime(os.path.getctime(file_path)).split('-')
now_list = TimeStampToTime(time.time()).split('-')
# 將時間轉換成datetime.datetime 類型
t = datetime.datetime(int(t_list[0]), int(t_list[1]),
int(t_list[2]))
now = datetime.datetime(int(now_list[0]), int(now_list[1]), int(now_list[2]))
# 創建時間大於6天的文件刪除
if (now - t).days > 6:
delete_logs(file_path)
# 限制目錄下記錄文件數量
if len(file_list) > 4:
file_list = file_list[0:-4]
for i in file_list:
file_path = os.path.join(dirPath, i)
print(file_path)
delete_logs(file_path)
def delete_logs(file_path):
try:
os.remove(file_path)
except PermissionError as e:
logger.warning('刪除日誌文件失敗:{}'.format(e))
if __name__ == "__main__":
# 別的模塊導包之前需要先調用處理log文件函數 handle_logs()
# 先處理過期文件
# 若是有的任務持續性跑,可以設置定時任務調用處理過期log函數
handle_logs()
logger.debug(111)
logger.info(222)
logger.warning(333)
logger.critical(444)