ファイルにログを記録し、stdoutに出力するロガー設定 質問する

ファイルにログを記録し、stdoutに出力するロガー設定 質問する

私は Python のロギング モジュールを使用して、デバッグ文字列をファイルに記録していますが、これは非常にうまく機能しています。さらに、このモジュールを使用して文字列を stdout に出力したいと考えています。どうすればよいでしょうか? 文字列をファイルに記録するには、次のコードを使用します。

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

ご協力ありがとうございます!

ベストアンサー1

ルート ロガーへのハンドルを取得して、 を追加するだけですStreamHandler。 はStreamHandlerstderr に書き込みます。stderr ではなく stdout が本当に必要かどうかはわかりませんが、これは私が Python ロガーをセットアップするときに使用するもので、 も追加しますFileHandler。すると、すべてのログが両方の場所に送信されます (これが必要なことのようです)。

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

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

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

Formatterすべてのログ行に共通のヘッダーが含まれるように を追加することもできます。

例:

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

おすすめ記事