[英]Logging dictConfig does not work with multiprocessing
我的问题是: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文件中,您将只看到来自主程序的日志行,而不是来自进程的日志行。
现在我的问题:
谢谢您的帮助。
您不应该期望从多个进程写入单个文件才能工作(它可能在某些情况下有效,但无法保证)。 正确的方法是使用多处理Queue
并让所有文件写入由单个进程完成,如2010年的博客文章中所述(这里很长时间没有重现)。 重要的是每个进程在创建后配置日志。 如果需要,您可以调整链接的示例以使用dictConfig
而不是示例中显示的编程配置。
问题是__name__
会评估'__main__'
; 你需要
"Main"
重命名为"__main__"
(对于记录器的名称) logger = logging.getLogger('Main')
您没有配置logging.getLogger(__name__)
获取的记录器。
在logging.DictConfig中,根记录器由“”定义。 因此,在你的词典中,你应该使用:
"":
{
"level": "DEBUG",
"handlers": ["file"]
}
正确设置根记录器(在.ini文件中,你使用“root”,不要问我为什么)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.