AWSのCloudWatch Logs Insights使い方まとめ

# CloudWatch Logs Insightsとは
CloudWatch Logsのログデータをクエリを使って検索したり解析ができます。
ログデータを解析する機会が多いので、よく使うクエリをまとめておきます。

## 初期表示
![1653982209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685449/fec6818c-84f6-199c-2b14-117e68e160e4.png)
```
fields @timestamp, @message
| sort @timestamp desc
| limit 20
```
意味：fieldsで指定した@timestamp, @messageを表示。@timestampの降順でソートして先頭からの20件。

@でログイベントのフィールドを指定します。

## ログイベント一覧
@message ：InputLogeventのmessageフィールド。
@timestamp ：　timestamp フィールドに含まれるイベントタイムスタンプ。InputLogeventのtimestampフィールド。
@ingestionTime：CloudWatch Logs によって受信された時間。
@logStream：ログイベントの追加先のログストリームの名前。ログストリームは、生成時と同じプロセスでログをグループ化します。
@log：ロググループ識別子。

[AWS公式：サポートされるログと検出されるフィールド　](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html)


## コマンド一覧

|コマンド| 説明 |
|:-:|:-|
|display  |クエリ結果に表示するフィールドを指定します。   |
|fields   |指定したフィールドをログイベントから取得して表示します。   |
|filter   |クエリの結果を1つ以上の条件に基づいてフィルタリングします。   |
|sort   |取得したログイベントをソートします。   |
|stats   |ログフィールドの値に基づいて集約統計を計算します。   |
|limit   |クエリから返されるログイベントの数を指定します。   |
|parse   |ログフィールドからデータを抽出し、1 つ以上のエフェメラルフィールドを作成してクエリでさらに処理できるようにします。   |



### fields

ログ一覧に指定した項目を表示する。
```
fields @timestamp, @message, path
```
連結もできる。
domain フィールドと path フィールドの値がハイフンで連結してurlとして表示
```
fields concat(domain, '/', path) as url
```

### filter
クエリの結果を1つ以上の条件に基づいてフィルタリング。さまざまな演算子など使える。
比較演算子 (=、!=、<、<=、>、>=) とブール演算子 (and、or、および not) 

[AWS公式：フィルターコマンドの一致と正規表](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html#CWL_QuerySyntax-regex)

#### in　（not in）
```
fields @timestamp, @message 
    | filter statusCode in [300,400,500]
    | filter statusCode not in [200,0]
```
#### like（not like）
```
fields @timestamp, @message 
	| filter @message like  "一致したい文字"
	| filter @message like  /正規表現パターンと一致たい文字/
	| filter @message like  /E*/　#ワイルドカード使用して部分一致
	| filter @message not like "Exception"
```
### sort
昇順 (asc) と降順 (desc) で並び順を指定する。

例）f1で降順にソート
```
fields f1, f2, f3 
	| sort f1 desc
```

### limit
クエリから返されるログイベントの数を指定。
制限を指定しない場合、クエリにはデフォルトで最大1000行表示される。

例）@timestampで降順にソートして、最初の 25 件のイベントの f1 フィールドと f2 フィールドを表示

```
sort @timestamp desc 
| limit 25  
| display f1, f2
```

### stats
ログフィールドの値に基づいて集約統計を計算する。
stats コマンドに「by」 を付けることで、条件を1つ以上指定できる。統計データは、指定の条件でグループ化できる。
stats コマンドでは、sum()、avg()、count()、min()、および max() の演算子が使える。

例）例外が発生したレコードの数をカウント
```
fields @timestamp, @message 
	|  stats count(*) by errorCode, errorMessage 
```


### コメントアウト
クエリ内でのコメントは#を使用する
```
fields @timestamp, @message
    # | filter @message like /delay/
    | limit 20
```


## 使用例

ステータスが500のログを検索
```
fields @timestamp, @message
| filter @message like /"status": "500"/ 
| sort @timestamp desc
```

ステータスが500のログでpathに特定の文字が入ったログを検索
```
fields @timestamp, @message
| filter @message like /"status": "500"/ 
| filter @message like /candidate/ 
| sort @timestamp desc
```

ドメイン指定pathに特定の文字が入ったログを検索
```
fields @timestamp, @message
| filter domain = "api.sample.com" 
| filter @message like /userRequest/ 
| sort @timestamp desc
```

ステータスが500のログでpathとリクエストに特定の文字が入っているログを検索
```
fields @timestamp, @message
| filter @message like /"status": "500"/ 
| filter @message like /chatform/ 
| filter req like /zipcode/ 
| sort @timestamp desc
```

## まとめ

Logs Insightsが使えるようになると、問題が発生した時、ただやみくもにログを調べて未解決事件になりかねないことも
簡単に原因が見つかって解決してしまうことがよくあります。
とても便利な機能なので、参考にしていただけると幸いです。