Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 日志记录dictConfig不适用于多处理_Python_Python 2.7_Logging - Fatal编程技术网

Python 日志记录dictConfig不适用于多处理

Python 日志记录dictConfig不适用于多处理,python,python-2.7,logging,Python,Python 2.7,Logging,我的问题是:Python日志配置无法使用配置文件和多处理 我用的是python2.7 例子 这里是我的示例.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.dic

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

我用的是python2.7

例子 这里是我的示例.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)

在my.log文件中,您将看到仅来自主程序的日志行,而不是来自进程的日志行

现在我的问题是:

  • 为什么会这样
  • 解决办法是什么

  • 谢谢您的帮助。

    问题是
    \uuuuuu name\uuuuuuu
    将评估
    “\uuuuu main”
    ;你需要

    • 或者:将配置文件中的
      “Main”
      重命名为
      “\uuuuu Main\uuuuuuu”
      (用于记录器的名称)
    • 或者(可能更健壮):
      logger=logging.getLogger('Main')
      在主文件中

    使用
    logging获得的记录器。getLogger(\uuuu name\uuuuuu)
    未进行其他配置。

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

    在logging.dictConfig中,根记录器由“”定义。因此,在你的措辞中,你应该使用:

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

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

    hiro,谢谢,您的解决方案适合我。然而,你如何看待@Vinay的评论?我完全同意他的评论。您将面临可能导致问题的竞争条件…队列是一个极好的解决方案!可能还有其他人。这可能会有帮助(看看作者是谁…)
    "":
    {
      "level": "DEBUG",
      "handlers": ["file"]
    }