Python Log文件大小设置及备份的方法
作者:xyztank 发布时间:2022-08-02 13:46:14
标签:Python,Log,文件备份
一、配置文件大小及数量
日志文件代码需要引入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...,如图所示:
RotatingFileHandler方法源码,如下所示:
二、日志代码
#!/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


猜你喜欢
- 概述已经Swoole系列的第二篇知识点了,前一篇主要的针对处理的是方案设计,这一篇主要是代码实现的内容,主要介绍高性能的原因已经实现,编程框
- 昨天对其配置了一天,其配置为Jena 2.4.0,MySQL数据库版本为5.1.42-community,JDK版本为1.6.0,MySQL
- 在python中,命令行解析的很好用,首先导入命令行解析模块import argparseimport sys然后创建对象parse=arg
- 分享一个新增备案不关站的代码,这里只是转帖,没有亲自实验,如有问题请及时反馈。其实就是利用API接口的IP查询地址来限制首页不被所在省的IP
- cv2库在opencv库内,因此需要下载opencv-python1、打开windows命令行:win+Rcmd2、更新pip版本(不一定要
- pandas返回缺失值位置有的时候我们可能需要获取一些缺失值的信息,因此我们需要获取这些缺失值在DataFrame中的位置。假如我们的Dat
- NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供
- 前言最近不小心把硬盘给格式化了,由于当时的文件没有备份,所以一下所有的文件都没有了,于是只能采取补救措施,用文件恢复软件恢复了一部分的数据出
- chomp是用来删除换行符.#!/usr/bin/perl $c="abcde"; chomp($c); print &
- 项目需要就在现有的服务器上面重新安装了个mysql服务器,还挺费劲儿呢,因为之前都是在我的笔记本上面试验的,它的系统是Ubuntu的,什么路
- 前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24。Q:全文索引适用于什么场合?A:全文索引是目前实现大数据搜索的关键技术
- vue-element-admin导入组件封装模板和样式首先封装一个类似的组件,首先需要注意的是,类似功能,vue-element-admi
- 本文实例讲述了symfony2.4的twig中date用法。分享给大家供大家参考,具体如下:获得当前时间:{{ "now"
- 数独规则数独游戏,经典的为9×9=81个单元格组成的九宫格,同时也形成了3×3=9个小九宫格,要求在81个小单元格中填入数字1~9,并且数字
- infer 这个关键字,整理记录一下,避免后面忘记了。有点难以理解呢。inferinfer 是在 typescript 2.8中新增的关键字
- 问题一开始安装的Autoprefixer是最新版本的3.0.1,一波操作后发现无效想是不是因为没设置browsers?那就设置一下吧&quo
- 前言: 经过前面文章学习,我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、
- 介绍Matplotlib是Python中使用最广泛的数据可视化库之一。无论是简单还是复杂的可视化项目,它都是大多数人的首选库。在本教程中,我
- 目录前言第一步:首先安装相关的依赖包第二步:在django项目配置文件settings.py中注册应用第三步:在django项目配置文件se
- 1.介绍 在计算机科学中,数据可以用很多不同的方式表示,自然而然地,每一种方式在某些领域都有其优点和