log按照文件大小和时间滚动备份以及颜色输出

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

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值