Operation KiWi

一生使える言語はPythonだと信じてる

pythonのloggingで悩んだらこれをコピペしてインスタンス化すればおk

もうprint()をどこに書いたか分からなくなって、泣く人は居ないんだね…

qiitaの記事が凄い勉強になった

ログ出力のための print と import logging はやめてほしい

この記事がきっかけでloggingのちゃんとした使い方を学べました。これを参考にしたのが、下のコード。

ソースコード

from logging import getLogger, StreamHandler, FileHandler, DEBUG, INFO, ERROR
import logging
import os


class LoggingManagement(object):
    def make_logger():
        # ログ関連。詳細↓が参考になった。
        # http://qiita.com/amedama/items/b856b2f30c2f38665701
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        logger = getLogger(__name__)
        s_handler = StreamHandler()
        if not os.path.exists('log'):
            os.mkdir('log')
        f_handler = FileHandler('log/app.log', mode='at', encoding='utf-8')
        s_handler.setLevel(DEBUG)
        f_handler.setFormatter(formatter)
        f_handler.setLevel(ERROR)
        logger.setLevel(INFO)
        logger.addHandler(s_handler)
        logger.addHandler(f_handler)
        return logger

if __name__ == '__main__':
    logger = LoggingManagement().make_logger()
    logger.debug("こんにちは。コンソールに表示されますが、logには記録されません。")
    logger.info("コンソールに表示されるし、logにも記録されます。")
    logger.error("同上")

使い方

f_handler.setLevel()

  • ファイル出力に関する設定です。 上のコードの場合、ERROR以上の場合にlog.app.logに記録します。

    s.handler.setLevel()

  • ストリーム出力、つまりコンソールに表示に関する設定です。 上のコードの場合、DEBUG以上の場合、つまりすべてをコンソールに表示します。

logger.setLevel()

  • 全体のレベルを制御する
logger.setLevel(INFO)

なら、logger.debug("hoge")は無視されます。

インスタンス化して使おう

logger.debug()

  • print()の代わりになる。デバッグの時に大量に使っても、レベルをINFOにあげれば表示されなくなるので便利。

logger.info()

  • コンソール、ログファイルの両方に出力されます。

logger.error()

  • エラー用に使います。

終わり

print()は便利ですが、使いまくるとどこで呼んだのか分からなくなったりするので…なるべくlogger.debug()を使いましょう。

素晴らしいQuitaの記事を書いてくださった方に感謝!!

入門 Python 3

入門 Python 3

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング