如何使用Python的RotatingFileHandler

时间:2016-10-17 14:02:31

标签: python logging

我尝试对IndexOutOfBoundsException模块logging进行如下测试:

RotatingFileHandler

但是,在import logging from logging.handlers import RotatingFileHandler # logging.basicConfig(filename="example.log", level=logging.DEBUG) logger = logging.getLogger('my_logger') handler = RotatingFileHandler("my_log.log", maxBytes=2000, backupCount=10) logger.addHandler(handler) for _ in range(10000): logger.debug("Hello, world!") 行被注释掉后,生成的logging.basicConfig文件不包含任何数据:

enter image description here

如果我在my_log.log的行中发表评论,我会得到带有编号后缀的预期logging.basicConfig(filename="example.log", level=logging.DEBUG)个文件。但是,还有my_log.log这是一个(相对)大文件:

enter image description here

如何设置日志记录,使其仅生成example.log个文件,而不是大型my_log.log文件?

4 个答案:

答案 0 :(得分:16)

Python提供5个开箱即用的日志记录级别(按严重程度递增顺序):DEBUGINFOWARNINGERRORCRITICAL。默认值为is WARNING。文档说,

  

将忽略不如 lvl 严重的记录消息。

因此,如果您使用默认设置.debug,则日志中不会显示任何内容。

最简单的解决方法是使用logger.warning函数而不是logger.debug

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('my_logger')
handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10)
logger.addHandler(handler)

for _ in range(10000):
    logger.warning('Hello, world!')

如果您想更改记录器级别,可以使用.setLevel方法:

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
handler = RotatingFileHandler('my_log.log', maxBytes=2000, backupCount=10)
logger.addHandler(handler)

for _ in range(10000):
    logger.debug('Hello, world!')

答案 1 :(得分:2)

我发现要获得所需的行为,必须在basicConfigRotatingFileHandler初始化中使用相同的名称:

import logging
from logging.handlers import RotatingFileHandler

logging.basicConfig(filename="my_log.log", level=logging.DEBUG)

logger = logging.getLogger('my_logger')
handler = RotatingFileHandler("my_log.log", maxBytes=2000, backupCount=10)
logger.addHandler(handler)

for _ in range(10000):
    logger.debug("Hello, world!")

在这里,我选择了相同的名字my_log.log。这导致仅创建“大小限制”日志:

enter image description here

答案 2 :(得分:1)

所有先前的答案都是正确的,这是另一种做相同事情的方法,除了我们改用日志记录配置文件。

logging_config.ini

这是配置文件:

[loggers]
keys=root

[handlers]
keys=logfile

[formatters]
keys=logfileformatter

[logger_root]
level=DEBUG
handlers=logfile

[formatter_logfileformatter]
format=%(asctime)s %(name)-12s: %(levelname)s %(message)s

[handler_logfile]
class=handlers.RotatingFileHandler
level=DEBUG
args=('testing.log','a',10,100)
formatter=logfileformatter

myScrypt.py

这是使用上述配置文件的简单日志记录脚本

import logging
from logging.config import fileConfig

fileConfig('logging_config.ini')
logger = logging.getLogger()
logger.debug('the best scripting language is python in the world')

结果

这是结果,请注意maxBytes设置为10,但在现实生活中,显然太小了。  (args =('testing.log','a',10,100)

enter image description here

答案 3 :(得分:0)

根据Kurt Peek的回答,您还可以将旋转文件处理程序直接放在logging.basicConfig中

import logging
from logging.handlers import RotatingFileHandler
logging.basicConfig(
        handlers=[RotatingFileHandler('./my_log.log', maxBytes=100000, backupCount=10)],
        level=logging.DEBUG,
        format="[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
        datefmt='%Y-%m-%dT%H:%M:%S')