「動いてるはずなのに、どこで止まった?」😵💫
「本番だけ失敗する原因が追えない…」🌀
そんなときに“あなたの代わりに状況を記録してくれる”のが ログ です📝✨
Pythonは標準ライブラリの logging で、すぐに実務レベルのログ運用まで作れます。まずは最短で動かし、次に「現場で困らない形」に育てていきましょう💪🔥
業務効率化に向けたおすすめの参考書になります。
ログを仕込むと、あなたの未来がこう変わります👇✨
Pythonでは標準の logging を使います🐍
まずは basicConfig() で、出力先・レベル・フォーマットを決めるのが王道です🧩
import logging
logging.basicConfig(
filename="example.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.debug("debug: 開発用の詳細ログ")
logging.info("info: 正常フローの記録")
logging.warning("warning: 注意(続行できる)")
logging.error("error: エラー(要調査)")
logging.critical("critical: 致命的(止める判断も)")
この形は、基本の使い方としてとても分かりやすいです🧠✨(filename を指定すればファイル出力になります)
ログレベルは「どれくらい重要か」を表します📶
目安はこれでOKです👇✨
loggingはこのレベル体系を前提に設計されています🧱
ログの価値は フォーマットで爆上がりします💥
おすすめは「いつ・どこで・何が」を揃える形です🧷
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s | %(levelname)s | %(name)s | %(filename)s:%(lineno)d | %(message)s"
)
%(name)s:どのロガーか(モジュール単位で分けると最強)🧩%(filename)s:%(lineno)d:どの行で出たかが一発で分かる👀%(asctime)s:時刻(必要なら datefmt で表示形式も調整可)🕒「ログファイル作りたいのに、フォルダがなくて落ちた」😇
自動化あるあるです。先にフォルダを作りましょう📂✨
import os
import logging
log_folder = os.path.join(os.getcwd(), "LOG")
os.makedirs(log_folder, exist_ok=True)
log_file_path = os.path.join(log_folder, "example.log")
logging.basicConfig(
filename=log_file_path,
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.info("ログ出力テストOK")
この形は「ログの保存先を指定する」実務パターンとして使いやすいです📎
logging.info(...) を直で呼ぶより、loggerオブジェクトを使うと管理がしやすくなります📌
特に「複数ファイル」「モジュール分割」した瞬間に効いてきます🚀
import logging
logger = logging.getLogger(__name__)
logger.info("このモジュールのログです")
「実行中は画面で見たい」👀
「後からファイルで追いたい」📁
両方叶えるなら Handler を使います🧩
import logging
from pathlib import Path
Path("LOG").mkdir(exist_ok=True)
logger = logging.getLogger("app")
logger.setLevel(logging.INFO)
fmt = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")
# 画面出力
sh = logging.StreamHandler()
sh.setFormatter(fmt)
# ファイル出力
fh = logging.FileHandler("LOG/app.log", encoding="utf-8")
fh.setFormatter(fmt)
logger.addHandler(sh)
logger.addHandler(fh)
logger.info("二刀流ログ、開始!")
loggingは「ロガー → ハンドラ → 出力先」という構造なので、ここを押さえると自由度が上がります🧠✨
ログを放置すると、ディスクを圧迫して別の障害を呼びます💣
そこで使うのが RotatingFileHandler / TimedRotatingFileHandler です🔁✨
import logging
from logging.handlers import TimedRotatingFileHandler
from pathlib import Path
Path("LOG").mkdir(exist_ok=True)
logger = logging.getLogger("batch")
logger.setLevel(logging.INFO)
handler = TimedRotatingFileHandler(
"LOG/batch.log",
when="midnight",
interval=1,
backupCount=14,
encoding="utf-8",
utc=False
)
formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("日次ローテーションで安全運用✨")
backupCount=14:直近14日分だけ残す📦exception() が強い(スタックトレース付き)🧩🔥「どこで落ちたか」を一発で残すならこれです👇
import logging
logger = logging.getLogger(__name__)
try:
1 / 0
except Exception:
logger.exception("例外が発生しました💥")
exception() は スタックトレース込みで記録できるので、調査の時間を激減させます⏱️✨
basicConfig() を呼ぶと混乱しやすい🌀アプリ全体の設定は「入口(main)」でまとめるのが安全です🚪✨
再利用されるモジュール内でグローバル設定を変えると、呼び出し元のログ方針を壊すことがあります⚠️
モジュールは「loggerを作って出すだけ」にして、設定はアプリ側が持つのが基本です🧠✨
パスワード・APIキー・個人情報はマスクする習慣が最強です🛡️✨
最初の一歩はこれだけでOKです👇✨
basicConfig() で INFOログを出す📘ログがあるだけで、トラブル対応も改善も“現実的なスピード”になります🏃♂️💨
あなたの自動化が、より安心して回り続けますように🌙✨
A. loggingは **レベル(重要度)**や **出力先(ファイル/画面/回転)**を管理でき、運用に耐えます📦✨ printは手軽ですが、後から追うのが大変になりがちです🌀
A. 業務自動化なら INFO がちょうど良いことが多いです📘✨ 重要な節目(開始/終了/件数/失敗)をINFOにすると追いやすいです🔍
A. 保存先フォルダが存在しないケースが多いです📂 os.makedirs(..., exist_ok=True) で先に作るのが安全です🛡️
A. TimedRotatingFileHandler などで日次ローテ+世代管理ができます📅✨ backupCount を決めるとディスク事故を防げます🧯
A. logger.exception() を使うと スタックトレース込みで残せます🧩🔥 原因調査が一気にラクになります⏱️✨