- Loggingを使ったログの出力方法
今回は、Pythonでログ出力をする一般的な方法であるLoggingパッケージの使い方を解説します。
公式サイトのチュートリアルに則った内容となります。
Loggingの使い方
早速ですが、Pythonでコンソールにログ出力する簡単なコード例が以下となります。
import logging
# 1. ロガーの作成
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO) # 出力レベルを設定
# 2. ハンドラーを作成する
ch = logging.StreamHandler()
ch.setLevel(logging.INFO) # 出力レベルを設定
# 3. フォーマッタを作成する
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4. ハンドラーにフォーマッターを設定する
ch.setFormatter(formatter)
# 5. ロガーにハンドラーを追加する
logger.addHandler(ch)
# ロガーのテスト
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
このコードを実行するとINFO以上のレベルのメッセージが表示されることが確認できます。
Loggingパッケージでログ出力するためには、以下の5つの工程が必要になります。
- ステップ1ロガーの作成
- ステップ2ハンドラーの作成
- ステップ3フォーマッタの作成
- ステップ4ハンドラーにフォーマッターを設定
- ステップ5ロガーにハンドラーを追加
ステップ1 : ロガーの作成
ログ出力をするためにまず、ロガーオブジェクトを作成します。
ロガーオブジェクトでは、ログメッセージの記録や、ログレベルに応じたフィルタリングなどを行います。
ステップ2 : ハンドラーの作成
ハンドラーでは、ログの出力先を振り分ける役割を担っています。
コンソールへの出力、ファイルへの出力、通信で他のサーバへ送信といったような様々な処理の実行が可能です。
ここでは利用しやすい便利なハンドラーの一覧を掲載しておきます。
詳細については公式サイトを確認してください。
ハンドラー | 概要 |
StreamHandler | 標準出力にメッセージを送ります。 |
FileHandler | ファイルにメッセージを出力します。 |
RotatingFileHandler | ファイルにメッセージを出力します。 (ログファイル数でログローテーションを実施) |
TimedRotatingFileHandler | ファイルにメッセージを出力します。 (時間単位でログローテーションを実施) |
SocketHandler | TCP/IP ソケットにメッセージを送ります。 |
DatagramHandler | UDP ソケットにメッセージを送ります。 |
SMTPHandler | メッセージを指示された email アドレスに送ります。 |
SysLogHandler | メッセージをリモートマシンのUnix syslog daemon に送ります。 |
NTEventLogHandler | メッセージを Windows NT/2000/XP イベントログに送ります。 |
MemoryHandler | メッセージをメモリ中のバッファに送ります。 |
HTTPHandler | メッセージを GET または POSTを使ってHTTP サーバに送ります。 |
WatchedFileHandler | 出力先のファイルを監視し、ファイルの変更が検知された場合、別のファイルを作成して出力します。 |
QueueHandler | キューにメッセージを送ります。 |
NullHandler | エラーメッセージに対して何もしません。 |
ステップ3 : フォーマッタの作成
フォーマッタではログメッセージの形式を定義します。
時刻-メッセージの深刻度-メッセージの内容のような形式を設定する事ができます。
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
ここではフォーマットの一覧を掲載しておきます。
詳細については公式サイトを確認してください。
フォーマット | 概要 |
%(asctime)s | LogRecord が生成された時刻を人間が読める書式で表したもの (デフォルトでは “2003-07-08 16:49:45,896” 形式) |
%(created)f | LogRecord が生成された時刻 (time.time() によって返される形式) |
%(filename)s | pathname のファイル名部分 |
%(funcName)s | ロギングの呼び出しを含む関数の名前 |
%(levelname)s | ロギングレベル (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) |
%(levelno)s | ロギングレベル(数値) |
%(lineno)d | ロギングの呼び出しが発せられたソース行番号 |
%(message)s | ログメッセージ |
%(module)s | モジュール名 |
%(msecs)d | LogRecord が生成された時刻(ミリ秒) |
%(name)s | ロギングに使われたロガーの名前 |
%(pathname)s | 呼び出したファイルのパス名 |
%(process)d | プロセスID |
%(processName)s | プロセス名 |
%(relativeCreated)d | logging モジュールが読み込まれた時刻に対する、LogRecord が生成された時刻(ミリ秒) |
%(thread)d | スレッドID |
%(threadName)s | スレッド名 |
ステップ4 : ハンドラーにフォーマッタを設定
作成したフォーマッタをハンドラーに紐づけます。
ハンドラー単位で別のフォーマットを使用することができます。
ステップ5 : ロガーにハンドラーを追加
ハンドラーをロガーに紐づけます。
1つのロガーに複数のハンドラーを使用することも可能です。
以下の例では、ロガーの出力を2つ(標準出力とファイル出力)にしています。
from logging import getLogger
import logging
# 1. ロガーを取得する
logger = getLogger(__name__)
logger.setLevel(logging.INFO) # 出力レベルを設定
# 2. ハンドラーを作成する
ch = logging.StreamHandler() #ハンドラー1
ch.setLevel(logging.INFO) # 出力レベルを設定
fh = logging.FileHandler('sample.log') #ハンドラー2
fh.setLevel(logging.DEBUG) # 出力レベルを設定
# 3. フォーマッタを作成する
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4. ハンドラーにフォーマッターを設定する
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# 5. ロガーにハンドラーを追加する
logger.addHandler(ch)
logger.addHandler(fh)
まとめ
Pythonでログ出力をする一般的な方法であるLoggingパッケージの使い方を解説しました。
Loggingパッケージでログ出力するためには、以下の5つの工程で実施可能です。
ログを出力することで、プログラムの不具合を見つけやすくなるのでぜひ使ってみてください。
参考文献
![](https://nisshingeppo.com/ai/wp-content/uploads/cocoon-resources/blog-card-cache/7e4cc0908f936cfb2b872eb74d609699.png)
コメント