🧰Pythonでログを出力する方法まとめ(loggingの基本〜実務で困らない設定まで)🐍✨

「動いてるはずなのに、どこで止まった?」😵‍💫
「本番だけ失敗する原因が追えない…」🌀
そんなときに“あなたの代わりに状況を記録してくれる”のが ログ です📝✨

Pythonは標準ライブラリの logging で、すぐに実務レベルのログ運用まで作れます。まずは最短で動かし、次に「現場で困らない形」に育てていきましょう💪🔥

目次
  1. 参考書籍
  2. ✅ログを入れると未来がラクになる理由🌈
  3. 🧱loggingの超基本(最小でOK)🚀
  4. 🧭ログレベルの選び方(迷いがちなポイント)🎚️
  5. 📦フォーマットを整えると“調査力”が跳ねる🕵️‍♂️✨
  6. 📁ログ保存先フォルダを作ってから吐く(自動化で超重要)🏗️
  7. 🧩“loggerを作る”と運用が一段ラクになる(おすすめ)🧠✨
  8. 🖥️コンソール+ファイルの“二刀流”にする(現場で強い)⚔️✨
  9. 🔄ログローテーション(肥大化対策)で事故を防ぐ🧯📦
  10. 🧨例外ログは exception() が強い(スタックトレース付き)🧩🔥
  11. 🧠やりがちな落とし穴(これだけ避ければ強い)🪤
  12. ✅まとめ:まずはINFOで“見える化”→ローテで“運用化”へ🚀🌈
  13. ❓FAQ(よくある質問)💬✨

参考書籍

業務効率化に向けたおすすめの参考書になります。


✅ログを入れると未来がラクになる理由🌈

ログを仕込むと、あなたの未来がこう変わります👇✨

  • 原因調査が速くなる(どの処理まで進んだか一目)🔍
  • 再現しない不具合も追える(環境・入力値・分岐を記録)🧪
  • 運用・自動化が安定する(夜間バッチの監視がラク)🌙
  • 「説明できる」状態になる(報告・引き継ぎがスムーズ)📣

🧱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です👇✨

  1. basicConfig()INFOログを出す📘
  2. フォーマットを整えて 調査しやすくする🕵️‍♂️
  3. 保存先フォルダを作り 自動化で落ちないようにする📂
  4. ローテーションで ディスク事故を防ぐ🔁

ログがあるだけで、トラブル対応も改善も“現実的なスピード”になります🏃‍♂️💨
あなたの自動化が、より安心して回り続けますように🌙✨


❓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() を使うと スタックトレース込みで残せます🧩🔥 原因調査が一気にラクになります⏱️✨

あざらし

はじめまして、あざらしです。 フリーターからエンジニア会社へ就職し、 現在はフリーランスのシステムエンジニアとして働いています。 本業のエンジニア業のかたわら、 ✍️ ブログ運営 と「収入の柱を増やす挑戦」を少しずつ続けています。 フリーター時代から比べると、 段階的に収入が増えていくのを実感できるのが素直にうれしい今日この頃。 このブログでは、日々の気づき・体験談 IT・ガジェット・ゲーム系の話 「調べて分かったこと」を噛み砕いた解説 などを中心に、ジャンルに縛られない雑記ブログとして発信しています。 「自分と同じように悩んでいる人のヒントになればいいな」 そんな気持ちで更新中です。 👉 プロフィール詳細は、名前「あざらし」をクリックしてください