読み込み中...

Pythonでログ出力の基礎から応用まで!10の詳細な使い方とサンプルコード

Pythonでのログ出力を学ぶコンピュータのスクリーンショット Python
この記事は約14分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミング言語Pythonを使用したログ出力について解説します。

Pythonにおけるログ出力の基礎から応用まで、初心者から中級者の方々まで理解できるよう、詳細な説明とサンプルコードを通じて一緒に学んでいきましょう。

●Pythonのログ出力とは

Pythonにおけるログ出力とは、プログラムの実行中に何が起こったのかを記録するための一連の操作です。

これはプログラムのデバッグやエラー解析に役立ちます。

Pythonでは標準ライブラリの一つであるloggingモジュールを使用することで、ログ出力を行うことができます。

●Pythonでログ出力を行う基本的な方法

Pythonのログ出力を行う最も基本的な方法は、loggingモジュールのbasicConfigメソッドとgetLoggerメソッドを使うことです。

○サンプルコード1:基本的なログ出力

Pythonで最も単純な形のログ出力を行うコードを紹介します。

この例では、loggingモジュールをインポートし、basicConfigメソッドを使用してログ出力の設定を行い、最後にgetLoggerメソッドでロガーオブジェクトを取得してログを出力しています。

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()

logger.info('ログ出力テスト')

上記のコードを実行すると、コンソールにログ出力テストというメッセージが表示されます。

●ログ出力のレベル設定とその方法

ログの重要度に応じて、5つのログレベルが設定できます。

それぞれDEBUG, INFO, WARNING, ERROR, CRITICALとなります。

ログレベルを設定することで、そのレベル以上の重要度を持つログのみが出力されるようになります。

○サンプルコード2:ログレベルの設定

ログレベルを設定する方法について、サンプルコードで説明します。

この例では、ログレベルをWARNINGに設定し、それぞれのレベルでログを出力しています。

import logging

logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger()

logger.debug('DEBUGレベルのログ')
logger.info('INFOレベルのログ')
logger.warning('WARNINGレベルのログ')
logger.error('ERRORレベルのログ')
logger.critical('CRITICALレベルのログ')

上記のコードを実行すると、WARNINGレベルのログERRORレベルのログCRITICALレベルのログのみがコンソールに出力されます。

DEBUGとINFOレベルのログは、設定したレベル(WARNING)より低いため出力されません。

●Pythonでのファイルへのログ出力方法

ログの情報をコンソールではなく、ファイルに出力したい場合も多々あります。

例えば、長期間のデータ分析や、システムがエラーで落ちた場合など、過去のログを追いたい時に有効です。

Pythonのログ出力では、これも簡単に設定できます。その手法を今から紹介します。

○サンプルコード3:ファイルへのログ出力

下記のコードでは、Pythonを用いてログをファイルに出力する方法を紹介します。

この例では「logging」モジュールの「basicConfig」関数を使い、引数に「filename=’example.log’」と指定することで、ログメッセージが’example.log’という名前のファイルに出力されます。

import logging

logging.basicConfig(filename='example.log', level=logging.INFO)

logging.info('このメッセージはexample.logに出力されます')

このコードを実行すると、’example.log’という名前のファイルが作成され、その中にログメッセージが出力されます。

もし既に’example.log’というファイルが存在していた場合は、新たに書き込まれるメッセージが追記されます。

ここで注意するべき点は、同じ名前のファイルが存在した場合、そのファイルの内容を削除せずにログメッセージが追記されるという点です。

必要に応じてファイルの内容を削除するか、あるいは異なるファイル名を指定するようにしましょう。

また、ファイルに出力する際にはログレベルを指定することが可能です。

先程のコードでは「level=logging.INFO」と設定しましたので、INFOレベル以上のログが出力されます。

次に進む前に、ファイル出力されたログを確認してみましょう。

Pythonに組み込まれている「open」関数を使い、’example.log’ファイルを読み込みます。

with open('example.log', 'r') as f:
    print(f.read())

これを実行すると、「このメッセージはexample.logに出力されます」というログが’example.log’ファイルに出力されていることが確認できます。

●ログメッセージのカスタマイズ方法

ログメッセージを出力する際には、単に文字列を出力するだけでなく、ログ出力の時間、ログのレベル、ソースコードの行数など、様々な情報を一緒に出力することができます。

このようなログメッセージのカスタマイズは、エラー発生時の原因調査や、システムの動作確認に非常に役立ちます。

○サンプルコード4:ログメッセージのカスタマイズ

