🐍

PythonのLogginng(Minimum)

2023/09/08に公開

はじめに

Pythonで新しくプロジェクトを作ろうとした際、そういえばLoggerの設定や取り扱いってどうすればいいんだっけ?と思って調べてみたところQiitaやZennだと様々な流儀のLoggingのやり方が書いてあって、結局どうすればいいのかがわからず混乱したので自分で調べてまとめました。

最低限十分なLogginngの方法

私がLoggingについて調べ始めたときは、とりあえずどうしたらいいのかだけが分かればよかったので同じ気持ちの人のために結論だけ書きます。

Packageプロジェクトの場合

PythonのPackageを作成している場合はログを送出したい各モジュールの先頭部分で getLogger を呼んでLoggerオブジェクトをうけとり、ログを送出したい部分で debug, info, warning, criticalなどの重要度を使い分けてログを送出しましょう。

from logging import getLogger
_logger = getLogger(__name__)

def greate_function():
  _logger.info("Someting greate start!")
  """
  すごい処理
  """
  _logger.debug("this is debug message")

class GreateClass():
  def __init__(self):
    _logger.debug("Initializing GreateClass...")

_loggerの先頭に_をつけているのはこのモジュールを外からimportしたときに_loggerオブジェクトは外から使用するものではないということを意味しています。細かいことは考えず最初の 2 行だけ各ファイルに書いてログを出しましょう! Python Packageのプロジェクトであればこれだけで十分です。

APIサーバーや直接実行するスクリプトの場合

上の設定だけだと、Loggerに渡したメッセージをどのログレベルまで、どのような形で出力するかが定義されていないのでログの内容を出力して確認することができません。

サービスを作る場合やPython Interprinterから直接実行するスクリプト、cliツールを書いたりする場合はログの出力方法の設定を行なってあげる必要があります。

特定のログレベル以上のログを標準エラー出力に出力するだけであればエントリーポイントに以下の設定を加えればよいです。(ここでいうエントリーポイントとは直接実行するpythonスクリプトのことを指します。例えばflaskだとapp.pymain.pyという名前にすることが多いです)

from logging import DEBUG, basicConfig

# RootLoggerの出力設定
basicConfig(level=DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

formatを指定しているのは時刻、モジュール名、ログレベルは表示しておいた方がトラブルシューティングの際便利だからです。ここはプロジェクトの事情や好みの問題もあるので、便利なように設定しましょう。

直接実行しない、エントリーポイントに import して使うモジュールについては Package の時と同じくgetLogger_loggerを作ってログを送出しましょう。

なぜこれで概ね十分なのか

なぜこれだけでプロジェクト初期は十分なのかは個人ブログに説明を書きました。興味があったらご覧ください。

この記事を書くにあたってLogging HOWTOを参考にしました。プロジェクトの事情に合わせて設定を行いたい場合はこのガイドに従って設定を追加すればよいと思います。

Discussion