【问题标题】:Python Logging - Configuring Rotating File Handler From Config filePython 日志记录 - 从配置文件配置旋转文件处理程序
【发布时间】:2020-10-09 11:43:12
【问题描述】:

我有以下配置文件,用于在我的 python 模块中配置日志记录,问题是它没有将时间戳附加到文件名,现在创建的日志文件是 file_handler.log 但是我希望它是 file_handler-timestamp.log

{
"version": 1,
"disable_existing_loggers": true,
"formatters": {
  "simple": {
    "format": "%(asctime)s %(levelname)s %(filename)s %(lineno)s %(message)s",
    "datefmt": "%Y-%m-%d %H:%M:%S"
  }
},
"handlers": {
  "file_handler": {
    "level": "INFO",
    "class": "logging.handlers.TimedRotatingFileHandler",
    "formatter": "simple",
    "filename": "error.log",
    "backupCount": 10,
    "interval" : 1,
    "when": "s",
    "encoding": "utf8"
  }
},
"loggers": { },
"root": {
  "handlers": [
    "file_handler"
  ],
  "level": "DEBUG"
}
}

无需配置的工作代码

import logging
import time
from logging.handlers import RotatingFileHandler
    
logger = logging.getLogger('log_1')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', '%Y-%m-%d %H:%M:%S')
handler = RotatingFileHandler('log' + time.strftime('_%Y%m%d-%H%M') + '.log', maxBytes=2000, backupCount=10)
handler.setFormatter(formatter)
logger.addHandler(handler)

在程序启动时动态更新配置的解决方法

import logging.config
import json
import time

fp = open("sample_config.json")
config = json.load(fp)
fp.close()
config['handlers']['file_handler']['filename'] += time.strftime('_%Y%m%d-%H%M') + '.log'
logging.config.dictConfig(config)

【问题讨论】:

    标签: python-3.x python-logging


    【解决方案1】:

    timestamp 什么时候?文件何时旋转或创建时?

    如果您使用TimedRotatingFileHandler,那么当文件旋转时,时间戳会附加到文件名中。

    如果您希望将时间戳附加到日志文件名,您必须继承RotatingFileHandler 并修改__init__ 方法。然后将配置文件“file_handler”的"class"项指向你的新类。

    这很容易做到,但可能不是您需要的。 只需将时间戳附加到旋转的日志文件名,或者如果您也需要限制大小,请阅读此answer

    【讨论】:

    • 我希望每次运行模块时都会生成一个新的日志文件,并且时间戳应该附加到日志文件中
    • @SL' 那么,继承 RotatingFileHandler 是一种方法
    • @dragon2flye - 我可以使用更新的配置来旋转文件,现在在我原来的问题中编辑,我基本上添加了 - “interval”:1,“when”:“s”但是对于相同的启动 python 模块运行,这会在每秒后产生多个文件,我只想为每个模块运行生成一个文件并附加时间戳。所以基本上每次运行都会生成附加时间戳的日志文件,我可以通过将“工作代码”添加到我的原始问题中来获得它,但需要通过配置来做到这一点。
    • @dragon2flye - 我认为如果有办法在配置中动态传递文件名,这可以解决 - 'log' + time.strftime('_%Y%m%d- %H%M') 但不确定是否可以从配置中完成
    • @Infinite 您在配置文件中使用TimedRotatingFileHandler,但在“工作代码”中使用RotatingFileHandler。您的配置文件说它将每 1 秒旋转一次,因此会创建多个文件。只需将其改回RotatingFileHandler 并删除intervalwhen 参数即可。
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2015-05-27
    • 2018-10-12
    • 2015-11-15
    • 2014-06-11
    • 2012-12-27
    • 1970-01-01
    • 2010-09-30
    相关资源
    最近更新 更多