【问题标题】:multiple handlers to same log file in python loggingpython日志记录中同一日志文件的多个处理程序
【发布时间】:2020-03-27 22:05:53
【问题描述】:

在 python 日志配置中是否可以有多个日志处理程序引用同一个日志文件。我可以通过将一个处理程序 handler_two 添加到 handlers 对象来使其工作,但这似乎是一个样板。

"handler_two": {
      "level": "DEBUG",
      "class": "logging.handlers.TimedRotatingFileHandler",
      "formatter": "verbose",
      "filename": "{}/abc.log".format(log_folder),
      "when": "midnight",
      "backupCount": 10,
      "encoding": "utf8"
    },

logging.conf -

  "version": 1,
  "disable_existing_loggers": False,
  "formatters": {
    "verbose": {
      "format": "%(asctime)s  %(name)s  %(levelname)s  (PID: %(process)d) %(message)s",
      "datefmt": "%d/%m/%Y %I:%M:%S %p %Z"
    },
    "simple": {
      "format": "%(asctime)s  %(name)s %(levelname)s >  %(message)s"
    }
  },
  "handlers": {
    "handler_one": {
      "level": "DEBUG",
      "class": "logging.handlers.TimedRotatingFileHandler",
      "formatter": "verbose",
      "filename": "{}/abc.log".format(log_folder),
      "when": "midnight",
      "backupCount": 10,
      "encoding": "utf8"
    },
    "error": {
      "level": "ERROR",
      "class": "logging.handlers.TimedRotatingFileHandler",
      "formatter": "verbose",
      "filename": "{}/error.log".format(log_folder),
      "when": "midnight",
      "backupCount": 10,
      "encoding": "utf8"
    }
  },
  "root": {
    "level": "ERROR",
    "handlers": [
      "error"
    ]
  },
  "loggers": {
    "handler_one": {
      "level": "DEBUG",
      "handlers": [
        "handler_one"
      ],
      "propagate": "false"
    },
  }
}

【问题讨论】:

  • 现在您有 2 个处理程序来处理 2 个不同的日志文件。你想达到什么目的?
  • @AdrianKrupa 我想要多个处理程序写入同一个文件。忽略错误处理程序。正如我所提到的,我可以通过复制handler_one 并将名称更改为handler_two 来实现这一点。但是会有很多模块,我们希望将每个模块记录到一个文件中,但同时我们需要一个标识符来区分。 __ 名称 __ 作为记录器名称我不能使用,因为它不符合公司的编码准则。

标签: python python-logging


【解决方案1】:

可以通过自己打开文件流并将其传递给流处理程序来实现,如下所示:

import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

stream = open("test.log", "a")

handler_1 = logging.StreamHandler(stream)
logger.addHandler(handler_1)
handler_2 = logging.StreamHandler(stream)
logger.addHandler(handler_2)

logger.info("test log")

test.log 文件将包含内容:

test log
test log

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多