下記のコードでは、ログメッセージの出力形式をカスタマイズする方法を紹介します。

この例では、ログ出力の時間、ログレベル、メッセージ、ソースコードの行数を出力する設定を行います。

import logging

logging.basicConfig(
    format='%(asctime)s [%(levelname)s] %(message)s (at %(lineno)d)', 
    datefmt='%Y-%m-%d %H:%M:%S', 
    level=logging.INFO
)

logging.info('カスタマイズしたログメッセージです')

このコードでは「basicConfig」関数の「format」引数にてログメッセージのフォーマットを設定し、「datefmt」引数にて日時のフォーマットを設定しています。

「asctime」はログ出力時間、「levelname」はログレベル、「message」はログメッセージ、「lineno」はソースコードの行数を表します。

このコードを実行すると、次のような出力が得られます。

2023-07-15 12:34:56 [INFO] カスタマイズしたログメッセージです (at 8)

以上のように、Pythonのログ出力ではログメッセージの出力形式を自由にカスタマイズすることが可能です。

ログ出力の形式を工夫することで、ログから得られる情報量を増やすことができます。

●複数のログハンドラーの設定方法

ログ出力は、コンソールとファイルへの出力の2つを同時に行いたいことがあります。

例えば、運用中のシステムではエラーログだけをファイルに残しつつ、デバッグログはコンソールに出力する、などの使い分けが可能です。

そのような場合には、「ハンドラー」という概念を使います。

ハンドラーは、ログメッセージをどのように処理するかを決める部分で、1つのロガーに複数のハンドラーを設定することが可能です。

○サンプルコード5:複数のログハンドラー設定

下記のコードでは、Pythonのログ出力における複数のログハンドラーの設定方法を紹介します。

この例では、1つのログメッセージをコンソールとファイルの2つに同時に出力する設定を行います。

import logging

# ロガーの作成
logger = logging.getLogger('example_logger')
logger.setLevel(logging.INFO)

# コンソールへのハンドラー設定
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

# ファイルへのハンドラー設定
fh = logging.FileHandler('example.log')
fh.setLevel(logging.ERROR)

# ハンドラーをロガーに追加
logger.addHandler(ch)
logger.addHandler(fh)

# ログ出力
logger.info('コンソールとファイルに出力されます')
logger.error('コンソールとファイルに出力されますが、ファイルにはエラーログだけが出力されます')

このコードを実行すると、’INFO’レベルのログはコンソールに出力され、’ERROR’レベルのログはコンソールとファイルの両方に出力されます。

これは、「StreamHandler」が’INFO’レベル以上のログをコンソールに出力し、「FileHandler」が’ERROR’レベル以上のログをファイルに出力する設定になっているからです。

このように、Pythonのログ出力では、複数のハンドラーを設定することで、1つのログメッセージを複数の出力先に送ることが可能です。

ハンドラーの設定を工夫することで、ログ出力の使い分けができます。

●ログ出力におけるエラー対策

ログ出力はシステム運用において非常に重要な機能ですが、それ自体が原因でエラーが発生することは避けたいですね。

例えば、ログを出力するファイルが開けなかったり、ディスク容量が足りなくなったりした場合にはどうすればよいのでしょうか。

そのようなエラーを捕捉し、対策するためには例外処理を行うことが重要です。

○サンプルコード6:ログ出力でのエラーハンドリング

下記のコードでは、Pythonのログ出力におけるエラーハンドリングの例を紹介します。

この例では、ログ出力時に発生可能なエラーを捕捉し、そのエラー情報をコンソールに出力します。

import logging

try:
    logging.basicConfig(filename='/path/that/does/not/exist.log', level=logging.INFO)
    logging.info('このログは出力されません')
except Exception as e:
    print(f'ログ出力に失敗しました: {e}')

このコードを実行すると、存在しないパスにファイルを作成しようとしてエラーが発生します。

このエラーは「try/except」ブロックによって捕捉され、エラーメッセージがコンソールに出力されます。

●ログ出力の応用例

Pythonでのログ出力はプログラム開発や運用の際に重要な要素となります。

プログラムがどのように動作しているか、何が問題であるかを明らかにするのに役立ちます。

この記事では、Pythonでのログ出力の基本的な方法から、より応用的な使用法、そしてエラー対策までを10の具体的なサンプルコードを交えて詳細に解説します。

○サンプルコード7:Webアプリケーションでのログ出力

Webアプリケーションでは、HTTPリクエストやレスポンスの情報をログに出力することで、問題の診断やパフォーマンスの改善に役立てることができます。

