我尝试对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
文件不包含任何数据:
如果我在my_log.log
的行中发表评论,我会得到带有编号后缀的预期logging.basicConfig(filename="example.log", level=logging.DEBUG)
个文件。但是,还有my_log.log
这是一个(相对)大文件:
如何设置日志记录,使其仅生成example.log
个文件,而不是大型my_log.log
文件?
答案 0 :(得分:16)
Python提供5个开箱即用的日志记录级别(按严重程度递增顺序):DEBUG
,INFO
,WARNING
,ERROR
和CRITICAL
。默认值为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)
我发现要获得所需的行为,必须在basicConfig
和RotatingFileHandler
初始化中使用相同的名称:
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
。这导致仅创建“大小限制”日志:
答案 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)
答案 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')