サイトアイコン Python Snippets

ファイルへのログ出力、Logger生成

basicConfigでファイルへ出力

basicConfigでfilename引数を指定。

logging.basicConfig(level=logging.DEBUG, 
    filename="test.log",
    format="%(asctime)s %(levelname)-7s %(message)s")

basicConfigで設定する場合は、logger全体(rootLogger)への一括設定となり簡単ではあるが細かい設定はできない。

注意
basicConfigはすでにrootLoggerにハンドラが設定されているとなにも処理をしない。したがってbasicConfigで簡易設定できるのだが、2回目はなにも変更されないので注意。levelなどを変更しようと思ってもすでにhandlerが設定されているとなにも処理されない。他人が使用するライブラリなどではbasicConfigは使用しないほうがよい。
force=Trueというパラメータ設定することで強制的に現在設定ずみのハンドラを削除して再設定することができるが、これは3.8で追加された機能。また3.7以前で使用してもエラーにはならないので注意。

Loggerを設定してファイルへログ出力

basicConfigからのrootLoggerではなく、自分でLoggerを取得して詳細に設定する。

以下の例では、Loggerに2つのHandlerを設定して、1回の出力処理で2種類Handler(StreamとFile)への出力をする例。Handlerについては、こちらを参照。

logger(level=DEBUG) --+-- handler1(StreamHandler) 
                     +-- handler2(FileHandler)   level=WARN
import logging

logger = logging.getLogger("logger")    #logger名loggerを取得
logger.setLevel(logging.DEBUG)  #loggerとしてはDEBUGで

#handler1を作成
handler1 = logging.StreamHandler()
handler1.setFormatter(logging.Formatter("%(asctime)s %(levelname)8s %(message)s"))

#handler2を作成
handler2 = logging.FileHandler(filename="test.log")  #handler2はファイル出力
handler2.setLevel(logging.WARN)     #handler2はLevel.WARN以上
handler2.setFormatter(logging.Formatter("%(asctime)s %(levelname)8s %(message)s"))

#loggerに2つのハンドラを設定
logger.addHandler(handler1)
logger.addHandler(handler2)

#出力処理
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")

実行結果

$ ./logger.py
2012-04-20 12:16:36,234    DEBUG debug message
2012-04-20 12:16:36,236     INFO info message
2012-04-20 12:16:36,236  WARNING warn message 
2012-04-20 12:16:36,236    ERROR error message

$ cat test.log
2017-06-13 10:36:11,231  WARNING warn message
2017-06-13 10:36:11,231    ERROR error message
関連記事:

モバイルバージョンを終了