【问题标题】:Logging dictConfig does not work with multiprocessing记录 dictConfig 不适用于多处理
【发布时间】:2017-06-13 15:13:10
【问题描述】:

我的问题是:Python 日志配置无法使用配置文件和多处理。

我正在使用python2.7。

示例

这是我的example.py

import json
import logging
import logging.config
import multiprocessing


def get_logger():
    with open("logging.conf") as fd:
        config_json_obj = json.load(fd)
    #logging.config.dictConfig(config_json_obj)
    logging.basicConfig(filename="my.log", level=logging.INFO)
    logger = logging.getLogger(__name__)
    return logger

def funSquare(num):
    logger = get_logger()
    # write logging info from process
    logger.info(num ** 2)
    return num ** 2


if __name__ == '__main__':
    logger = get_logger()

    logger.info("Start program")
    pool = multiprocessing.Pool()
    results = pool.map(funSquare, range(10))
    print(results)

这里是我的 logging.conf 文件:

{
  "version": 1,
  "formatters":
  {
    "simple":
    {
      "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    },
    "verbose":
    {
      "format": "%(asctime)s %(thread)s %(levelname)s %(module)s [-] %(message)s"
    }
  },
  "handlers":
  {
    "console":
    {
      "class": "logging.StreamHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "stream": "ext://sys.stdout"
    },
    "file":
    {
      "class": "logging.FileHandler",
      "formatter": "verbose",
      "level": "DEBUG",
      "filename": "mylog.log"
    }
  },
  "loggers":
  {
    "Main":
    {
      "level": "INFO",
      "handlers": ["console", "file"],
      "propagate": 0
    }
  },
  "root":
  {
    "level": "DEBUG",
    "handlers": ["file"]
  }
}

此时,example.py 正在运行。您将获得来自主程序和新进程的 my.log 文件日志记录行。

重现我的问题

现在,如果我替换行:

#logging.config.dictConfig(config_json_obj)
logging.basicConfig(filename="my.log", level=logging.INFO)

logging.config.dictConfig(config_json_obj)
#logging.basicConfig(filename="my.log", level=logging.INFO)

在 my.log 文件中,您只会看到来自主程序的日志记录行,而不是来自进程的记录行。

现在我的问题:

  1. 为什么会这样?
  2. 解决办法是什么?

感谢您的帮助。

【问题讨论】:

    标签: python python-2.7 logging


    【解决方案1】:

    您不应该期望从多个进程写入单个文件可以工作(在某些情况下它可能会工作,但不能保证)。正确的方法是使用多处理 Queue 并通过单个进程完成所有文件写入,如 2010 年的 this blog post 中所述(此处复制时间太长)。重要的是每个进程在创建之后配置日志记录。如果需要,您可以调整链接示例以使用 dictConfig 而不是示例中显示的编程配置。

    【讨论】:

      【解决方案2】:

      问题是__name__ 将评估'__main__';你需要

      • 或者:将配置文件中的 "Main" 重命名为 "__main__"(作为记录器的名称)
      • 或(可能更强大):logger = logging.getLogger('Main') 在您的主文件中

      您使用logging.getLogger(__name__) 获得的记录器未配置其他方式。

      【讨论】:

      • hiro,谢谢,您的解决方案对我有用。但是,您如何看待@Vinay 的评论?
      • 我完全同意他的评论。您将遇到可能导致问题的竞争条件...Queue 是一个很好的解决方案!可能还有其他人。这可能对docs.python.org/3/howto/… 有帮助(看看作者是谁...)
      【解决方案3】:

      在 logging.DictConfig 中,根记录器由“”定义。因此,在您的字典中,您应该使用:

      "":
      {
        "level": "DEBUG",
        "handlers": ["file"]
      }
      

      正确设置根记录器(在 .ini 文件中,您使用“root”,不要问我为什么)

      【讨论】:

        猜你喜欢
        • 2018-12-05
        • 1970-01-01
        • 2013-12-14
        • 2021-09-13
        • 2020-05-22
        • 1970-01-01
        • 2011-10-20
        • 2014-10-28
        • 1970-01-01
        相关资源
        最近更新 更多