[logging] pythonログレベルをlambdaに設定する
python の logging を使用して lambda のログレベルを制御する方法を備忘録として残します。
では、初めて行きます。
pythonのログについて
pythonではプログラムのデバッグや実行状況の把握を行う際、以下の2つがよく使用されます。
- logging
学習したての頃は恐らく、print を使用して、ログを出していたことが多いのではないでしょうか。
一見すると、print でログが見れるなら、logging は不要そうに見えます。
しかし、この2つには大きな違いがいくつもあり、
より柔軟で強力な logging を使用することで、プログラムの柔軟性が高まります。
以下は print と logging の違いについてです。
logging | ||
---|---|---|
出力先の柔軟性 | 標準出力にのみメッセージを表示 | コンソール、ファイル、ネットワーク、その他の様々な出力先にログを送ることが可能 |
ログレベルの管理 | 重要度や種類を区別する仕組みがない | DEBUG、INFO、WARNING、ERROR、CRITICALなどの異なるログレベルをサポートしており、重要度に応じたログ管理が可能 |
フォーマットのカスタマイズ | シンプルな文字列 | タイムスタンプ、ログレベル、メッセージなどを含む詳細なフォーマットをカスタマイズ可能 |
パフォーマンスの考慮 | 直接標準出力に書き込むため、出力が多いとパフォーマンスに影響を及ぼす可能性がある | 非同期にログを処理できるため、パフォーマンスに対する影響を軽減が可能 |
拡張性とメンテナンス性 | 小規模は良くても、大規模なアプリケーションには不向き | 大規模なアプリケーションにおけるログ管理を容易にすることが可能 |
以上を見ても、logging を使用するメリットが多いことがわかります。
lambdaのログレベルについて
では、ログレベルをコード内で指定して、lambda を実行後、ログを確認してみましょう。
import logging
logger = logging.getLogger(__name__)
def handler(event, context):
# ログレベルの設定を行わない
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
# 出力結果
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message
あれ? info と debug が出力されません。
この答えは、公式にあります。
理由は、デフォルトで WARN となっているため、それ以下のログレベルしか出力しないとのことです。
ログレベルを制御
上記で述べたように、デフォルトの値を変える必要があります。
なので、setLevel を使用して、該当する lambda のログレベルを制御します。
具体的なコードは以下です。
import logging
logger = logging.getLogger(__name__)
logger.setLevel("DEBUG") 👈 DEBUGを設定したので、それ以下のログレベルが全て出力される
def handler(event, context):
# ログレベルの設定を行わない
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
# 出力結果
DEBUG:root:This is a debug message
INFO:root:This is an info message
WARNING:root:This is a warning message
ERROR:root:This is an error message
CRITICAL:root:This is a critical message
まとめ
現在は、ログレベルを直接指定してしまっておりますが、環境変数でログレベルを指定したり、
初期値を全て統一するようなこともできるので、
大規模開発になればなるほど、統一されたログ戦略を立て安くなるのではないでしょうか。
これまで、あまりログに重点を置いてこなかったので、先を見越して、考えていくべきだと感じました。
今回の記事が誰かのお役に立てれば幸いです。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion