2016-05-10 7 views
0

sys.stdoutにメッセージを記録しようとしていますが、独自の関数を使って同じフォーマットを設定しています。ファイルにログインするか、関数の外に出ると、すべてが期待通りに機能します。私は私の関数にメッセージを送信すると、私は重複を取得:Pythonロギングでログメッセージが複製される

def log(lvl, msg): 
    logging.basicConfig(level=logging.DEBUG, 
         format='%(asctime)s %(levelname)-8s %(message)s', 
         datefmt='%Y-%m-%d %H:%M:%S', 
         filename='/tmp/test.log', 
         filemode='a') 

    console = logging.StreamHandler(sys.stdout) 
    console.setLevel(logging.INFO) 
    formatter = logging.Formatter('%(levelname)-8s %(message)s') 
    console.setFormatter(formatter) 
    logging.getLogger('').addHandler(console) 
    logging.log(lvl, "%s: %s" % (options.build_node, msg)) 

if __name__ == "__main__": 

    print "Executing outside of the function" 
    logging.basicConfig(level=logging.DEBUG, 
         format='%(asctime)s %(levelname)-8s %(message)s', 
         datefmt='%Y-%m-%d %H:%M:%S', 
         filename='/tmp/test.log', 
         filemode='a') 
    console = logging.StreamHandler(sys.stdout) 
    console.setLevel(logging.INFO) 
    formatter = logging.Formatter('%(levelname)-8s %(message)s') 
    console.setFormatter(formatter) 
    logging.getLogger('').addHandler(console) 
    logging.log(logging.INFO, "some message") 
    logging.log(logging.ERROR, "some error message") 
    logging.log(logging.WARN, "Warning message") 
    logging.log(logging.INFO, "another info message")  

    print "\nNow calling the log function" 
    log(logging.INFO, "some message") 
    log(logging.ERROR, "some error message") 
    log(logging.WARN, "Warning message") 
    log(logging.INFO, "another info message") 

そして私が手出力は次のようになります。

Executing outside of the function 
INFO  some message 
ERROR some error message 
WARNING Warning message 
INFO  another info message 

Now calling the log function 
INFO  None: some message 
INFO  None: some message 
ERROR None: some error message 
ERROR None: some error message 
ERROR None: some error message 
WARNING None: Warning message 
WARNING None: Warning message 
WARNING None: Warning message 
WARNING None: Warning message 
INFO  None: another info message 
INFO  None: another info message 
INFO  None: another info message 
INFO  None: another info message 
INFO  None: another info message 

とログファイルの内容が期待されているとおり

2016-05-10 09:38:15 INFO  some message 
2016-05-10 09:38:15 ERROR some error message 
2016-05-10 09:38:15 WARNING Warning message 
2016-05-10 09:38:15 INFO  another info message 
2016-05-10 09:38:15 INFO  None: some message 
2016-05-10 09:38:15 ERROR None: some error message 
2016-05-10 09:38:15 WARNING None: Warning message 
2016-05-10 09:38:15 INFO  None: another info message 

I私のlog(lvl、msg)関数で何が間違っているのかを知ることはできません。 何かが、各呼び出しで重複してメッセージをstdoutに伝播させます。 私は何が欠けていますか?事前

答えて

3

logging.getLogger('').addHandler(console)は、関数logを呼び出すたびにハンドラを追加しているため、メッセージが重複しています。

2

ありがとうございますは一度だけあなたがログインしていないたびに設定を設定することになっています。 logを呼び出すたびに、ルートロガーに追加のコンソールハンドラが追加され、メッセージ数が増加し続けるようになります。

関連する問題