python 日志处理 logging模块 日志切分

本文介绍了Python日志模块logging中如何进行日志切分,包括基于时间与文件大小的切分策略,以及日志回滚机制。通过使用RotatingFileHandler和TimedRotatingFileHandler,可以有效地管理和控制日志文件的大小和数量,确保日志系统高效运行。
摘要由CSDN通过智能技术生成

为什么要切分日志?

将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能。因此,有必要对日志文件按某种条件进行切分。切分日志使得日志更加可读且便于处理。

日志切割方法:

当一个日志文件达到触发条件后,对日志文件进行重命名,之后再新建原来名称的日志文件(此时就是空文件了),新产生的日志就写入新的日志文件。

分割日志的触发条件:

大小、日期,或者大小加上日期。

日志回滚:

当分割的日志文件达到指定数目的上限个数时,最老的日志文件就会被删除。日志回滚的目的是为了防止程序产生的日志过多过大,在情况允许的条件下只保留最新的一些日志。

logging库提供了2个可以用于日志滚动的class,一个是RotatingFileHandler,它主要是根据日志文件的大小进行滚动;另一个是TimeRotatingFileHandler,它主要是根据时间进行滚动。在实际应用中,通常根据时间进行滚动。 

基于时间切分

使用TimedRotatingFileHandler处理器:

TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

其中参数的含义和取值为:

  • filename 是输出日志文件名的前缀,比如log/myapp.log
  • when 的定义如下:
“S” Seconds
“M” Minutes
“H” Hours
“D” Days
“W” Week day (0=Monday)
“midnight” Roll over at midnight
  • interval:指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以有些情况suffix要定义的不能因为when而重复。
  • backupCount:保留日志个数。默认的0是不会自动删除掉日志。若设3,则在文件的创建过程中库会判断是否有超过这个3,若超过,则会从最先创建的开始删除。

示例:

import time
import logging
import logging.handlers
import os

# 如果日志文件夹不存在,则创建
log_dir = "log-second"  # 日志存放文件夹名称
log_path = os.getcwd() + os.sep + log_dir
if not os.path.isdir(log_path):
    os.makedirs(log_path)

# logging初始化工作
logging.basicConfig()

# 初始化loggger
test = logging.getLogger('test')
test.setLevel(logging.INFO)

# 添加TimedRotatingFileHandler
# 定义一个1秒换一次log文件的handler
# 保留3个旧log文件
timefilehandler = logging.handlers.TimedRotatingFileHandler(
    log_dir + os.sep + "log",
    when='S',
    interval=1,
    backupCount=3
)

# 设置后缀名称,跟strftime的格式一样
timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"

formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
timefilehandler.setFormatter(formatter)
test.addHandler(timefilehandler)

n = 6
while n > 0:
    test.info("这是一个时间分割的测试程序")
    time.sleep(1)
    n -= 1

注意:timefilehandler.suffix的设置一定要和时间单位相符,不如按秒切分,就必须设置timefilehandler.suffix= "%Y-%m-%d_%H-%M-%S.log",否则就不能删除旧文件了。按天、按分钟切分也是如此。

基于文件大小切分

使用RotatingFileHandler处理器:

import time
# import logging
import os
import logging.handlers

# 如果日志文件夹不存在,则创建
log_dir = "log-size"  # 日志存放文件夹名称
log_path = os.getcwd() + os.sep + log_dir
if not os.path.isdir(log_path):
    os.makedirs(log_path)

# logging初始化工作
logging.basicConfig()

# 初始化loggger
test_02 = logging.getLogger('test_02')
test_02.setLevel(logging.INFO)

# 写入文件,如果单个文件超过100个Bytes,则写入下一个文件,最多保留5个文件
handler = logging.handlers.RotatingFileHandler(
    'log-size/test_02.log', maxBytes=100, backupCount=5)

formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
# 设置后缀名称,跟strftime的格式一样
test_02.addHandler(handler)

n = 6
while n > 0:
    test_02.info("这是一个大小分割的测试程序")
    time.sleep(1)
    n -= 1

注意:实际分割出的文件大小和设置可能存在一定误差,因为日志要保持单位完整性,无法按照满字节数写入!

参考:

https://www.cnblogs.com/ailiailan/p/11850731.html
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值