ツール プログラミング

AWS Lambda Powertoolsで外部ファイルのログを出力する




Lambdaって、lambda_function.py以外にもファイル使うことありますよね。
そんな場合でもAWS Lambda Powertoolsを使うと簡単にログを取ってくれます。

が。

ちょっとこれどうなんだろな?
というところがあったので確認してみました。

外部ファイルに定義したクラスのログを出す

とりあえずこんな感じで書きました。

これをlambda_handler()の中でインスタンス化してログ出力を実行します。

クラス側に同じservice名を指定

ドキュメントによれば、serviceに同じ名前を付ければロガーを使いまわせると。

ということで、両方のファイルに

を書いておきました。
デコレータはlambda_function.pyにだけ付けます。

これを実行すると…

  • service
  • function_name
  • function_arn
  • function_request_id
  • xray_trace_id

に同じものが設定されています。
function_request_idがLambdaのrequest IDになるので、こいつを引き継いでくれれば流れを追えますね。
serviceは環境変数に入れておけば共通化できるし簡単。
ただ…

なんでまたUTCになってんだよ?!

前回JSTにしたじゃんか。
ChildLog.pyはともかく、なんでlambda_function.py側もUTCなのよ。。。

AWS Lambda PowertoolsのtimestampをJSTにする

最近、仕事でAWS Lambdaを使ってます。 Python書くの楽しい。 プロジェクトのメイン言語はPHPだけど、PHPは書いててストレス溜まるからもうポイしたいw ということで、Lambdaのログ ...

続きを見る

ちなみにChildLogのインスタンス化をやめたらちゃんとJSTで出ました。

クラス側にもuse_rfc3339を指定する

serviceだけ指定してもダメみたいなので、class側にもlambda_function.pyと同じようにuse_rfc3339を設定。

これだとちゃんとJSTになりました。
serviceを指定したとしてもlambda_function.py(一番最初に作成したLogger)と同じ設定が引き継がれるわけじゃないみたいです。

例外はexception()で

デコレータで処理してた例外のログ。
error()とexception()の両方で出してみましたが、errorだとTracebackが出力されませんでした。
locationはLoggerの実行行になるので、直接try/exceptionで囲んでるならともかくデコレータ経由だと発生個所の特定ができない。。。

levelはどちらの場合でもERRORが設定されますし、素直にexception()を使えばいいんじゃないかなぁと。

もう1つ階層を追加しても問題なし

ChildLogをコピーしてGrandChildLogとして新ファイルに。
ChildLog内でGrandChildLogを呼び出すようにしました。

特に問題なさそうです。

Logger(child=True)じゃダメなの?

もう1つ、child=Trueというパラメータを使う方法があります。
ドキュメントによれば

Tip: Prefer Logger Reuse feature over inheritance unless strictly necessary, see caveats.
(ヒント 厳密に必要でない限り、継承よりもロガー再利用機能を優先してください(注意事項を参照)。)

Inheriting Loggers

とあり、推奨はされていないみたいですが。

途中から標準モジュールのloggingになった?

すべてで以下を設定している場合は

こう。
3つのファイルでちゃんと出てます。

ChildLogとGrandChildLogのLoggerをchild=Trueにしました。
他はそのままです。

これを実行すると…

  • ChildLogとGrandChildLogのinfo()が出なくなった
  • というか途中から標準モジュールのloggingに変わった?

という謎動作に。
なぜこうなったのかは深く調べてないですが、まぁ、

素直にservice統一でいいんじゃないか

って。
推奨もされてないしね。

ただこれで動いている記事も見かけるので、今回の実装には合わないってことですかね。

コード最終形

こんな感じ。
GrandChildLogはChildLogと中身一緒なので省略。

継承なしであればこれで問題なさそう。
ただGrandChildLogにChildLogを継承させて…としようとしたらエラー出たので確認中。

自分の実装が間違ってるだけならいいんだけどなー。
Logクラス作りたいってなってもうまく動くんだろうか…。

関連記事

AWS Lambda PowertoolsのtimestampをJSTにする

最近、仕事でAWS Lambdaを使ってます。 Python書くの楽しい。 プロジェクトのメイン言語はPHPだけど、PHPは書いててストレス溜まるからもうポイしたいw ということで、Lambdaのログ ...

続きを見る

AWS Lambda Powertools Loggerのlocationをformatする

こいつをやってて。 locationってformatできないのかなぁ。 毎回Messageにクラス名やら関数名やら書くのは面倒だぞ。。。 と思っていたらできました。 ドキュメントには(たぶん)書いてな ...

続きを見る

-ツール, プログラミング
-, ,

© 2024 そんなこと猫でもできる Powered by AFFINGER5