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
投稿

猜你喜欢

  • Python基于socket实现TCP客户端和服务端

    2023-09-29 15:30:05
  • Django 导出 Excel 代码的实例详解

    2021-04-01 05:56:41
  • JS Object构造函数之Object.freeze

    2024-05-09 10:37:53
  • PHP5在Apache下的两种模式的安装

    2023-11-24 05:18:08
  • Python黑魔法之metaclass详情

    2022-09-16 00:38:56
  • 深刻理解Oracle数据库的启动和关闭

    2010-07-26 13:08:00
  • 出现“不能执行已释放的Script代码”错误的原因及解决办法

    2024-04-19 10:02:13
  • Python编程把二叉树打印成多行代码

    2023-06-24 15:12:57
  • 对python中return与yield的区别详解

    2022-10-19 00:47:33
  • Python常用字符串替换函数strip、replace及sub用法示例

    2022-04-07 18:21:17
  • Oracle 查询表信息获取表字段及字段注释

    2024-01-14 14:46:36
  • Python2与Python3的区别实例分析

    2021-01-07 11:47:17
  • python list删除元素时要注意的坑点分享

    2021-07-15 16:02:22
  • Python实现常见的4种坐标互相转换

    2023-11-21 06:22:38
  • LINUX下Oracle数据库用户创建方法详解

    2023-07-22 02:02:20
  • mysql5.7版本root密码登录问题的解决方法

    2024-01-21 00:47:43
  • Python进阶篇之正则表达式常用语法总结

    2022-03-27 08:45:18
  • Google中国新首页风格再度变脸

    2008-10-27 13:37:00
  • MySQL之批量插入的4种方案总结

    2024-01-19 16:13:11
  • 详解从Django Allauth中进行登录改造小结

    2021-05-05 14:26:58
  • asp之家 网络编程 m.aspxhome.com