📜

[logging] pythonログレベルをlambdaに設定する

2024/07/26に公開

python の logging を使用して lambda のログレベルを制御する方法を備忘録として残します。

では、初めて行きます。

pythonのログについて

pythonではプログラムのデバッグや実行状況の把握を行う際、以下の2つがよく使用されます。

  • print
  • logging

学習したての頃は恐らく、print を使用して、ログを出していたことが多いのではないでしょうか。

一見すると、print でログが見れるなら、logging は不要そうに見えます。

しかし、この2つには大きな違いがいくつもあり、
より柔軟で強力な logging を使用することで、プログラムの柔軟性が高まります。

以下は print と logging の違いについてです。

print logging
出力先の柔軟性 標準出力にのみメッセージを表示 コンソール、ファイル、ネットワーク、その他の様々な出力先にログを送ることが可能
ログレベルの管理 重要度や種類を区別する仕組みがない DEBUG、INFO、WARNING、ERROR、CRITICALなどの異なるログレベルをサポートしており、重要度に応じたログ管理が可能
フォーマットのカスタマイズ シンプルな文字列 タイムスタンプ、ログレベル、メッセージなどを含む詳細なフォーマットをカスタマイズ可能
パフォーマンスの考慮 直接標準出力に書き込むため、出力が多いとパフォーマンスに影響を及ぼす可能性がある 非同期にログを処理できるため、パフォーマンスに対する影響を軽減が可能
拡張性とメンテナンス性 小規模は良くても、大規模なアプリケーションには不向き 大規模なアプリケーションにおけるログ管理を容易にすることが可能

以上を見ても、logging を使用するメリットが多いことがわかります。

参照:Logging HOWTO

lambdaのログレベルについて

では、ログレベルをコード内で指定して、lambda を実行後、ログを確認してみましょう。

example.py
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 のログレベルを制御します。

具体的なコードは以下です。

example.py
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エンジニアブログ

Discussion