はじめに
Python でコーディングを行うとき、logging の機能を使ってログを出力するととても便利です。Python 3.xx であれば、既定で備わっている機能なので、モジュールの追加インストールなども必要ありません。
同機能の詳細な動きは、以下のサイトを参考にさせていただきました。
ただ、詳細なアーキテクチャを理解していなくても、基本的なログ出力機能を実装することはさほど難しくありません。
簡単な実装例とともに、私が理解している範囲で、ログ出力の機能を説明します。
ログレベル
ログレベルとしては、Debug から Critical までの5段階が準備されています。
Info レベル以上をログ出力し、Error が出力される場合に、具体的な対処につなげるような実装が一般的なようです。
レベル | 説明 |
---|---|
Debug | 詳細なシステムの動きを診断 |
Info | 想定通りに動作し |
Warning | 想定通りに動作していない場合や、将来的に問題につながる可能性 |
Error | 問題が発生しており、対処が必要 |
Critical | 深刻な問題が発生しており、プログラムが動作を継続不可能 |
実装
具体的な実装例を通じて、処理の流れを説明します。
基本設定
logging_format = '%(name)s:%(asctime)s:%(levelname)s:%(message)s'
logging.basicConfig(filename='/home/testuser/test.log', filemode = 'a', level=logging.INFO, format=logging_format)
logger = logging.getLogger('計算')
logging_format でログの書式を設定します。設定値は以下の通りです。
設定 | 説明 |
---|---|
%(name)s | logger で指定するロガーオブジェクト名 |
%(asctime)s | ログを出力する日時 |
%(levelname)s | Info、Error などのログレベル |
%(message)s | 任意で指定するメッセージ |
logging.basicConfig でログファイルや書式などを指定します。filemode=’w’ を指定するとログファイル上書き、filemode=’a’を指定すると既存ログファイルに追加です。
logger の中でログを出力する処理名を指定します。
ログ出力
実際にログを出力する箇所に、条件に応じた出力を指定します。
try:
new_value = value1 / value2
logger.info("正常に処理完了")
except Exception as e:
logging.exception("例外発生")
exit()
上記の例では、new_value が正常に算出されると、以下のようなログが出力されます。
計算:2024-08-06 14:49:38,800:INFO:正常に処理完了
一方で、new_value が算出できない場合は、エラーログが出力されます。下記は意図的にvalue2=0
を指定して ZeroDivisionError を発生させた際の出力例です。
root:2024-08-06 14:49:25,321:ERROR:例外発生
Traceback (most recent call last):
File "/home/testuser/test.py", line 12, in <module>
new_value = value1 / value2
~~~~~~~^~~~~~~~
ZeroDivisionError: division by zero
最後に
Yellowfin で参照するデータは正確なものである必要があります。
そのためには、詳細にログを出力し、問題がある場合は迅速な対応が望まれます。
ということで、ログ出力に関する極めて基本的な内容をまとめてみました。
一方で、複雑な環境で運用する場合には、色々と考慮することも多いようです。
私も他の方の記事などを参考に、継続して学んでいこうと思います。
では皆様、良いデータ分析を!