web-dev-qa-db-ja.com

JSONフィールドを使用したAmazon Cloudwatch Logs Insights

いずれかのフィールドにJSONを含むデータでLogs Insightsを使用し、JSONフィールドを解析しようとしています

スターターコードを使用してデータを洞察すると、データは次のようになります

fields @timestamp, @message
| sort @timestamp desc
| limit 25

ネストされたJSONでpath変数を簡単に抽出して、それに対して集計を実行するにはどうすればよいですか?いくつかのドキュメントを見ると、@message.pathが機能すると思いましたが、そうは思えません。誰でもInsightsでJSONログを正常に解釈しました

enter image description here

編集:私のデータがどのように見えるかのサンプル

#
@timestamp
@message
1
2018-12-19 23:42:52.000
I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"user,tags,promotions,company_sector,similar_professionals.tags,similar_professionals.user","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@logStream  i-05d1d61ab853517a0
@message  I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}
@timestamp  1545262972000
2
2018-12-19 23:42:16.000
I, [2018-12-19T23:42:16.723472 #851] INFO -- : [ea712503-eb86-4a6e-ab38-ddbcd6c2b4d0] {"method":"GET","path":"/api/v1/heartbeats/new","format":"json","controller":"API::V1::Public::HeartbeatsController","action":"new","status":201,"duration":9.97,"view":3.2,"time":"2018-12-19T23:42:16.712+00:00","params":{"format":"json","compress":false},"@timestamp":"2018-12-19T23:42:16.722Z","@version":"1","message":"[201] GET /api/v1/heartbeats/new (API::V1::Public::HeartbeatsController#new)"}
15

parse コマンドを使用してフィールドを抽出できます。

@message

I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}

次に、次のようにフィールドを抽出します。

fields @timestamp, @message
| parse "I, [*T*] INFO -- : {"method":"*"}" as @date, @time, @method
| filter method=GET
| sort @timestamp desc
| limit 20

ドキュメントは今のところかなり軽いです。ワイルドカード*を正規表現に置き換えることで結果を得ることができますが、解析は失敗します。

5
pyb

@ pyb insights に基づいて、parse @message '"path":"*"' as pathを使用して@message内の任意の場所からパスを抽出できました。

parse @message '"method":"*"' as methodに対する2番目のグローバルプレーンテキスト検索であるため、順序を気にせずに別の@messageをパイピングすることにより、メソッドを取得できます。

@messageが次の場合:

I, [2018-12-19T23:42:52.629855 #23447] INFO -- : [2ce588f1-c27d-4a55-ac05-62a75b39e762] {"method":"GET","path":"/api/v1/professionals/ID","format":"json","controller":"API::V1::Public::ProfessionalsController","action":"show","status":200,"duration":285.27,"view":222.36,"time":"2018-12-19T23:42:52.344+00:00","params":{"include":"xxx","format":"json","compress":false,"id":"ID"},"@timestamp":"2018-12-19T23:42:52.629Z","@version":"1","message":"[200] GET /api/v1/professionals/ID (API::V1::Public::ProfessionalsController#show)"}

を使用して:

parse @message '"path":"*"' as path | parse @message '"method":"*"' as method

次のフィールドになります:path = '/api/v1/professionals/ID'およびmethod = 'GET'

これはまだ単純な文字列解析であり、params.formatjsonを見つけられないようなネストされたキーの概念はありませんが、formatだけを使用する場合は、 @messageの別のformat文字列。

また、これはInsightsがメッセージ内のJSONを検出していない場合のためです。私は、これが@pybが この回答 で言及していたケースだと信じています。次の形式を使用してもログが検出されません

info - Request: {"method":"POST","path":"/auth/login/","body":{"login":{"email":"[email protected]","password":"********"}},"uuid":"36d76df2-aec4-4549-8b73-f237e8f14e23","ip":"*.*.*.*"}
5
GusGold

CloudWatch Insights Logsは、次のログタイプのフィールドを自動的に検出します。

ラムダログ

CloudWatch Logs Insightsは、Lambdaログのログフィールドを自動的に検出しますが、各ログイベントの最初の埋め込みJSONフラグメントのみ(注:強調マイニング)。 Lambdaログイベントに複数のJSONフラグメントが含まれている場合、parseコマンドを使用してログフィールドを解析および抽出できます。詳細については、JSONログのフィールドを参照してください。

CloudTrailログ

JSONログのフィールド を参照してください。

出典:サポートされているログと検出されたフィールド

@messageI, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}の場合

次に、次のようにフィールドを選択してフィルタリングできます。

fields @timestamp, @message, method
| filter method = "GET"
| sort @timestamp desc

ネストされたフィールド、つまりparams.format = "json"またはresults.0.firstName = "Paul"でも機能します。

4
pyb

解析コマンド内のこの正規表現クエリは役立ちますか?

filter @message like / \"path\":\"/
| parse @message /(?<@endpt>((\/[a-zA-Z0-9_{}()-?]+){1,}))/

幸運を!

0
R0B0T-B0BA