CloudWatch Logs Insightでアプリログの集計をやって1日目に試したこと

この記事はCloudWatch Logs Insightで実際のログを集計する時にやりたかったこととその方法のメモです。

ログストリームで絞り込み

これは簡単です。対象のログストリームがわかっているなら検索対象を狭めて所要時間と料金を節約しましょう。

| filter @logStream = 'name_of_log_stream'

単位時間で数え上げ

@timestampを希望の単位時間に丸めた値で集約して、ログの件数を数え上げます。 1時間ごとのエラーの件数が知りたい、なんて時に使います。

以下の例では1時間ごとのログの件数を集計しています。

  stats count(*) as polling_count by datefloor(@timestamp, 1h) as ts
| sort ts desc asc

この例では時刻を切り詰めしていましたが、切り上げの場合はdateceilが利用できます。 切り詰め、切り上げの単位は2引数で指定できます。

CloudWatch Logs Insights クエリ構文

構造化したログの特定フィールドで絞り込み

ログが構造化されていれば特定のフィールドで絞り込み(もちろん集計も)が行えます。

例えば以下のようにログを構造化していた場合

{
    "request": {
        "uri": "/someEndpoint",
        "method": "GET",
        "remoteHost": "x.x.x.x"
    },
    "level": "INFO",
    "level_value": 2000,
    "msg": "Do something awsome process."
}

エンドポイント($.reuest.uri)で絞り込みたい場合は下記のようになります。

| filter message.request.uri = '/someEndpoint'

マネジメントコンソールだとフィールド名の一覧に@messagemessageの2つが表示されますが、ログの構造を辿って指定する場合はmessageの方を指定します。 (最初これがわからなくて全然わからなかった)

まとめ

ほぼ自分向けのメモでしたが、これまでログをダウンロードしてスプレッドシートやDBにいれて集計していたのを考えるとかなり便利だと思います。 折を見て色々なパターンを試していきたいです。

おまけ

ログの構造化には以下のライブラリが便利です。それぞれ紹介記事のリンクを貼っておきます。