如何使用Python的RotatingFileHandler

Kur*_*eek 23 python logging

我正在尝试对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!")
Run Code Online (Sandbox Code Playgroud)

但是,在logging.basicConfig注释掉行的情况下,生成的my_log.log文件不包含任何数据:

在此输入图像描述

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

在此输入图像描述

如何设置日志记录以便它只生成my_log.log文件,而不是大example.log文件?

sko*_*kin 25

Python提供5个日志级别开箱(严重程度的增加顺序): ,DEBUG,,INFO 和.默认的.文档说,那WARNINGERRORCRITICALWARNING

记录不如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!')
Run Code Online (Sandbox Code Playgroud)

如果你想改变记录器级别,你可以使用.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!')
Run Code Online (Sandbox Code Playgroud)

  • 起初我不清楚这如何回答问题,但关键点是日志消息不高于记录器设置的级别(在“debug()”、“info()”、“warning( )`、`error()`、`exception()`、`ritical()` 层次结构)不会被记录(在本例中,写入输出文件)。 (3认同)

gre*_*pit 17

所有以前的答案都是正确的,这里是另一种做同样事情的方式,除了我们使用日志配置文件。

日志配置文件

这是配置文件:

[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
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

结果

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

在此处输入图片说明

  • 10 是大小(以字节为单位),100 是备份数量 args=('testing.log','a',10,100) (3认同)

Kur*_*eek 7

我发现要获得所需的行为,必须在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!")
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明


Tho*_*rke 6

根据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')
Run Code Online (Sandbox Code Playgroud)

  • [FileHandler](https://docs.python.org/3/library/logging.handlers.html#filehandler) 将日志记录输出发送到 **a** 磁盘文件。[RotatingFileHandler](https://docs.python.org/3/library/logging.handlers.html#rotatingfilehandler) 支持将日志记录发送到磁盘日志文件的**轮换**。 (2认同)