2017-07-20 6 views
1
#!/usr/bin/python 
import os 
import logging 
import pickle 

def _config_logger(test_name): 
    logger = logging.getLogger() 
    logger.setLevel(logging.DEBUG) 
    logging.basicConfig(format='%(message)s',filename="./%s.txt" %(test_name)) 
    stderrLogger=logging.StreamHandler() 
    stderrLogger.setFormatter(logging.Formatter('%(message)s')) 
    logging.getLogger("").addHandler(stderrLogger) 
    return logger 

for i in ['x','y','z']: 
    logger=_config_logger(i) 
    logger.debug(i) 

出力が期待できない、yが2回、zが3回印刷されます。ログを出力してログを保存していますが、私のコードで何が問題になっていますか?

$のpython test.py
のx
yの
Y
zの
Z
Z

しかし、私は一つだけのファイルX.TXTを持って、私はY.TXTを期待しています。 z.txtは

$のLS test.py

X.TXT私はどのように行う必要がありますありますか?

答えて

0

logging.basicConfigのためのドキュメントを確認してください:

ルートロガーがすでにそれに対して構成ハンドラ を持っている場合、この関数は何もしません。

x.txtのために一度それを呼び出すと、それ以降の呼び出しは効果がありません。そう、

def _config_logger(test_name): 
    logger = logging.getLogger() 

あなたはtest_namegeLogger()に合格しない:ここでは

file_handler = logging.FileHandler("./%s.txt" %test_name) 
file_handler.setFormatter(logging.Formatter('%(message)s')) 
logger.addHandler(file_handler) 
0

代わりlogging.basicConfigを呼び出す、あなたがストリームハンドラを追加しているのと同じように、ファイルハンドラを追加あなたは常にルートロガーを取得しています。そして、数行以降:

logging.getLogger("").addHandler(stderrLogger) 

ますので、「二度のy印刷、Zプリント3回」症状、ルートロガーにハンドラを追加し続けます。また

、何度も.basicConfig()以上の呼び出しは無用であり、唯一の最初の呼び出しが関連している、CF the fine manual

はデフォルトのフォーマッタでStreamHandlerのを作成し、それを追加することで、ロギングシステムの基本的な環境設定を行いますルートロガー。ルートロガーにハンドラが定義されていない場合、関数debug()、info()、warning()、error()およびcritical()はbasicConfig()を自動的に呼び出します。

この機能は、ルートロガーにハンドラがすでに設定されている場合は何も行いません。

関連する問題