メモ

python logging スニペット

メモ

こんにちは。Anieca です。

本日は python の logging 用 スニペットを紹介します。

完成品

結論から言うと以下の通りです。

ログの出力を考えている場合は、このスニペットを最初に用意してからプログラムを書いていくのが良いかと思います。

import os
import logging
from datetime import datetime

logdir = "logs"
logpath = os.path.join(logdir, "{}.log".format(datetime.now().strftime("%Y%m%d_%H%M%S")))
os.makedirs(logdir, exist_ok=True)

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

fh = logging.handlers.RotatingFileHandler(logpath, maxBytes=1024 * 1024 * 1024, backupCount=3)
fh.setLevel(logging.INFO)
fh.setFormatter(formatter)

sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
sh.setFormatter(formatter)

logger.addHandler(fh)
logger.addHandler(sh)

説明

import os
import logging
from datetime import datetime

logdir = "logs"
logpath = os.path.join(logdir, "{}.log".format(datetime.now().strftime("%Y%m%d_%H%M%S")))
os.makedirs(logdir, exist_ok=True)

1, 2 行目でPython の標準ライブラリである os と logging をインポートします。

4 行目でログ出力ファイルを記載します。

5行目でログ出力ディレクトリ配下に現在時刻を名前にもつファイル名を定義します。

6行目でログ出力ディレクトリを実際に生成します。exist_ok オプションはディレクトリが存在する場合には何もしないことを意味します。

このオプションを書かないと 既にディレクトリがある場合にエラーが発生するので要注意です。

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

1行目 getLogger でログを管理するオブジェクトを生成します。

引数にオブジェクトの名前を指定します。

なんでも良いのですが、モジュールの名前(__name__)にするケースが多いです。

2行目で標準のログレベルを設定します。ログレベル以下のログは出力されません。

以降でファイル出力する場合のログレベルや標準出力する場合のログレベルを設定しますが、この標準ログレベルよりも低く設定しても意味がないので注意してください。

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

フォーマットを定義します。

名称説明
asctime現在時刻です。
nameログの名称です。
levelnameログレベルです。
message内容です。
fh = logging.handlers.RotatingFileHandler(logpath, maxBytes=1024 * 1024 * 1024, backupCount=3)
fh.setLevel(logging.INFO)
fh.setFormatter(formatter)

sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
sh.setFormatter(formatter)

logger.addHandler(fh)
logger.addHandler(sh)

ハンドラと呼ばれる概念を定義します。(出力先と思っていただいて構いません。)

1行目で、上述したパスにログファイル出力をすること、ログが1GBを超えたら別のファイルに出力すること、そういったファイル変更を3回まで行い、そのあとはローテーションすることを指定しています。

2行目でログレベルを指定、3行目でフォーマットを指定します。

5行目で標準出力にもログを出力することを指定しています。

6,7行目でログレベル、フォーマットを指定します。

9,10 行目で、この設定を登録しています。

ログ出力

上記スニペットを貼り付けたファイル内で以下のようにログを出力できます。

logger.info('Initialize this python module')

a = 10
logger.debug(a)

終わりに

今回は以上です。

これを機に、ログを活用してみてはいかがでしょうか。

コメント

タイトルとURLをコピーしました