python - 记录 dictConfig 不适用于多处理

标签 python python-2.7 logging

我的问题是: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. 解决方案是什么?

感谢您的帮助。

最佳答案

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

关于python - 记录 dictConfig 不适用于多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44525432/

相关文章:

python - 每个第三方库的 ImportError

python - 如何处理游戏示例中的深度递归调用

Python 相当于 MATLAB 的数据集数组

python - 如何使用列表理解生成不同 lambda 函数的列表?

logging - 是否有一种工具可以轻松地以聚合方式从 AWS Elastic Beanstalk 搜索 S3 中每小时轮换的日志?

c# - 如何获取最后插入的记录

python - Discord.py Bot 每天特定时间运行功能

python - 在 Linux 服务器上使用 get-pip.py --user 安装 pip 在哪里

python - 带有 except block 的变量范围 : Difference between Python 2 and 3

bash - 在 bash 命令输出中添加前缀