下記のコードは、PythonのWebフレームワークであるFlaskを使ったWebアプリケーションでのログ出力の例を紹介しています。

この例では、HTTPリクエストのメソッドとパスをログに出力しています。

from flask import Flask, request
import logging

app = Flask(__name__)
logging.basicConfig(filename='webapp.log', level=logging.INFO)

@app.route('/')
def home():
    logging.info(f'Request method: {request.method}, path: {request.path}')
    return 'Hello, World!'

if __name__ == "__main__":
    app.run()

このコードが実行されると、クライアントからの各HTTPリクエストに対して、リクエストのメソッドとパスがログファイル(’webapp.log’)に出力されます。

これにより、Webアプリケーションがどのようにアクセスされているのかを詳細に追跡することが可能となります。

○サンプルコード8:デバッグログの出力

プログラムの挙動を理解したい場合や問題を解析する際には、デバッグログを出力することが役立ちます。

下記のコードは、デバッグレベルのログを出力する例を紹介しています。

import logging

logging.basicConfig(filename='debug.log', level=logging.DEBUG)

logging.debug('デバッグログを出力します')

# 何かの計算
x = 10
y = 2
logging.debug(f'x = {x}, y = {y}, x + y = {x + y}')

このコードを実行すると、’DEBUG’レベルのログが’debug.log’に出力されます。

デバッグログは、プログラムの動きを細かく追いたいときに役立ちます。

ここでは、変数の値や計算結果をログに出力することで、プログラムの状態を詳細に追跡しています。

○サンプルコード9:クラスを用いたログ出力

Pythonのクラス内でログ出力を行う方法もあります。

この手法は、特定のクラスの挙動を追跡するのに役立ちます。

下記のコードは、クラス内でのログ出力の例を紹介しています。

この例では、’SampleClass’のインスタンス化とメソッドの実行をログに出力しています。

import logging

logging.basicConfig(filename='class.log', level=logging.INFO)

class SampleClass:
    def __init__(self):
        logging.info('SampleClassがインスタンス化されました')

    def sample_method(self):
        logging.info('sample_methodが実行されました')

# クラスのインスタンス化とメソッドの実行
s = SampleClass()
s.sample_method()

このコードを実行すると、’SampleClass’のインスタンス化と’sample_method’の実行が’class.log’に出力されます。

これにより、クラスの利用状況を追跡することが可能となります。

○サンプルコード10:ログローテーションの設定

ログローテーションは、ログファイルが一定のサイズや期間を超えた場合に新しいファイルに切り替える機能です。

これにより、ログファイルが無制御に大きくなるのを防ぎ、古いログを適切に保管することができます。

下記のコードは、ログローテーションの設定の例を紹介しています。

この例では、ログファイルが10KBを超えると新しいファイルに切り替わるように設定しています。

import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('rotation_logger')
logger.setLevel(logging.INFO)

handler = RotatingFileHandler('rotation.log', maxBytes=10000, backupCount=3)
logger.addHandler(handler)

for i in range(1000):
    logger.info(f'これは {i}回目のログ出力です')

このコードを実行すると、’rotation.log’が10KBを超えると新しいログファイルに切り替わります。

‘backupCount’の設定により、古いログファイルは最新の3つだけが保存され、それ以前のものは自動的に削除されます。

これにより、ログの管理が容易になります。

●ログ出力の際の注意点と対策

ログ出力は非常に有用なツールですが、それを使う際にはいくつかの注意点があります。

まず、機密情報をログに出力しないように注意することが重要です。

ログファイルは誰でもアクセスできる可能性があるため、パスワードや秘密キーなどの情報が含まれている場合、それらが不適切に露出するリスクがあります。

また、ログ出力の量も考慮する必要があります。

適切なログレベルを設定し、必要な情報だけをログに出力することが推奨されます。

例えば、運用環境では’ERROR’や’WARNING’レベルのログを主に出力し、’DEBUG’レベルのログは開発環境やトラブルシューティング時にのみ出力するといった運用が考えられます。

さらに、ログのローテーションを適切に設定して、ログファイルが無制御に大きくなるのを防ぐことも重要です。

ログファイルが大きくなると、ディスクスペースを大量に消費するだけでなく、ログファイルの読み込みや検索が遅くなるという問題も生じます。

まとめ

Pythonでのログ出力は、プログラムの動作を理解し、問題を解析するための強力なツールです。

この記事では、基本的なログ出力の方法から応用的な方法、エラー対策まで、10のサンプルコードを通じて詳しく解説しました。

これらの知識を活用して、より効果的なログ出力を行ってください。