ちょっとしたテストの際、コマンドラインでサラッとログが書きたい時があります。
そんなときは、aws put-log-events が使えます。
PHPで書きたいときはこちらを参照にしてください。
準備
aws-cliのインストールとセットアップ
aws-cliを利用できるようにします。Macなら、
brew install awscli
でインストール可能なようです。便利。
インストールしたら、
aws configure
を実行し、Key, Secret, Region, formatを設定します。
もちろん、CloudWatchに書き込み権限のあるユーザーである必要があります。
ロググループとストリームを事前に作成しておく
put-log-eventsでは、指定したグループやストリームが存在しない場合に勝手に作成してくれることはないようなので、事前に作成しておきます。ここでは、
- グループ : test
- ストリーム : app1
を作成し、利用します。
タイムスタンプを出力する
コマンドの引数として13桁のmillisecondのUnixTimestampを付与する必要がありますが、その出力はnodeで行うこととします。
node -e 'console.log(Date.now())'
1525438246400
date +%s でも出力できますが、11桁なので。。。
ログを書き込む
コマンドは1回目と2回目以降では、実行の際のオプションが少し異なります。
2回目以降の実行には、実行の戻り値として返される nextSequenceTokenを --sequence-token オプションで渡してやる必要があるようです。
1回目
下記を実行すると、nextSequenceTokenが返されます。
aws logs put-log-events --log-group-name "test" --log-stream-name "app1" --log-events timestamp=$(node -e 'console.log(Date.now())'),message='Hello1'
{
"nextSequenceToken": "495802684308768944976731644967294124703722208857969xxxxx"
}
2回目以降
返されたToken情報を --sequence-token で指定して実行します。
aws logs put-log-events --log-group-name "test" --log-stream-name "app1" --log-events timestamp=$(node -e 'console.log(Date.now())'),message='Hello2' --sequence-token 495802684308768944976731644967294124703722208857969xxxxx
延々と繰り返します。。。
nextSequenceTokenを忘れたら
ずっとTokenを追い続けるのはしんどいです。忘れた場合でも、グループを指定して、aws log describe-log-strems を実行すれば、uploadSequenceToken として次に添付すべきtoken値を返してくれるようです。
なお、複数のストリームがある場合はストリーム毎に値が返るようです。
aws logs describe-log-streams --log-group-name "test"
"logStreams": [
{
"logStreamName": "app1",
"creationTime": 1525436712803,
"firstEventTimestamp": 1525436741548,
"lastEventTimestamp": 1525436767883,
"lastIngestionTime": 1525436768309,
"uploadSequenceToken": "495802684308768944976731645408177281858981340448628xxxxx",
"arn": "arn:aws:logs:ap-northeast-1:051990479xxx:log-group:test:log-stream:app1",
"storedBytes": 0
},
とりあえずはこんな感じ。
参考
以下、参考にさせていただきました。ありがとうございます。