「動いてるはずなのに、どこで止まった?」😵💫
「本番だけ失敗する原因が追えない…」🌀
そんなときに“あなたの代わりに状況を記録してくれる”のが ログ です📝✨
Pythonは標準ライブラリの logging で、すぐに実務レベルのログ運用まで作れます。まずは最短で動かし、次に「現場で困らない形」に育てていきましょう💪🔥
参考書籍
業務効率化に向けたおすすめの参考書になります。
✅ログを入れると未来がラクになる理由🌈
ログを仕込むと、あなたの未来がこう変わります👇✨
- 原因調査が速くなる(どの処理まで進んだか一目)🔍
- 再現しない不具合も追える(環境・入力値・分岐を記録)🧪
- 運用・自動化が安定する(夜間バッチの監視がラク)🌙
- 「説明できる」状態になる(報告・引き継ぎがスムーズ)📣
🧱loggingの超基本(最小でOK)🚀
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です👇✨
- DEBUG:細かい内部情報(開発・検証向け)🧪
- INFO:通常の進行状況(業務自動化の基本はココ)📘
- WARNING:想定外だけど続行できる(予兆検知)⚠️
- ERROR:処理として失敗(原因調査が必要)🛠️
- CRITICAL:致命的(停止・即対応レベル)🚨
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で表示形式も調整可)🕒
📁ログ保存先フォルダを作ってから吐く(自動化で超重要)🏗️
「ログファイル作りたいのに、フォルダがなくて落ちた」😇
自動化あるあるです。先にフォルダを作りましょう📂✨
LOGフォルダを作って保存する例📌
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")
この形は「ログの保存先を指定する」実務パターンとして使いやすいです📎
🧩“loggerを作る”と運用が一段ラクになる(おすすめ)🧠✨
logging.info(...) を直で呼ぶより、loggerオブジェクトを使うと管理がしやすくなります📌
特に「複数ファイル」「モジュール分割」した瞬間に効いてきます🚀
loggerの基本形(鉄板)🔧
import logging
logger = logging.getLogger(__name__)
logger.info("このモジュールのログです")
🖥️コンソール+ファイルの“二刀流”にする(現場で強い)⚔️✨
「実行中は画面で見たい」👀
「後からファイルで追いたい」📁
両方叶えるなら Handler を使います🧩
Stream(画面)+File(ファイル)構成📦
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 です🔁✨
日次で切り替え(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() が強い(スタックトレース付き)🧩🔥
「どこで落ちたか」を一発で残すならこれです👇
try/exceptの正しい残し方🧯
import logging
logger = logging.getLogger(__name__)
try:
1 / 0
except Exception:
logger.exception("例外が発生しました💥")
exception() は スタックトレース込みで記録できるので、調査の時間を激減させます⏱️✨
🧠やりがちな落とし穴(これだけ避ければ強い)🪤
① 複数回 basicConfig() を呼ぶと混乱しやすい🌀
アプリ全体の設定は「入口(main)」でまとめるのが安全です🚪✨
② “ライブラリ側”で勝手に設定しない📦
再利用されるモジュール内でグローバル設定を変えると、呼び出し元のログ方針を壊すことがあります⚠️
モジュールは「loggerを作って出すだけ」にして、設定はアプリ側が持つのが基本です🧠✨
③ ログに機密情報を出さない🔒
パスワード・APIキー・個人情報はマスクする習慣が最強です🛡️✨
✅まとめ:まずはINFOで“見える化”→ローテで“運用化”へ🚀🌈
最初の一歩はこれだけでOKです👇✨
basicConfig()で INFOログを出す📘- フォーマットを整えて 調査しやすくする🕵️♂️
- 保存先フォルダを作り 自動化で落ちないようにする📂
- ローテーションで ディスク事故を防ぐ🔁
ログがあるだけで、トラブル対応も改善も“現実的なスピード”になります🏃♂️💨
あなたの自動化が、より安心して回り続けますように🌙✨
❓FAQ(よくある質問)💬✨
Q1. 🤔 print() と logging は何が違うの?
A. loggingは **レベル(重要度)**や **出力先(ファイル/画面/回転)**を管理でき、運用に耐えます📦✨ printは手軽ですが、後から追うのが大変になりがちです🌀
Q2. 🧪 まずどのレベルで始めるのがいい?
A. 業務自動化なら INFO がちょうど良いことが多いです📘✨ 重要な節目(開始/終了/件数/失敗)をINFOにすると追いやすいです🔍
Q3. 📁 ログファイルが作られないときは?
A. 保存先フォルダが存在しないケースが多いです📂 os.makedirs(..., exist_ok=True) で先に作るのが安全です🛡️
Q4. 🔄 ログが肥大化して困ってます…
A. TimedRotatingFileHandler などで日次ローテ+世代管理ができます📅✨ backupCount を決めるとディスク事故を防げます🧯
Q5. 💥 例外の場所をちゃんと残したい!
A. logger.exception() を使うと スタックトレース込みで残せます🧩🔥 原因調査が一気にラクになります⏱️✨




コメント