Python Log文件大小设置及备份的方法

作者:xyztank 时间:2022-08-02 13:46:14 

一、配置文件大小及数量

日志文件代码需要引入RotatingFileHandler方法,如下:


from logging.handlers import RotatingFileHandler

配置文件大小及数量,比如:“设置写入文件,如果文件超过1M大小时,切割日志文件,仅保留3个文件”,如下所示:


# 写入文件,如果文件超过1M大小时,切割日志文件,仅保留3个文件
logger_handler = RotatingFileHandler(filename=log_path, maxBytes=1 * 1024 * 1024, backupCount=3, encoding='utf-8')

若文件大小超过1M大小时,就切割日志文件,仅保留3个文件,并且文件的格式为app.log1、app.log2...,如图所示:

Python Log文件大小设置及备份的方法

RotatingFileHandler方法源码,如下所示:

Python Log文件大小设置及备份的方法

二、日志代码


#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
------------------------------------
# @FileName    :handle_log.py
# @Time        :2020/8/31 19:59
# @Author      :xieyuanzuo
# @description :
------------------------------------
"""

import logging
import os
import colorlog
from logging.handlers import RotatingFileHandler
from datetime import datetime

cur_path = os.path.dirname(os.path.realpath(__file__))  # 当前项目路径
log_path = os.path.join(os.path.dirname(cur_path), 'logs')  # log_path为存放日志的路径
if not os.path.exists(log_path): os.mkdir(log_path)  # 若不存在logs文件夹,则自动创建

log_colors_config = {
   # 终端输出日志颜色配置
   'DEBUG': 'white',
   'INFO': 'cyan',
   'WARNING': 'yellow',
   'ERROR': 'red',
   'CRITICAL': 'bold_red',
}

default_formats = {
   # 终端输出格式
   'color_format': '%(log_color)s%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s',
   # 日志输出格式
   'log_format': '%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s'
}

class HandleLog:
   """
   先创建日志记录器(logging.getLogger),然后再设置日志级别(logger.setLevel),
   接着再创建日志文件,也就是日志保存的地方(logging.FileHandler),然后再设置日志格式(logging.Formatter),
   最后再将日志处理程序记录到记录器(addHandler)
   """

def __init__(self):
       self.__now_time = datetime.now().strftime('%Y-%m-%d')  # 当前日期格式化
       self.__all_log_path = os.path.join(log_path, self.__now_time + "-all" + ".log")  # 收集所有日志信息文件
       self.__error_log_path = os.path.join(log_path, self.__now_time + "-error" + ".log")  # 收集错误日志信息文件
       self.__logger = logging.getLogger()  # 创建日志记录器
       self.__logger.setLevel(logging.DEBUG)  # 设置默认日志记录器记录级别

@staticmethod
   def __init_logger_handler(log_path):
       """
       创建日志记录器handler,用于收集日志
       :param log_path: 日志文件路径
       :return: 日志记录器
       """
       # 写入文件,如果文件超过1M大小时,切割日志文件,仅保留3个文件
       logger_handler = RotatingFileHandler(filename=log_path, maxBytes=1 * 1024 * 1024, backupCount=3, encoding='utf-8')
       return logger_handler

@staticmethod
   def __init_console_handle():
       """创建终端日志记录器handler,用于输出到控制台"""
       console_handle = colorlog.StreamHandler()
       return console_handle

def __set_log_handler(self, logger_handler, level=logging.DEBUG):
       """
       设置handler级别并添加到logger收集器
       :param logger_handler: 日志记录器
       :param level: 日志记录器级别
       """
       logger_handler.setLevel(level=level)
       self.__logger.addHandler(logger_handler)

def __set_color_handle(self, console_handle):
       """
       设置handler级别并添加到终端logger收集器
       :param console_handle: 终端日志记录器
       :param level: 日志记录器级别
       """
       console_handle.setLevel(logging.DEBUG)
       self.__logger.addHandler(console_handle)

@staticmethod
   def __set_color_formatter(console_handle, color_config):
       """
       设置输出格式-控制台
       :param console_handle: 终端日志记录器
       :param color_config: 控制台打印颜色配置信息
       :return:
       """
       formatter = colorlog.ColoredFormatter(default_formats["color_format"], log_colors=color_config)
       console_handle.setFormatter(formatter)

@staticmethod
   def __set_log_formatter(file_handler):
       """
       设置日志输出格式-日志文件
       :param file_handler: 日志记录器
       """
       formatter = logging.Formatter(default_formats["log_format"], datefmt='%a, %d %b %Y %H:%M:%S')
       file_handler.setFormatter(formatter)

@staticmethod
   def __close_handler(file_handler):
       """
       关闭handler
       :param file_handler: 日志记录器
       """
       file_handler.close()

def __console(self, level, message):
       """构造日志收集器"""
       all_logger_handler = self.__init_logger_handler(self.__all_log_path)  # 创建日志文件
       error_logger_handler = self.__init_logger_handler(self.__error_log_path)
       console_handle = self.__init_console_handle()

self.__set_log_formatter(all_logger_handler)  # 设置日志格式
       self.__set_log_formatter(error_logger_handler)
       self.__set_color_formatter(console_handle, log_colors_config)

self.__set_log_handler(all_logger_handler)  # 设置handler级别并添加到logger收集器
       self.__set_log_handler(error_logger_handler, level=logging.ERROR)
       self.__set_color_handle(console_handle)

if level == 'info':
           self.__logger.info(message)
       elif level == 'debug':
           self.__logger.debug(message)
       elif level == 'warning':
           self.__logger.warning(message)
       elif level == 'error':
           self.__logger.error(message)
       elif level == 'critical':
           self.__logger.critical(message)

self.__logger.removeHandler(all_logger_handler)  # 避免日志输出重复问题
       self.__logger.removeHandler(error_logger_handler)
       self.__logger.removeHandler(console_handle)

self.__close_handler(all_logger_handler)  # 关闭handler
       self.__close_handler(error_logger_handler)

def debug(self, message):
       self.__console('debug', message)

def info(self, message):
       self.__console('info', message)

def warning(self, message):
       self.__console('warning', message)

def error(self, message):
       self.__console('error', message)

def critical(self, message):
       self.__console('critical', message)

log = HandleLog()

if __name__ == '__main__':
   for i in range(50000):
       log.info("这是日志信息")
       log.debug("这是debug信息")
       log.warning("这是警告信息")
       log.error("这是错误日志信息")
       log.critical("这是严重级别信息")

来源:https://www.cnblogs.com/xyztank/articles/13599165.html

标签:Python,Log,文件备份
0
投稿

猜你喜欢

  • Python3使用PyQt5制作简单的画板/手写板实例

    2022-01-11 15:21:30
  • 有用的:nth-child秘方

    2011-07-01 12:56:11
  • Python使用pylab库实现绘制直方图功能示例

    2022-12-07 04:48:56
  • python逆向微信指数爬取实现步骤

    2022-03-31 03:36:48
  • Oracle 数据表分区的策略

    2023-07-08 12:19:18
  • thinkphp6如何使用中间件记录行为日志

    2023-06-13 14:43:44
  • Python实现弹球小游戏的示例代码

    2022-12-15 18:09:07
  • Python tkinter的grid布局及Text动态显示方法

    2023-06-28 14:54:00
  • Python json模块dumps、loads操作示例

    2023-01-03 20:16:29
  • 如何做好一份前端工程师的简历?

    2009-02-17 12:52:00
  • numpy np.newaxis 的实用分享

    2023-01-21 06:06:25
  • python 实现Flask中返回图片流给前端展示

    2023-12-01 06:58:23
  • PyQt QCombobox设置行高的方法

    2021-10-15 19:50:20
  • 教你快速掌握更改表中列顺序的好方法

    2008-11-27 17:14:00
  • Python matplotlib实用绘图技巧汇总

    2023-10-05 01:12:39
  • python3通过udp实现组播数据的发送和接收操作

    2023-01-14 02:27:42
  • Oracle数据库与SQL Server数据库镜像对比

    2009-04-11 16:24:00
  • 语义、标准和样式

    2008-06-05 12:52:00
  • python 实现以相同规律打乱多组数据

    2021-09-21 14:28:18
  • python3 property装饰器实现原理与用法示例

    2021-07-10 05:02:28
  • asp之家 网络编程 m.aspxhome.com