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