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)

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章