1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

python のログの残し方 [備忘録]

1
Posted at

Pythonのloggingを使ってログを残す方法

Pythonで自動化プログラムを作っていると、途中で処理が止まったり、思ったとおりに動かなかったりすることがあります。

画面にprint()で表示するだけでも動作確認はできますが、プログラムを閉じると内容が消えてしまいます。

そこで便利なのが、Python標準ライブラリのloggingです。

loggingを使うと、次のような情報をファイルに残せます。

  • プログラムを開始した時間
  • 正常に処理できた件数
  • 処理中の商品コード
  • エラーが起きた場所
  • エラーの詳しい内容

今回は、loggingの基本的な使い方をわかりやすく説明します。

loggingを読み込む

まずは、プログラムの先頭でloggingを読み込みます。

import logging

ただし、これだけではログはファイルに保存されません。

次に、ログの保存先や表示形式を設定します。

基本的な設定

もっとも簡単なのは、logging.basicConfig()を使う方法です。

import logging

logging.basicConfig(
    filename="app.log",
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    encoding="utf-8"
)

logging.info("プログラムを開始しました")

このプログラムを実行すると、同じフォルダにapp.logというファイルが作成されます。

ログには、次のような内容が記録されます。

2026-07-18 10:20:15,123 [INFO] プログラムを開始しました

それぞれの設定には、次の意味があります。

filename="app.log"

ログを保存するファイル名です。

level=logging.INFO

どの重要度以上のログを記録するかを指定します。

format="%(asctime)s [%(levelname)s] %(message)s"

ログに記録する形式です。

  • %(asctime)s:日時
  • %(levelname)s:ログレベル
  • %(message)s:自分で指定したメッセージ
encoding="utf-8"

ログファイルの文字コードです。

日本語を記録する場合は、utf-8を指定しておくと安心です。

ログレベルの違い

loggingには、情報の重要度を表すログレベルがあります。

重要度が低い順に、次の5種類です。

DEBUG
INFO
WARNING
ERROR
CRITICAL

それぞれ、次のように使います。

logging.debug("デバッグ用の詳しい情報です")
logging.info("正常に処理しています")
logging.warning("注意が必要な状態です")
logging.error("エラーが発生しました")
logging.critical("重大なエラーが発生しました")

DEBUG

開発中の細かい確認に使います。

logging.debug("取得した商品コードは12345です")

INFO

処理の開始、終了、進捗など、通常の動作記録に使います。

logging.info("在庫確認処理を開始しました")

WARNING

処理は続けられるものの、注意が必要な場合に使います。

logging.warning("在庫数が0になっています")

ERROR

一部の処理に失敗した場合に使います。

logging.error("商品データの取得に失敗しました")

CRITICAL

プログラム全体を停止するような重大な問題に使います。

logging.critical("データベースに接続できません")

levelの設定に注意する

次のように設定した場合、

level=logging.INFO

INFO以上のログだけが記録されます。

つまり、次のDEBUGログは保存されません。

logging.debug("デバッグ情報")

DEBUGも含めてすべて記録したい場合は、次のようにします。

level=logging.DEBUG

開発中はDEBUG、本番運用ではINFOにする使い方が一般的です。

画面とファイルの両方に表示する

ログをファイルに保存しながら、ターミナル画面にも表示したい場合は、handlersを使います。

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("app.log", encoding="utf-8"),
        logging.StreamHandler()
    ]
)

logging.info("プログラムを開始しました")

この設定では、ログが次の2か所に出力されます。

  • app.log
  • ターミナル画面

プログラムの動きを画面で確認しながら、あとからログファイルも調べられるので便利です。

エラーの詳しい内容を残す

エラーが発生したときは、logging.exception()が便利です。

import logging

logging.basicConfig(
    filename="app.log",
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    encoding="utf-8"
)

try:
    result = 10 / 0

except Exception:
    logging.exception("計算処理でエラーが発生しました")

このコードでは、0で割ろうとしてエラーが発生します。

ログには、メッセージだけでなく、どの行でどんなエラーが起きたかも記録されます。

2026-07-18 10:30:00 [ERROR] 計算処理でエラーが発生しました
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero

logging.error()でもエラーメッセージは残せます。

しかし、logging.exception()を使うと、エラーの詳しい履歴であるトレースバックも残るため、原因を調べやすくなります。

