はじめに
AWSマネジメントコンソールでAWS Lambdaのログを確認するのは面倒だ。
そう思ってググったんだが、当時、それっぽいことをやってる事例を見つけられなかった。
さて、AWS LambdaのログはCloudWatchログに記録され、次のような構造をしてる。
CloudWatchログでは、個々の記録をイベントと呼んでるようだ。
一連のイベントをひとまとまりにしたものを、ログストリームと呼んでるようだ。
ログストリームは関数ごとにまとめられており、それをロググループと呼んでるようだ。
これを踏まえると、tailは次のような流れになる。
tailしたいロググループを特定する
while True:
tailしたいロググループから最も新しいログストリームを見つける
if 見つけたログストリームの最初の取得だったら:
ログストリーム内のイベントを最初から取得する
else:
ログストリーム内の続きのイベントを取得する
少し待つ
Pythonで書いたので
とりあえずboto3のインポートは必要となる。
#!/usr/bin/python3
import boto3
CloudWatch Logsのクライアントを作成する
# 最も単純な場合
aws_cwl_client = boto3.client('logs')
# プロファイル指定が必要ある場合
aws_cwl_client = boto3.session.Session(
profile_name='プロファイル名').client('logs')
# プロファイルに加えてリージョン指定が必要ある場合
aws_cwl_client = boto3.session.Session(
profile_name='プロファイル名',
region_name='リージョン名').client('logs')
ロググループ名の一覧は次のように取得できる
log_group_list = []
response = aws_cwl_client.describe_log_groups()
while True:
for value in response['logGroups']:
log_group_list.append(value['logGroupName'])
if 'nextToken' not in response:
break
response = aws_cwl_client.describe_log_groups(nextToken=response['nextToken'])
print(log_group_list)
# ロググループ名の一覧が表示される
tail本体は次のようになる
log_group_name = 'tailしたいロググループの名前'
stream = ''
next_token = ''
while True:
response = cwl.describe_log_streams(
logGroupName=log_group_name,
orderBy='LastEventTime',
descending=True,
limit=1)
if stream != response['logStreams'][0]['logStreamName']:
stream = response['logStreams'][0]['logStreamName']
print('---- %s ----' % stream)
next_token = ''
if next_token == '':
response = cwl.get_log_events(
logGroupName=group, logStreamName=stream)
else:
response = cwl.get_log_events(
logGroupName=group, logStreamName=stream, nextToken=next_token)
if len(response['events']) > 0:
for value in response['events']:
msg = value['message']
if msg.startswith('START RequestId: '):
temp = time.strftime(
'%Y-%m-%dT%H:%M:%S',
time.localtime(value['timestamp'] / 1000))
print('---- %s.%0d ----' % (temp, value['timestamp'] % 1000))
print(msg.replace('\r', '\n').replace('\n\n', '\n').rstrip())
next_token = response['nextForwardToken']
time.sleep(3)
補足
いまググったら、awslogsが見つかった。