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

65
我正在使用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中强制实施文件大小限制?


1
RotatingFileHandler是一个不错的选择。它具体哪里出了问题? - J0HN
可能是因为应用程序没有持续运行,或者代码有误。 - imp
那并没有回答我的问题 :) 我不是在让你猜测为什么会这样,而是RotatingFileHandler到底有什么问题。是否出现错误、异常、崩溃等情况?它是否根本没有写入日志? - J0HN
@imp 不管被中断多少次都没关系。请参阅getLogger。它将始终返回对同一记录器的引用。 - Shadow9043
3个回答

106

使用RotatingFileHandler替换basicConfig()

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")

2
只需在当前的py文件中工作,如何使其在其他py文件中工作。 - geosmart
在任何Python文件中,@geosmart logging.getLogger('root').info('some log') 都应该可以工作。 - Alex
1
对于Python 3,请不要忘记将延迟标志从0更新为False。它可能看起来像一个整数,但实际上是一个布尔参数。 - Vishal Rangras

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>]

16

要使用BasicConfig和RotatingFileHandler,请将RotatingFileHandler添加为BasicConfig中的处理程序。

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。


我没有发生任何写入foo.log的情况。 - Nazar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接