背景
Lambda Powertoolsを使ってログ出力していたが、タイムゾーンがUTCになっていたのでこれをどうにかしたい、という要望が出た。
どうにかしたい、という微妙な言い回しになっているのは、
- タイムゾーンをJSTに変更する
- UTCのままでタイムゾーン情報を追加で出力する
という2パターンが選択肢として存在したため。最終的には後者で終えた。理由は後段で述べる。
Lambda Powertools の簡単な使い方
前提知識としてざっくり書いておく。以下の様にデコレータをつけると詳細なログを出してくれる。
from aws_lambda_powertools import Logger
logger = Logger()
@logger.inject_lambda_context
def handler(event, context):
logger.info("This is an information")
...
logger.error("This is an error")
出力される情報は、関数名、メモリサイズ、コールドスタートかどうか、などなど。
詳しくはドキュメント参照。
タイムゾーン情報を付加して出力する方法
前述したようにタイムゾーンはUTCのまま、タイムゾーン情報を付加する形で落ち着いた。
実装方法は、logger
の初期化部分で以下のようにするだけ。
logger = Logger(datefmt="%Y-%m-%d %H:%M:%S %z")
こうすることで、出力の形式は以下のようになる。
"2021-05-08 15:50:22 +0000"
一応タイムゾーンを変更する方法もあったのだが(後述)、内部変数をいじるような形になってしまったため今回は不採用。
とりあえず、プロジェクトに関わる人の中で合意が取れるところに落とし込んだ。
Timezoneを変更する方法
以下のようにすれば変更できる。pytzはインストール済みの想定。
from datetime import datetime
from aws_lambda_powertools import Logger
from pytz import timzeon
def custome_time(*arg):
return datetime.now(timezone("Asia/Tokyo")).timetuple()
logger = Logger()
logger._handler.formatter.converter = custome_time
前述の通り内部変数をいじる形になってしまう。
(他にいい方法あるのだろうか...?)
Lambda Powertoolsを使わない場合
単純にlogging
ライブラリを使う場合は以下のようにできる。
今回はLambda Powertoolsの詳細なログを捨ててまでタイムゾーン変更をする強い要望はなかったのでこちらの方法は採用していない。
from datetime import datetime
import logging
import pytz
def custome_time(*arg):
return datetime.now(timzeone("Asia/Tokyo")).timetuple()
logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
formatter = logging.Formatter()
formatter.converter = custome_time
handler.setFormatter(formatter)
logger.addhandler(handler)
前述したLambda Powertoolsでタイムゾーン変更はこの手順を無理矢理やっているだけ。
ちなみに環境変数TZ
をいじるという方法もあるが...
この記事によるとTZを変更するのは非推奨らしい。
参考リンク