はじめに
本記事では、AWS Lambda で logging モジュールを使ったログ出力と、S3バケットへのログファイルアップロードを実施してみます。
環境
python : 3.12
前提
- S3 バケット(ログを保存する先)
- IAMポリシー設定(Lambda 関数が S3 にアクセスするためのの付与)
Lambda関数
ログの設定周りを行います。
それぞれ作成したハンドラに対して出力するログレベルを設定します。ログのフォーマットを設定して、時刻、関数名、ログレベル、メッセージを含むようにします。
utils.py
import logging
def setup_logger(LOG_FILE):
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# ハンドラの作成
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(LOG_FILE)
# ログレベルの設定
stream_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.WARNING)
# フォーマットの設定
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# ハンドラをロガーに追加
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
debug~errorまでのログレベルでメッセージを出力してみます。
生成されたログファイルは指定されたS3バケットにアップロードします。
lambda_function.py
import logging
import boto3
import os
from utils import setup_logger
# ログファイル名とS3バケット名
LOG_FILE = os.environ['LOG_FILE']
S3_BUCKET = os.environ['S3_BUCKET']
# ロガーの設定を初期化
setup_logger(LOG_FILE)
# S3クライアントの作成
s3_client = boto3.client('s3')
def lambda_handler(event, context):
logging.debug("DEBUGレベルのログ")
logging.info("INFOレベルのログ")
logging.warning("WARNINGレベルのログ")
logging.error("ERRORレベルのログ")
# ログファイルをS3にアップロード
try:
s3_client.upload_file(LOG_FILE, S3_BUCKET, os.path.basename(LOG_FILE))
logging.info("ログファイルがS3にアップロードされました")
except Exception as e:
logging.error("ログファイルのアップロード中にエラーが発生しました: %s", e)
return {
'statusCode': 200,
'body': 'ログが出力されました'
}
動かしてみる
Lambdaをテスト実行させてみて、CloudWatchのログに各レベルのログが出力されている事、S3バケットにログファイルが生成される事を確認できました。
S3バケット
メモ:CWでのログ表示における改行文字の挙動と対処法
次のように \n
を含む文字をprintで出力すると、CloudWatchで確認した際にそれぞれログが分かれてします。
~~~
hoge = '''
aaaa\n
bbb\n
cc\n
'''
print("hoge", hoge)
~~~
このような場合もloggingで出力する事で、1つにまとまります。
logging.debug(hoge)
参考