1. ホーム
  2. python

ロギング、StreamHandler、標準ストリーム

2023-10-27 21:30:48

質問

情報レベルのメッセージを標準出力に、それ以外を標準エラー出力に記録する方法がわかりません。私はすでにこれを読んだ http://docs.python.org/library/logging.html . 何か提案はありますか?

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

次のようなスクリプトです。 log1.py :

import logging, sys

class SingleLevelFilter(logging.Filter):
    def __init__(self, passlevel, reject):
        self.passlevel = passlevel
        self.reject = reject

    def filter(self, record):
        if self.reject:
            return (record.levelno != self.passlevel)
        else:
            return (record.levelno == self.passlevel)

h1 = logging.StreamHandler(sys.stdout)
f1 = SingleLevelFilter(logging.INFO, False)
h1.addFilter(f1)
rootLogger = logging.getLogger()
rootLogger.addHandler(h1)
h2 = logging.StreamHandler(sys.stderr)
f2 = SingleLevelFilter(logging.INFO, True)
h2.addFilter(f2)
rootLogger.addHandler(h2)
logger = logging.getLogger("my.logger")
logger.setLevel(logging.DEBUG)
logger.debug("A DEBUG message")
logger.info("An INFO message")
logger.warning("A WARNING message")
logger.error("An ERROR message")
logger.critical("A CRITICAL message")

を実行すると、次のような結果が得られます。

C:\temp>log1.py
DEBUGメッセージ
INFOメッセージ
警告メッセージ
ERRORメッセージ
CRITICALメッセージ

期待通り、ターミナルでは sys.stdoutsys.stderr は同じです。では、stdoutをファイルにリダイレクトしてみましょう。 tmp :

C:\temp>log1.py >tmp
DEBUGメッセージ
警告メッセージ
ERRORメッセージ
CRITICALメッセージ

つまり、INFOメッセージは端末に出力されませんが、端末の sys.stderr には が印刷されています。の中身を見てみましょう。 tmp :

C:\temp>type tmp
INFOメッセージ

というわけで、この方法で望みのものができるようです。