そのため、exceptの中ではlogging.exception()を使うのがおすすめです。

CSV処理でログを残す例

CSVを1行ずつ処理するプログラムでは、次のようにログを入れられます。

import csv
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("zaiko.log", encoding="utf-8"),
        logging.StreamHandler()
    ]
)

logging.info("在庫確認処理を開始します")

try:
    with open("data.csv", encoding="utf-8", newline="") as file:
        reader = csv.DictReader(file)

        for row_number, row in enumerate(reader, start=2):
            try:
                product_code = row["商品コード"]

                logging.info(
                    "処理中 行番号=%s 商品コード=%s",
                    row_number,
                    product_code
                )

                # 商品ごとの処理を書く

            except Exception:
                logging.exception(
                    "商品の処理に失敗しました 行番号=%s",
                    row_number
                )

    logging.info("在庫確認処理が正常に終了しました")

except FileNotFoundError:
    logging.exception("data.csvが見つかりません")

except Exception:
    logging.exception("予期しないエラーが発生しました")

このように記録しておくと、処理が途中で止まった場合でも、最後に処理していた行番号や商品コードを確認できます。

ログに変数の値を入れる

ログには、商品コードや在庫数などの変数も記録できます。

logging.info(
    "商品コード=%s 在庫数=%s",
    product_code,
    stock
)

ログには、次のように記録されます。

商品コード=ABC001 在庫数=10

次のように、f文字列を使うこともできます。

logging.info(
    f"商品コード={product_code} 在庫数={stock}"
)

どちらでも動作しますが、loggingでは%sを使う書き方がよく使われます。

ログを追記するか、毎回消すか

ログファイルは、通常は以前の内容に追記されます。

明示的に指定する場合は、filemode="a"を使います。

logging.basicConfig(
    filename="app.log",
    filemode="a",
    level=logging.INFO,
    encoding="utf-8"
)

aは追記を意味します。

一方、プログラムを実行するたびにログを空にしたい場合は、filemode="w"を使います。

logging.basicConfig(
    filename="app.log",
    filemode="w",
    level=logging.INFO,
    encoding="utf-8"
)

wを指定すると、以前のログは消えてしまいます。

業務用プログラムでは、過去の履歴を確認できるように、基本的には追記のaがおすすめです。

最初に使いやすいテンプレート

最初は、次の形をプログラムに入れておくと使いやすいです。

import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler(
            "program.log",
            encoding="utf-8"
        ),
        logging.StreamHandler()
    ]
)

logging.info("プログラム開始")

try:
    # メイン処理を書く
    logging.info("処理が正常に完了しました")

except Exception:
    logging.exception(
        "予期しないエラーが発生しました"
    )

このテンプレートなら、ログを画面とファイルの両方に残せます。

また、エラーが起きた場合は、詳しいトレースバックも記録できます。

printとloggingの使い分け

簡単な動作確認だけなら、print()でも問題ありません。

print("処理を開始しました")

しかし、長時間動くプログラムや、自動実行するプログラムでは、loggingのほうが便利です。

loggingには、次の利点があります。

  • 日時を自動で残せる
  • ログの重要度を分けられる
  • ファイルに保存できる
  • エラーの詳しい内容を残せる
  • あとから原因を調査できる

特に、EXE化したPythonプログラムや、Ubuntuで自動起動するプログラムでは、ログが重要になります。

画面が閉じてしまっても、ログファイルを確認すれば、どこまで処理できていたかを調べられるからです。

まとめ

Pythonでログを残す基本的な流れは、次のとおりです。

import logging

まずloggingを読み込みます。

次に、logging.basicConfig()で保存先や表示形式を設定します。

logging.basicConfig(
    filename="app.log",
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    encoding="utf-8"
)

そして、処理の中で必要なログを記録します。

logging.info("処理を開始しました")
logging.warning("注意が必要です")
logging.error("エラーが発生しました")

例外が発生した場合は、logging.exception()を使います。

try:
    # 処理
    pass

except Exception:
    logging.exception("処理に失敗しました")

最初から完璧なログを作る必要はありません。

まずは、次の3つを記録するだけでも十分役に立ちます。

プログラム開始
処理完了
エラー内容

慣れてきたら、商品コード、行番号、処理件数なども追加していくと、トラブルの原因をさらに見つけやすくなります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?