PythonでのAWS Lambda共通ログ出力Util

実装方法

以下に、Python で AWS Lambda 内で共通的に使用されるログ出力のためのユーティリティクラスの例を示します。このクラスを使用すると、Lambda 関数のログを簡単に出力することができます。

import logging
import sys
from datetime import datetime
from pytz import timezone

LOG_LEVEL = 'INFO'

class LogUtils:

    def __init__(self):
        self._logger = logging.getLogger(__name__)
        self._logger.setLevel(LOG_LEVEL)
         self._logger.propagate = False
        for h in  self._logger.handlers:
             self._logger.removeHandler(h)
        h = logging.StreamHandler(sys.stdout)
        # ロガーのフォーマット指定
        FORMAT = '%(asctime)s.%(msecs)-3d [%(request_id)s] %(levelname)s'
        datefmt = '%y/%m/%d %H:%M:%S'
        formatter = logging.Formatter(fmt=FORMAT, datefmt=datefmt)
        # ロガーの時間指定(タイムゾーンがLambda環境でもAsia/Tokyoになるようにするため)
        formatter.converter = this._customTime
        h.setFormatter(formatter)
        self._logger.addHandler(h)

    def _customTime(self, *args):
        """ログ用の時間出力
        Returns:
            現在時間(Asia/Tokyo)
        """
        return datetime.now(timezone('Asia/Tokyo')).timetuple()

    def info(self, message):
        """情報ログ出力
        Args:
            message: メッセージ
        """
        self._logger.info(f': {message}')


    def warning(self, message):
        """警告ログ出力
        Args:
            message: メッセージ
        """
        self._logger.warning(f': {message}')


    def error(self, message, ex=None):
        """エラーログ出力
        Args:
            message: メッセージ
            ex: 例外オブジェクト
        """
        if ex is not None and isinstance(ex, Exception):
            self._logger.exception(f': {message}')
        else:
           self. _logger.error(f': {message}')


    def debug(self, message):
        """ディバグログ出力
        Args:
            message: メッセージ
        """
        self._logger.debug(f': {message}')

上記の例では、LogUtils というクラスが定義されています。このクラスはログ出力の共通操作を提供します。

__init__メソッドでは、logging モジュールを使用してルートロガーを取得し、ログレベルを設定します。この例では INFO レベルに設定していますが、必要に応じて変更してください。

以下のメソッドが提供されています:

  • info: INFO レベルのログメッセージを出力します。
  • warning: WARNING レベルのログメッセージを出力します。
  • error: ERROR レベルのログメッセージを出力します。
  • exception: 例外情報を含む ERROR レベルのログメッセージを出力します。
  • debug: DEBUG レベルのログメッセージを出力します

これらのメソッドを使用するには、Lambda 関数内でインスタンスを作成し、適切なメソッドを呼び出すことができます。
例えば、以下のような使い方ができます:

def lambda_handler(event, context):
    logger = LogUtils()

    logger.info('This is an informational message')
    logger.warning('This is a warning message')
    logger.error('This is an error message')

    try:
        result = 1 / 0
    except Exception as e:
        logger.exception('An exception occurred')

上記の例では、logger インスタンスを作成し、異なるレベルのログメッセージを出力しています。また、例外が発生した場合には exception メソッドを使用して例外情報をログ出力しています。

ログは Lambda 関数の実行結果やデバッグ情報の重要な一部であるため、適切なログ出力を行うことが推奨されます。この例のログ出力方法を基にして、必要に応じてカスタマイズや追加の操作を行ってください。

参考