如何使用 Python 的 RotatingFileHandler
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/40088496/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use Python's RotatingFileHandler
提问by Kurt Peek
I'm trying to do a test run of the logging
module's RotatingFileHandler
as follows:
我正在尝试对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!")
However, with logging.basicConfig
line commented out, the resulting my_log.log
file contains no data:
但是,logging.basicConfig
注释掉行后,生成的my_log.log
文件不包含任何数据:
If I comment in the line with logging.basicConfig(filename="example.log", level=logging.DEBUG)
, I get the expected my_log.log
files with numbered suffixes. However, there is also the example.log
which is a (relatively) large file:
如果我在行中添加注释logging.basicConfig(filename="example.log", level=logging.DEBUG)
,我会得到my_log.log
带有编号后缀的预期文件。但是,还有example.log
一个(相对)大的文件:
How can I set up the logging so that it only generates the my_log.log
files, and not the large example.log
file?
如何设置日志记录,使其只生成my_log.log
文件,而不生成大example.log
文件?
采纳答案by skovorodkin
Python provides 5 logging levels out of the box (in increasing order of severity): DEBUG
, INFO
, WARNING
, ERROR
and CRITICAL
. The default one is WARNING
. The docs says, that
Python提供5个日志级别开箱(严重程度的增加顺序): ,DEBUG
,,和。默认为. 文档说,那INFO
WARNING
ERROR
CRITICAL
WARNING
Logging messages which are less severe than lvlwill be ignored.
比lvl严重的日志消息将被忽略。
So if you use .debug
with the default settings, you won't see anything in your logs.
因此,如果您使用.debug
默认设置,您将不会在日志中看到任何内容。
The easiest fix would be to use logger.warning
function rather that logger.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!')
And if you want to change logger level you can use .setLevel
method:
如果你想改变记录器级别,你可以使用.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!')
回答by Thomas Burke
Going off of Kurt Peek's answer you can also put the rotating file handler in the logging.basicConfig directly
从 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')
回答by grepit
All previous answers are correct, here another way of doing the same thing except we use logging config file instead.
所有以前的答案都是正确的,这里是另一种做同样事情的方式,除了我们使用日志配置文件。
logging_config.ini
日志配置文件
Here is the config file :
这是配置文件:
[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
myScrypt.py
here is simple logging script that uses the above config file
这是使用上述配置文件的简单日志记录脚本
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')
RESULT
结果
here is the result, notice maxBytes is set to 10 but in real life, that's clearly too small. (args=('testing.log','a',10,100)
这是结果,注意 maxBytes 设置为 10 但在现实生活中,这显然太小了。(args=('testing.log','a',10,100)
回答by Kurt Peek
I found that to obtain the desired behavior one has to use the same name in the basicConfig
and RotatingFileHandler
initializations:
我发现要获得所需的行为,必须在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!")
Here, I have chose the same name my_log.log
. This results in only the 'size-limited' logs being created:
在这里,我选择了相同的名称my_log.log
。这导致仅创建“大小受限”日志: