私の問題は、Pythonのロギング設定が設定ファイルとマルチプロセッシングを使って動作していないことです。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ファイルを取得します。
私はライン交換した場合、今私の問題
を再現: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)
をあなたがいないから、唯一のメインプログラムからのログ行が表示されますプロセス。
今私の質問:
- なぜこれが起こっているのでしょうか?
- 解決策は何ですか。
はあなたの助けをいただき、ありがとうございます。
hiro、ありがとう、あなたのソリューションは私のために働く。しかし、@Vinayからのコメントについてどう思いますか? – Lobo
私は彼のコメントに完全に同意します。プロブレムを引き起こす可能性のある競争条件があります...「キュー」は優れたソリューションです!他にもあるかもしれない。 https://docs.python.org/3/howto/logging-cookbookに役立ちます。html#単一ファイルから複数のプロセスへのロギング(著者が誰であるかを見てください) –