Python ロギング(Logger)

ソースコードのデバッグ情報表示は、何も準備せず使用可能なprint()を使用してる方が多いと思いますが、エンジニアとしては、logger(loggingモジュール)を使用することをお勧めします。理由は、ググれば他のサイトでも書かれていますが、まずは ログ表示(出力)レベルを任意に設定可能なこと。これは、linux kernelでも実装されていて、linuxドライバ開発で何度も使用しました。(ログレベルもlinuxと同一で、debug, info, warning, error, critical)
Pythonでは更に、.yaml(古い実装では.ini)ファイルを設けて、プログラムを変更することなくログ表示レベルやログ出力先や出力形式をカスタマイズできる点ですね。.yamlファイルを使用せず、ソース内に埋め込むことも可能。

実装は、クラス化するほどでもなかったので、当サイト内に掲載しているconfig_ini.pyモジュールに追加しました。
yamlを使用するのでinstallが必要です。インストールは、コンソールから”> pip install pyyaml”でインストール可能です。

以下のロギング機能ソースは、
①カレントフォルダ下にlogフォルダを作成して、フォルダ下のerror.logファイルの最終行にログを追加(error.logファイルはappendモード指定)します。
②モジュール(.py)ごとに、ログレベルとログ出力先(strerrとerror.logファイル)をカスタマイズしてます。

---config_ini.py---
# coding: utf-8
# yamlパッケージ pyyaml-6.0.3 (pip install pyyaml)
import yaml

LOG_DIR = "./log"
CONFIG_FILE = "config.yaml"

class ConfigIni():           # 既存config_iniクラス
    def __init__(self):      # 既存config_iniクラス__init__()メソッド
        try:
            # config.yamlの内容をloggingに登録する
            if not os.path.exists(LOG_DIR):
                os.mkdir(LOG_DIR)
            with open(CONFIG_FILE, "r") as fp:
                config = yaml.safe_load(fp)
            logging.config.dictConfig(config)
            ~以下省略~
---config.yaml---
version: 1
formatters:
  defaultFormat:
    format: '%(asctime)s %(name)s:%(lineno)s %(funcName)s %(levelname)s %(message)s'
handlers:
  consoleHandler:
    class: logging.StreamHandler
    formatter: defaultFormat
    level: DEBUG
  fileHandler:
    class: logging.FileHandler
    formatter: defaultFormat
    level: INFO
    filename: ./log/error.log
    mode: a
loggers:
  debug1_tab:
    handlers:
      - consoleHandler
      - fileHandler
    level: DEBUG
    propagate: no
  setting_tab:
    handlers:
      - consoleHandler
    level: WARNING
    propagate: no
root:
  handlers:
    - consoleHandler
  level: INFO

.yamlに記載した”loggers”の”debug1_tab”、”debug1_tab”モジュールと、debug1_tab.py、setting_tab.pyのgetLogger(__name__)文の__name__を一致させている。
モジュール内のロギング方法を以下に掲載します。warningより上のerror()、critical()は載せてません。

---debug1_tab.pyの一部---
import logging
class Debug1Tab(tk.Frame):
    def __init__(self, parent, config_ini):
        self.logger = logging.getLogger(__name__)
        self.logger.debug("Debログ")        # 確認コード。strerrのみ出力
        self.logger.info("Infoログ")        # 確認コード。strerr、ファイル出力
        self.logger.warning("Waringログ")   # 確認コード。strerr、ファイル出力
---setting_tab.pyの一部---
import logging
class SettingTab(tk.Frame):
    def __init__(self, parent, config_ini):
        self.logger = logging.getLogger(__name__)
        self.logger.debug("Debログ")        # 確認コード。出力なし
        self.logger.info("Infoログ")        # 確認コード。出力なし
        self.logger.warning("Waringログ")   # 確認コード。strerrのみ出力

stderrとログファイル出力結果。(太字にしましたが)stderr出力とファイル出力の違いが分かりますか?

---stderr出力---
2025-10-11 11:34:41,567 debug1_tab:15 __init__ DEBUG Debログ
2025-10-11 11:34:41,567 debug1_tab:16 __init__ INFO Infoログ
2025-10-11 11:34:41,567 debug1_tab:17 __init__ WARNING Waringログ
2025-10-11 11:34:41,581 setting_tab:13 __init__ WARNING Waringログ
---error.logファイル出力(sjis)---
2025-10-09 21:57:30,807 debug1_tab:16 __init__ INFO Infoログ
2025-10-09 21:57:30,807 debug1_tab:17 __init__ WARNING Waringログ
2025-10-11 11:34:41,567 debug1_tab:16 __init__ INFO Infoログ
2025-10-11 11:34:41,567 debug1_tab:17 __init__ WARNING Waringログ

コメントを残す