2013-06-20 21 views
5

this私はPythonの初心者ですから、一見似たような問題に答えました。私はこの解決策を自分のコードに実装する方法がわかりません。すべて)。私のコードでコンソールのPythonでログメッセージが2回表示される

私は次のセクションがあります。

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        filename='C:\\Tests\\TRACE.log', 
        filemode='a') 
console = logging.StreamHandler() 
console.setLevel(logging.INFO) 
consoleFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
console.setFormatter(consoleFormatter) 
logging.getLogger('').addHandler(console) 
localLog = logging.getLogger('text') 

面白いことは、それが正常に動作するために使用されるが、いくつかの瞬間に、それはコンソールにこれらの重複メッセージを書き始めていることです。

私はここで方向を教えてくれますか?

答えて

5

私はこの問題の原因を突き止めたようです。

私はモジュールレベルでロガーを取得していました。それはかなり論理的だが、落とし穴がある - Pythonロギングモジュールは、ファイルから設定をロードする前に、作成されたすべてのロガーを尊重します。したがって、基本的に、モジュール(ロガーを内部的に取得する)をメインコード(ロガーを呼び出す場所)にインポートすると、ロガーデータが2回ストリーミングされました。この問題への

可能な解決策は以下のとおりです。

  1. 虚偽に設定disable_existing_loggers
  2. モジュールレベルでロガーを取得しないでください。 Pythonの2.7以来追加
5

通常、ログ・ステートメントを同じ場所に送る2つの別個のハンドラーが接続されているため、重複するログ・ステートメントが発生します。問題の根本を取得しようとしている価値があるものがいくつかあります:logging.basicConfigへのコールアウト

  1. コメント - これは、重複するログステートメントを排除した場合、これは、あなたがいない可能性が高いことを意味します2番目のログハンドラを手動で設定する必要があります。
  2. IDEを使用している場合は、ログステートメントにブレークポイントを設定し、デバッガを使用してステップインすることで、ピュータンログの状態をイントロスペクトして、どのハンドラが接続されているかを明確に把握することができます。

管理があなたのログを簡単にするために、それはコードのうち、およびコンフィギュレーションファイルに設定を移動するために探して価値があるかもしれない - logging configuration上のPythonのドキュメントは、開始するには絶好の場所です。

+1

とあなたの答えに感謝しかし、どのように私はすべての 'コメントアウトすることができますloggingBasicConfig'?これには、パス、フォーマット、ファイルモードなどの必須設定が含まれています。 –

+1

質問を読むと、コンソールにログメッセージが重複して表示され、ファイルのログ記録に問題がないように見えます。私の疑問は、basicConfigがコンソールログハンドラを設定していて、次に第2のコンソールログハンドラを設定しているということです。ロギング設定を設定ファイルに移動することを強くお勧めします。ここでは、特定の設定をより明確にすることができます。 – robjohncox

+1

ファイルやコンソール、その他の宛先へのロギングは必須ではないことを指摘しておく価値があります。ロギングは、メッセージを表示または保存する便利な場所にメッセージを転送する単なる方法です。それらを送信します(ファイルとコンソールは非常に一般的な2つのオプションです)。ロギングがどのように機能するかについての堅実な紹介を得るために、pythonのドキュメントにある[高度なロギングチュートリアル](http://docs.python.org/2/howto/logging.html#advanced-logging-tutorial)の作業を強くお勧めします。 – robjohncox

0

私は私が使用修正だった、私のロガーの設定と同じような状況があった:こんにちはに

class Logger: 

@staticmethod 
def setup(name, file_name): 

    log_file = <path to save the file> 
    log_file_max_size = 1024 * 1024 * 20 # megabytes 
    log_num_backups = 3 
    log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s" 
    log_filemode = "w" # w: overwrite; a: append 
    logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG) 
    rotate_file = logging.handlers.RotatingFileHandler(
     log_file, maxBytes=log_file_max_size, backupCount=log_num_backups 
    ) 
    logger = logging.getLogger(name) 
    # Console output line. 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.INFO) 
    log_formatter = logging.Formatter(log_format) 
    console_handler.setFormatter(log_formatter) 
    logger.handlers = rotate_file, console_handler 

    return logger 
関連する問題