限制Python日志文件

Ber*_*ter 3 logging python-3.x

我正在使用Python3(Ubuntu 14.04)写出日志文件.我想限制日志文件的大小,所以选择RotatingFileHandler.另外,我不想旋转日志文件(.log变成.log.1等等) - 我只想限制日志文件的大小.

我尝试过这样使用RotatingFileHandler:

filehandler = logging.handlers.RotatingFileHandler( "app.log", "a", 1000, 0, None, True )
logging.basicConfig( format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s", level = logging.DEBUG, handlers = [ filehandler ] )
Run Code Online (Sandbox Code Playgroud)

我发现的是日志文件继续增长,永远不会被截断或"包裹"在极限.

backupCount = 0原本以为设置会导致在写入之前检查日志文件大小,如果有空间可以写入日志消息,则写入它,否则清空文件并写出消息.

有任何想法吗?

提前致谢,

Bernmeister.

log*_*ogc 5

如果您查看RotatingFileHandler源代码,您将看到backupCount0只关闭然后重新打开日志的流.这是一个修改版本,可以执行您想要的操作,丢弃旧文件:

import os
import logging
import logging.handlers


class TruncatedFileHandler(logging.handlers.RotatingFileHandler):
    def __init__(self, filename, mode='a', maxBytes=0, encoding=None, delay=0):
        super(TruncatedFileHandler, self).__init__(
            filename, mode, maxBytes, 0, encoding, delay)

    def doRollover(self):
        """Truncate the file"""
        if self.stream:
            self.stream.close()
        dfn = self.baseFilename + ".1"
        if os.path.exists(dfn):
            os.remove(dfn)
        os.rename(self.baseFilename, dfn)
        os.remove(dfn)
        self.mode = 'w'
        self.stream = self._open()
Run Code Online (Sandbox Code Playgroud)

以下是如何使用它:

filehandler = TruncatedFileHandler("app.log", "w", 1000)
logging.basicConfig(
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    level=logging.DEBUG, handlers=[filehandler])

logger = logging.getLogger('spam_application')

for i in range(100):
    logger.debug("a log line, number: %s", i)
Run Code Online (Sandbox Code Playgroud)

并证明它有效

??? python3.4 main.py
??? cat app.log*
2014-06-11 11:50:44,871 - spam_application - DEBUG - a log line, number: 91
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 92
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 93
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 94
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 95
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 96
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 97
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 98
2014-06-11 11:50:44,872 - spam_application - DEBUG - a log line, number: 99
Run Code Online (Sandbox Code Playgroud)