我的问题是:Python日志配置不能使用配置文件和多处理。Logging dictConfig不支持多处理
我正在使用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文件,你会看到只有从主程序从伐木线,不流程。
现在我的问题:
- 为什么发生这种情况?
- 解决方案是什么?
谢谢你的帮助。
hiro,谢谢,你的解决方案适合我。但是,您如何评价@Vinay的评论? – Lobo
我完全同意他的评论。你将会遇到可能导致问题的竞争条件......队列是一个很好的解决方案!可能有其他人。这可能有助于https://docs.python.org/3/howto/logging-cookbook。html#从多个进程中登录到单个文件(查看作者是谁......) –