2017-06-13 4 views
1

私の問題は、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) 

をあなたがいないから、唯一のメインプログラムからのログ行が表示されますプロセス。

今私の質問:

  1. なぜこれが起こっているのでしょうか?
  2. 解決策は何ですか。

はあなたの助けをいただき、ありがとうございます。

答えて

1

問題は__name__'__main__'を評価するということです。あなたのメインファイル

ロガーにlogger = logging.getLogger('Main'):(多分より堅牢)

  • または(ロガーの名前)"__main__"にあなたの設定ファイルに"Main"の名前を変更する:あなたは、どちらか

    • に必要他の方法で設定されていないlogging.getLogger(__name__)となっています。

  • +0

    hiro、ありがとう、あなたのソリューションは私のために働く。しかし、@Vinayからのコメントについてどう思いますか? – Lobo

    +1

    私は彼のコメントに完全に同意します。プロブレムを引き起こす可能性のある競争条件があります...「キュー」は優れたソリューションです!他にもあるかもしれない。 https://docs.python.org/3/howto/logging-cookbookに役立ちます。html#単一ファイルから複数のプロセスへのロギング(著者が誰であるかを見てください) –

    2

    あなたは(それはいくつかの状況で動作かもしれませんが、保証することはできません)動作するように単一のファイルに複数のプロセスから書き込みを期待すべきではありません。正しい方法は、マルチプロセスQueueを使用し、2010年のthis blog post(ここで再現するには時間がかかります)に概説されているように、すべてのファイルの書き込みを1つのプロセスで実行することです。重要なことは、各プロセスがの作成後にログを構成することです。必要に応じて、リンクされた例を例に示すプログラム構成ではなくdictConfigに変更することができます。

    関連する問題