1. ホーム
  2. python

[解決済み] ファイルにログを記録し、標準出力に印刷するためのロガー設定

2022-02-01 15:14:39

質問事項

私はPythonのloggingモジュールを使って、いくつかのデバッグ文字列をファイルに記録していますが、かなりうまくいっています。今、私はさらに、標準出力に文字列を印刷するために、このモジュールを使用したいと思います。どうしたらいいでしょうか?文字列をファイルに記録するために、私は次のコードを使用します。

import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
    LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

のようなロガー関数を呼び出してください。

logger.debug("I am written to the file")

ありがとうございました。

どのように解決するのですか?

ルートロガーへのハンドルを取得し、そのハンドルに StreamHandler . また StreamHandler は標準エラー出力に書き込みます。stderrよりもstdoutが本当に必要かどうかはわかりませんが、私がPythonのロガーをセットアップするときに使っているもので、さらにその上に FileHandler もあります。そうすると、すべてのログが両方の場所に送られるようになります(これはあなたが望んでいることのようです)。

import logging
logging.getLogger().addHandler(logging.StreamHandler())

に出力したい場合は stdout の代わりに stderr に指定する必要があります。 StreamHandler のコンストラクタを使用します。

import sys
# ...
logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))

を追加することもできます。 Formatter を追加することで、すべてのログ行に共通のヘッダを持たせることができます。

ie

import logging
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
rootLogger = logging.getLogger()

fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName))
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)

consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
rootLogger.addHandler(consoleHandler)

の書式で印刷します。

2012-12-05 16:58:26,618 [MainThread  ] [INFO ]  my message