5

一見似たような問題に対するこの回答を見つけましたが、(私は Python の初心者なので) コードにこのソリューションを実装する方法がわかりません (結局のところ同じ問題である場合)。

私のコードには、次のセクションがあります。

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')

面白いことに、以前は正常に動作していましたが、ある時点でこれらの重複メッセージをコンソールに書き込み始めました。

誰かここで道順を教えてもらえますか?

4

3 に答える 3

5

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

問題は、モジュールレベルでロガーを取得していたことです。これは非常に論理的に見えますが、落とし穴があります。ファイルから構成をロードする前に、Python ロギング モジュールは作成されたすべてのロガーを尊重します。したがって、基本的に、モジュール (gets logger を内部で使用) をメイン コード (ロガーも呼び出していた) にインポートすると、ロガー データが 2 回ストリーミングされました。

この問題の可能な解決策は次のとおりです。

  1. モジュールレベルでロガーを取得しない
  2. Falseに設定disable_existing_loggersします。Python 2.7 以降で追加
于 2013-08-14T05:38:47.613 に答える
5

通常、重複したログ ステートメントが発生するのは、ログ ステートメントを同じ場所に送信する 2 つの別個のハンドラーが接続されているためです。問題の根本にたどり着くために試す価値のあることがいくつかあります。

  1. logging.basicConfig への呼び出しをコメント アウトします。これにより重複したログ ステートメントがなくなる場合、これは、2 番目のログ ハンドラーを手動で構成する必要がない可能性が高いことを意味します。
  2. IDE を使用している場合は、ログ ステートメントにブレークポイントを設定し、デバッガーを使用してステップ インすることで、Python のログ セットアップの状態を詳しく調べて、さまざまなハンドラーがアタッチされていることをより明確に把握することができます。

ロギングの管理を容易にするために、構成をコードから構成ファイルに移動することを検討する価値があるかもしれません。ロギング構成に関する Python ドキュメントは、開始するのに最適な場所です。

于 2013-06-20T08:17:39.153 に答える
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
于 2017-09-07T16:03:34.780 に答える