私は 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
。 はStreamHandler
stderr に書き込みます。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