こんにちはフロントエンドエンジニアのまさにょんです!
今回は、Pythonのlogging・loggerの使い方・ログ出力設定の方法についてまとめて解説します。
目次
Pythonのloggingモジュールを使用したloggerの使い方・ログ出力設定の方法
実行中のアプリでは、ログ出力によって、アプリケーションの動作状況(ログ情報)を確認することができます。
Pythonでのログ出力には、Pythonの標準ライブラリであるlogging
モジュールを使用します。
Pythonのlogging
は、アプリケーションの実行中に発生するイベントを記録するための機能を提供します。
今回は、Pythonのloggingの設定手順とフローについてまとめてみていきます。
ログ・レベルとは何か?
Pythonでは、ログの重要度に応じて、DEBUG, INFO, WARNING, ERROR, CRITICAL の5つのログ・レベルが定義されています。
次の表は、Python のログレベルの意味を示したものです。
レベル | 意味 |
---|---|
CRITICAL | システムが停止するほどの重大なエラーが発生した場合に使用されます。 |
ERROR | エラーが発生し、処理が続行できない場合に使用されます。 |
WARNING | 問題が発生したが、処理は続行可能な場合に使用されます。 |
INFO | 処理の進行状況やステータス情報を記録する場合に使用されます。 |
DEBUG | デバッグ用の情報を記録する場合に使用されます。 |
上記の表を見ると、ログの重要度が高い順にレベルが並んでいることがわかります。
ログレベルの適切な設定により、必要な情報だけを記録し、不要な情報は記録しないようにできます。
モジュールによって、ログ出力の際には、指定したログレベル以上の情報が出力されるようになっているため、
ログレベルを設定することで、出力されるログ情報を制御することができます。
つまり、WARNINGレベルが設定されている場合には、WARNING, ERROR, CRITICAL レベルのログ情報だけが出力されるようになります。
Pythonのloggingモジュールの基本的な使用手順・フローは、次のとおりです。
- ログ・レベルを設定する
- loggerインスタンスを作成する
- loggerインスタンスをカスタマイズして、ログの出力に関する設定をカスタムする。
- logger を使用して、ログ出力をする。
それでは、実際にPythonのloggingモジュールを使用したloggerの使い方・ログ出力設定の手順をSampleCodeで確認していきます。
# [ Pythonのlogging の手順 ]
# 1. loggingモジュールをインポートする
import logging
# 2. ログレベルを設定する
# => LogLevel には、DEBUG, INFO, WARNING, ERROR, CRITICAL の5つがあります。
# 今回は、WARNING レベルを設定
# => DEBUG, INFO, レベルのログ情報は、出力されない!
logging.basicConfig(level=logging.WARNING)
# 3. logging.getLogger('logger名') で、loggerインスタンスを作成する
# 引数に文字列を入れることでログの出力名を設定できます
logger = logging.getLogger('log_test.py')
# 4. ログフォーマットを設定する
# 実行時間(年-月-日 時-分-秒,ミリ秒): ファイル名: 行番号 : ログレベル名 : メッセージ文字列
formatter = logging.Formatter('%(asctime)s: %(filename)s: %(lineno)d: %(levelname)s: %(message)s')
# 5. ログ出力先を設定する。
## 5-1. ファイルに、ログを出力する場合
## FileHandlerのインスタンスを作成する => FormatをSetする => loggerにHandlerを追加する
file_handler = logging.FileHandler('./logs/test.log', encoding='utf-8')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
## 5-2. 標準出力に出力する場合
## StreamHandlerのインスタンスを作成する => FormatをSetする => loggerにHandlerを追加する
# sh = logging.StreamHandler()
# sh.setFormatter(formatter)
# logger.addHandler(sh)
# 6. ログを出力する。
print('---------------------------------------------------')
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
print('---------------------------------------------------')
上記のSampleCodeでは、ログフォーマットと、ファイルにログを出力する設定と、標準出力の設定をカスタムしていることがわかります。
test.log に対するファイル出力の結果
test.log に対するファイル出力の結果は、次のとおりです。
WARNINGレベル以上のフォーマットされたログ情報が記述されています。
2023-04-23 22:19:12,318: log_test.py: 38: WARNING: warning message
2023-04-23 22:19:12,319: log_test.py: 39: ERROR: error message
2023-04-23 22:19:12,319: log_test.py: 40: CRITICAL: critical message
標準出力・コンソール画面
こちらはlogging.StreamHandler()
を有効化していない、通常のコンソールに対する標準出力の内容です。
WARNINGレベル以上のDefaultのログ情報が出力されています。
python log_test.py
---------------------------------------------------
WARNING:log_test.py:warning message
ERROR:log_test.py:error message
CRITICAL:log_test.py:critical message
---------------------------------------------------
標準出力・コンソール画面 (logging.StreamHandler() を有効化)
logging.StreamHandler()
を有効化すると、コンソールに対する標準出力にフォーマットされた情報が追加されていることがわかります。
WARNINGレベル以上のDefaultのログ情報と、フォーマットされたログ情報が記述されています。
python log_test.py
---------------------------------------------------
2023-04-23 22:18:39,032: log_test.py: 38: WARNING: warning message
WARNING:log_test.py:warning message
2023-04-23 22:18:39,032: log_test.py: 39: ERROR: error message
ERROR:log_test.py:error message
2023-04-23 22:18:39,032: log_test.py: 40: CRITICAL: critical message
CRITICAL:log_test.py:critical message
---------------------------------------------------
ログ・ローテーションを実現するHandlerを活用する
Pythonのlogging
モジュールには、ログファイルのローテーションを実現するTimedRotatingFileHandler
があります。
このハンドラを使用することで、指定した時間・日付などの時間間隔ごとにログファイルをローテーションさせることができます。
次のSampleCodeで確認していきます。
import logging
# 1. TimedRotatingFileHandler モジュールをインポートする
from logging.handlers import TimedRotatingFileHandler
logging.basicConfig(level=logging.WARNING)
logger = logging.getLogger('log_test.py')
# ログフォーマットを設定する
# 実行時間(年-月-日 時-分-秒,ミリ秒): ファイル名: 行番号 : ログレベル名 : メッセージ文字列
formatter = logging.Formatter(
'%(asctime)s: %(filename)s: %(lineno)d: %(levelname)s: %(message)s'
)
# 2. TimedRotatingFileHandler => ファイルに対するログ出力をローテーションできる
# ログファイルのローテート設定(Ver.日時)
# 2-1. 1日ごとにログファイルがローテーションされ、バックアップファイルは20ファイル(20日分)まで保存されます。
day_rotaite_handler = TimedRotatingFileHandler(
filename='./logs/day.log',
when='D',
interval=1,
backupCount=20,
encoding='utf-8'
)
# 2-2. 作成されるログファイル名には、ローテーション時に年月日が付加されます
day_rotaite_handler.suffix = "%Y%m%d"
day_rotaite_handler.setFormatter(formatter)
logger.addHandler(day_rotaite_handler)
# 標準出力に出力する
sh = logging.StreamHandler()
sh.setFormatter(formatter)
logger.addHandler(sh)
print('---------------------------------------------------')
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
print('---------------------------------------------------')
TimedRotatingFileHandler
の引数は次のとおりです。
- filename: ログファイルの名前
- when: ローテーションの単位。’S’, ‘M’, ‘H’, ‘D’, ‘midnight’ のいずれかを指定可能。
- interval: ローテーションの間隔。
- backupCount: 保存するバックアップファイルの数。
- encoding: ログ・ファイルの文字エンコーディング
また、上記のSampleCodeでは、suffix="%Y%m%d"
としているため、ログファイル名には年月日が付加されます。
Twitterやってます!Follow Me!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!