Python 日志记录 - 将日期设置为文件名

新手上路,请多包涵

我正致力于在我的 Python 项目中实现日志记录,但遇到了一些障碍。我正在尝试设置我的日志记录,以便将处理程序和格式化程序全部组织到一个配置文件中。我现在想做的是设置我的 fileHandler 这样它将创建一个看起来像这样的日志文件: YYYY_MM_DD.log 显然 Y 代表年份, M代表月份,D代表日期。

这是我尝试使用我的配置文件所做的:

 [loggers]
keys=root,MainLogger

[handlers]
keys=fileHandler, consoleHandler

[formatters]
keys=logFormatter, consoleFormatter

[logger_root]
level=DEBUG
handlers=fileHandler

[logger_MainLogger]
level=DEBUG
handlers=fileHandler, consoleHandler
qualname=MainLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=logFormatter
args=(datetime.now().strftime('%Y_%m_%d.log'), 'a')

[formatter_logFormatter]
format=%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s

[formatter_consoleFormatter]
format=%(asctime)s | %(levelname)-8s | %(fillname)s-%(funcName)s-%(lineno)04d | %message)s

我用来测试配置的文件非常简单:

 import logging
import logging.config

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('MainLogger')
logger.debug("TEST")

我现在遇到的具体错误是:

 configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%Y_%m_%d.log'), 'a')"

我试过更改 %Y%m%d 如错误所述,但这并不能解决问题。我如何着手设置配置文件,以便我的日志文件看起来像我想要的那样?

我应该注意,当我将文件名更改为 test.log 一切正常时,所以这是我似乎遇到的唯一错误。

原文由 Skitzafreak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 955
2 个回答

您不能在配置文件中使用 datetime ,因为它不知道它的含义。但是,您可以在 python 文件本身中添加 Filehandler

 import logging.config
from datetime import datetime

logging.config.fileConfig('aaa.conf')
logger = logging.getLogger('MainLogger')

fh = logging.FileHandler('{:%Y-%m-%d}.log'.format(datetime.now()))
formatter = logging.Formatter('%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s')
fh.setFormatter(formatter)

logger.addHandler(fh)
logger.debug("TEST")

这样您就可以在处理程序中将日期设置为文件名。

This is the config file, note that you had a typo in the last formatter, you put fillname instead of filename and you forgot ( in message

 [loggers]
keys=root,MainLogger

[handlers]
keys=consoleHandler

[formatters]
keys=consoleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_MainLogger]
level=DEBUG
handlers=consoleHandler
qualname=MainLogger
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)

[formatter_consoleFormatter]
format=%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%(lineno)04d | %(message)s

这应该工作得很好。

原文由 Dror Av. 发布,翻译遵循 CC BY-SA 3.0 许可协议

也许您可以改用 Python 的 TimedRotatingFileHandler 。您可以设置时间间隔,每天创建一个以日期为后缀的新日志文件。

文档–

  • Python 2: https ://docs.python.org/2/library/logging.handlers.html#timedrotatingfilehandler
  • Python 3: https ://docs.python.org/3/library/logging.handlers.html#timedrotatingfilehandler

请注意,当天的日志文件没有日期。此文件处理程序仅在新的一天开始时添加日期后缀。

此外,它使用的后缀是“%Y-%m-%d”,这与您想要的略有不同。但是 这里 有一个关于如何改变它的问题。

原文由 nofinator 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题