Python TimedRotatingFileHandler备份计数为0并不是一件容易的事

时间:2015-06-12 11:56:26

标签: python logging

我为记录模块创建了TimedRotatingFileHandler,Flask服务器中的备份计数为0。但是,生成的第一个日志文件包含所有日志记录信息。但其余的日志文件包含所需的日志。

这是我用过的代码:

logging.basicConfig(
    filename='logs/img-search.log',
    level=logging.DEBUG,
    format='%(asctime)s: %(levelname)s: %(message)s',
    datefmt='%m-%d-%Y %I:%M:%S %p'
)

hndlr = logging.handlers.TimedRotatingFileHandler(
    "logs/img-search.log",
    when='M',
    interval=1,
    backupCount=0
)

logging.getLogger(__name__).addHandler(hndlr)

log = logging.getLogger(__name__)

如果我创建自定义处理程序并将TimedRotatingFIleHandler附加到它,则服务器所服务的文件不会添加到日志文件中。而是打印在控制台上。

log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
# add a file handler
fh = logging.handlers.TimedRotatingFileHandler("logs/img-search.log",when='M',interval=1,backupCount=0)
fh.setLevel(logging.DEBUG)
# create a formatter and set the formatter for the handler.
frmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
fh.setFormatter(frmt)
# add the Handler to the logger
log.addHandler(fh)

以下是在控制台上打印代码片段而不是日志文件。

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
192.168.1.6 - - [12/Jun/2015 08:51:33] "GET / HTTP/1.1" 200 -
192.168.1.6 - - [12/Jun/2015 08:56:35] "GET / HTTP/1.1" 200 -
192.168.1.6 - - [12/Jun/2015 08:56:35] "GET /static/js/jquery-1.11.2/jquery-1.11.2.min.js HTTP/1.1" 200 -
192.168.1.6 - - [12/Jun/2015 08:56:35] "GET /static/js/main/main.js HTTP/1.1" 200 -
192.168.1.6 - - [12/Jun/2015 08:56:35] "GET /favicon.ico HTTP/1.1" 404 -
192.168.1.6 - - [12/Jun/2015 08:56:35] "GET /favicon.ico HTTP/1.1" 404 -

1 个答案:

答案 0 :(得分:1)

您设置记录器的方式basicConfig将创建一个FileHandler,将所有日志写入logs/img-search.log,另外您设置TimedRotatingFileHandlers,每个应创建一个文件分钟...

如果您不想要第一个文件,只需从filename中删除basicConfig arg,如下所示:

# configures the root logger:
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s: %(levelname)s: %(message)s',
    datefmt='%m-%d-%Y %I:%M:%S %p'
)

hndlr = logging.handlers.TimedRotatingFileHandler(
    "logs/img-search.log",
    when='M',
    interval=1,
    backupCount=0
)

# makes a new logger named as the current module and adds hndlr to it
log = logging.getLogger(__name__)
log.addHandler(hndlr)

这会将所有日志记录输出写入您的控制台。此外,对于使用log的所有内容(因此记录器具有当前模块的名称),它还会每分钟将其消息写入不同的文件。

如果您不想在控制台上输出,但实际上只是那些定时文件中的输出,则不应再使用basicConfigbasicConfig(正如其名称所示)仅适用于您希望控制台或文件中的所有输出的两个基本标准情况。只要您想要不同的东西,您就应该根据需要设置记录器,例如像这样:

import logging
log = logging.getLogger(__name__)
formatter = logging.Formatter(
    format='%(asctime)s: %(levelname)s: %(message)s',
    datefmt='%m-%d-%Y %I:%M:%S %p'
)
hndlr = logging.handlers.TimedRotatingFileHandler(
    "logs/img-search.log",
    when='M',
    interval=1,
    backupCount=0
)
hndlr.setFormatter(formatter)
log.addHandler(hndlr)
log.setLevel(logging.DEBUG)

关于log = logging.getLogger(__name__)行的更多信息...这将为您提供一个名为当前文件的记录器,该记录器在根记录器下分层次log上的设置将不适用并记录来自其他模块/库的内容,因为它们通常不使用具有模块名称的记录器!如果要全局配置日志记录,则应该配置根记录器而不是log,如下所示:root = logging.getLogger()(然后执行root上面的所有内容而不是log) 。您不需要为log之类的单个文件记录器再次执行此操作。您可以获取log = logging.getLogger(__name__)之类的个人记录器,然后在不先配置的情况下调用log.debug(...)。日志将冒泡到您的根记录器并按预期记录。甚至只使用logging.debug(...)的日志。

正如您所看到的那样,日志记录很快变得复杂,因为它有很多选项。我建议通过logging tutorials来真正了解消息的记录方式以及配置位置。 Flask有它自己的app.logger对象,它似乎正在使用。