# -*- 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)