CloudWatchLogsや、CloudWatchインサイトの検索方法いろいろ

Peko 2023年11月18日 カード18 いいね0

広告

単語カード

  • 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)を表示する
広告

コメント