如何限制Python中的日志文件大小

66 投票
3 回答
81382 浏览
提问于 2025-04-18 11:41

我正在使用Windows 7和Python 2.7。

我想把我的日志文件大小限制在5MB。

我的应用程序在启动时会写入日志文件,然后就结束了。

当我的应用程序再次启动时,它会继续写入同一个日志文件。所以这个应用程序并不是一直在运行。

应用程序启动、处理完事情后就结束了。

这是我用来记录日志的代码:

import logging
import logging.handlers
logging.basicConfig(filename=logfile.log, level="info", format='%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')
logging.info("*************************************************")

我试过用RotatingFileHandler,但没有成功。

logging.handlers.RotatingFileHandler(logFile, mode='a', maxBytes=5*1024*1024, backupCount=2, encoding=None, delay=0)

那么,我该如何在Python中强制限制文件大小呢?

3 个回答

17

要使用BasicConfig和RotatingFileHandler,首先需要在BasicConfig中把RotatingFileHandler添加为处理器。

main.py:

import logging

rfh = logging.handlers.RotatingFileHandler(
    filename='foo.log', 
    mode='a',
    maxBytes=5*1024*1024,
    backupCount=2,
    encoding=None,
    delay=0
)

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s %(name)-25s %(levelname)-8s %(message)s",
    datefmt="%y-%m-%d %H:%M:%S",
    handlers=[
        rfh
    ]
)

logger = logging.getLogger('main')

logger.debug("test")

other.py

import logging

class Other():
    def __init(self):
        self.logger = logging.getLogger('other')
        self.logger.info("test2")

内容"test"会带着标签'main'写入foo.log文件。

内容"test2"会带着标签'other'写入foo.log文件。

19

当你使用 logging.basicConfig 来设置日志文件时,系统会创建一个文件处理器,负责把日志写入这个文件。

之后,你又用 logging.handlers.RotatingFileHandler 创建了另一个处理器,指向同一个文件。

现在,当需要进行文件轮换时,RotatingFileHandler 会尝试删除旧的日志文件,但它无法做到,因为还有一个文件处理器在打开这个文件。

如果你直接查看日志文件的处理器,就能看到这一点。

import logging
from logging.handlers import RotatingFileHandler

log_name = 'c:\\log.log'
logging.basicConfig(filename=log_name)
log = logging.getLogger()
handler = RotatingFileHandler(log_name, maxBytes=1024, backupCount=1)
log.addHandler(handler)


[<logging.FileHandler object at 0x02AB9B50>, <logging.handlers.RotatingFileHandler object at 0x02AC1D90>]
107

去掉 basicConfig(),改用 RotatingFileHandler

import logging
from logging.handlers import RotatingFileHandler

log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')

logFile = 'C:\\Temp\\log'

my_handler = RotatingFileHandler(logFile, mode='a', maxBytes=5*1024*1024, 
                                 backupCount=2, encoding=None, delay=0)
my_handler.setFormatter(log_formatter)
my_handler.setLevel(logging.INFO)

app_log = logging.getLogger('root')
app_log.setLevel(logging.INFO)

app_log.addHandler(my_handler)

while True:
    app_log.info("data")

撰写回答