この記事の対象者
- Pythonでlogを書き始めたい人
- loggerについて学びたい人
なぜlogを書くのか?
理由は色々あると思いますが、個人的にprintではなくlogが必要な理由は下記があると考えます。
print()
では、いつ起きたかがわからないprint()
では、表示したい場合と表示したくない場合、全てのコメントをコメントアウトする必要がある- logを使えば、どこでエラーがおきたかすぐわかる
逆にprint()
でもいいケースとは何でしょうか?
私の所感だと、
- 10 ~ 20行程度のプログラム等での軽いデバック用
- 1時的に中身を確認したいとき
だと考えています。
loggerの始め方
はじめに、logレベルについて学びましょう。
logには5つの段階があります。
DEBUG | 開発中に、原因を突き止めやすくするために、詳細な情報を出力したいときに利用 |
INFO | 運用中に、イベントの発生情報 (または、想定通りの動作情報) を出すときに利用 |
WARNING | 今は問題ではないけど、今後の運用で注意が必要な情報出力として利用 |
ERROR | 機能実行でエラーが発生した際に利用 |
CRITICAL | 大問題が発生し、アプリ動作がおかしいときに利用 |
開発中には、Debug、運用中であれば局面局面でのお知らせにInfo等がよく使われるかと思います。
続いて、loggerの設定の仕方について学びましょう。
以下のコードをコピペすれば設定は完了です。
from logging import getLogger, basicConfig, INFO logger = getLogger(__name__) basicConfig( filename='log.log', filemode='w', level=INFO, format='{asctime} {name}:{lineno} [{levelname}]: {message}', style='{' )
各、設定について解説します。
from logging import getLogger, basicConfig, INFO logger = getLogger(__name__) basicConfig( filename='log.log', # log.logというファイル名で書き出します filemode='w', # defaultは、'a'です。'w'にすると、実行の度に新たにファイルが作成されます。デフォルトでは上書きになります。 level=INFO, # どのレベルからlogに表示させるかを設定します。デフォルトでは、WARNINGです。 format='{asctime} {name}:{lineno} [{levelname}]: {message}', # 書き出すformatの指定です。詳細は下記にまとめます。 style='{' # フォーマットのstyleを指定します。デフォルトは、"%"です。 )
書き出すフォーマットは下記のような候補があります。
{asctime} # 生成時間。YYYY-MM-DD HH:MM:SS,UUU 形式。datefmtでフォーマット変更可能 {created} # 生成時間。time.time(}が返却する形式 {msecs} # 生成時間のミリ秒部 {relativeCreated} # logginモジュールが読み込まれてからの経過時間(ミリ秒} {levelname} # レベル名(DEBUG, INFO, WARNING, ERROR, CRITICAL} {levelno} # レベル番号。DEBUGは10, INFOは20など {module} # モジュール名 {pathname} # パス名 {filename} # ファイル名 {funcName} # 関数名 {lineno} # 行番号 {message} # ログメッセージ {name} # ロガー名 {process} # プロセスID {processName} # プロセス名 {thread} # スレッドID {threadName} # スレッド名
サンプルコード
上記の設定を行うと、サンプルコードは以下のようになります。
from logging import getLogger, basicConfig, INFO logger = getLogger(__name__) basicConfig( filename='log.log', filemode='w', level=INFO, format='{asctime} {name}:{lineno} [{levelname}]: {message}', style='{' ) logger.debug('debug log') logger.info('info log') logger.warning('warning log') logger.error('error log') logger.critical('critical log')
log.log
は下記のものが書き出されます。
2024-09-20 22:25:08,256 __main__:14 [INFO]: info log 2024-09-20 22:25:08,256 __main__:15 [WARNING]: warning log 2024-09-20 22:25:08,256 __main__:16 [ERROR]: error log 2024-09-20 22:25:08,256 __main__:17 [CRITICAL]: critical log
これで、いつ・何行目で・どのようなLogが出ているか把握することができるようになりましたね!