-
CloudWatchログでのAND検索は
半角スペースで区切る
ERROR ARGUMENTS
-
CloudWatchログでのOR検索は
?をつける
?ERROR ?ARGUMENTS
-
CloudWatchログでの完全一致検索は
ダブルクォテーションで囲う
"INTERNAL SERVER ERROR"
-
CloudWatchログで指定した単語を除外したログイベントは
除外する単語の前にマイナス
ERROR -ARGUMENTS
-
CloudWatchログで文字列に一致する JSON ログを返すには
JSON ログを検索する際には、中かっこで囲う
{ $.eventType = "UpdateTrail" }
-
CloudWatchログで数値に一致する JSON ログを返すには
指定したプロパティから指定した数値に一致したログイベントを返します。
より大きい (">")、より小さい ("<")、等しい ("=")、等しくない ("!=")、より大きいまたは等しい (">=")、または以下 ("<=")。
{ $.bandwidth > 75 }
-
CloudWatchログでJSON ログの AND 検索をするには
&& 前後の式に一致したログイベントを返します。
{ ($.user.id = 1) && ($.users[0].email = "John.Doe@example.com") }
-
CloudWatchログでJSON ログの OR 検索をするには
|| 前後の式の何れかに一致するログイベントを返します。
{ $.user.email = "John.Stiles@example.com" || $.coordinates[0][1] = "nonmatch" }
-
スペース区切りの非構造化ログ検索
非構造化ログがスペースで区切られている場合、区切られているフィールドごとに単語で検索することが可能です。
重要度 = err で検索したい、しかし、重要度以外の文字列に err が含まれてしまうということは、よくあることだと思います。
[ip, user, username, timestamp, request =*.html*, status_code = 4*, bytes]
Nginxのログとか?
-
fields @timestamp, @message
| sort @timestamp desc
| limit 20
fields
クエリ結果に表示するフィールドを指定します。
例だと
timestamp と message が結果に表示されます
-
fields @message
| parse @message "[*] *" as loggingType, loggingMessage
| filter loggingType = "ERROR"
| display loggingMessage
display
クエリ結果に表示するフィールドを指定します。フィールドそのものを表示するというより、フィールドを加工して検索した結果を表示するといった用途に向いているように思います。
display は1回だけ使用できます。
以下の例ですと、「[ERROR] any error messages」というログイベントのうち「any error messages」がクエリ結果に表示されます。
-
fields @timestamp, @message, @logStream, @log
| filter @message like "DEBUG"
| sort @timestamp desc
| limit 20
filter
条件に合致するログイベントを抽出するために使用します。
sort
ソート順を指定するコマンドです。
SQLでいうとorder byのイメージです。
-
クエリ保存と再実行
よく使うクエリは保存しましょう。保存したクエリは再実行可能です。
保存
クエリを記述する領域のすぐ下に保存ボタンがあります。
既存クエリを少し変更して別名で保存したい場合は、アクション → 名前を付けて保存 をクリックします。
保存
クエリを記述する領域のすぐ下に保存ボタンがあります。
既存クエリを少し変更して別名で保存したい場合は、アクション → 名前を付けて保存 をクリックします。
-
fields @timestamp, @message
| filter @message like /error/
| sort @timestamp
| limit 20
filter
抽出条件を指定するコマンドです。
部分文字列一致で検索するには、likeを使用します。
SQLでいうと where column1 like '%error%'のイメージです。
@messageに文字列「error」が含まれるログを、タイムスタンプの順に20件取得する
-
filter status in[400, 500]
inを使用するとSQLと同じようにリストで比較することもできます。
-
ログから、globや正規表現を用いて、
一時フィールドとしてデータを抜き出すことができます。
例えば、以下のように、リクエストIDが括弧で括られ、ログ内容がその後ろに出ているログで、
リクエストIDとログ内容を分けて処理したい場合。
ログ例
(request-id-1) start.
(request-id-1) success.
(request-id-2) start.
PARSE @message "(*) *" as requestID, message
とすることで、以下のようにデータを抽出することが可能です。
requestID message
request-id-1 start.
request-id-1 success.
request-id-2 start.
-
statusごとの件数を集計する
ログがJSON形式で出力されていて、「status」というキーにレスポンスのステータスを出力している前提で、
statusフィールドの値ごとに件数を集計します。
JSON形式ログの例
{
"requestId": "request-id-1",
"ip": "XXX.XXX.XX.XX",
"requestTime": "08/Apr/2020:04:00:59 +0000",
"httpMethod": "GET",
"resourcePath": "/api/hoge/",
"status": "200"
}
fields @timestamp, @message
| stats count(*) by status
-
リクエストIDごとに、処理にかかった時間を集計する
以下のような前提のログで、リクエストIDごとに処理時間を求めます。
リクエストごとの処理時間をログ側で出力していない(出力していれば楽なのですが)
リクエスト開始時と終了時にそれぞれログを出力している
以下のログ例のようにリクエストIDとログ内容を出力している
ログ例
(request-id-1) start.
(request-id-1) success.
(request-id-2) start.
fields @timestamp, @message
| PARSE @message "(*) *" as requestID, message
| filter requestID in ["request-id-1", "request-id-2", "request-id-3"]
| stats earliest(@timestamp) as startTime, latest(@timestamp) as endTime by requestID
| display requestID, abs(endTime - startTime)
やっていることとしては以下の通りです。
1.parseで@messageからリクエストIDを抜き出す
2.リクエストIDごとに、最も早いログイベントのタイムスタンプ (=startTime)、最も遅いログイベントのタイムスタンプ(=endTime)を集計する
3.リクエストIDと、処理時間(endTime-startTime)を表示する
-