J'essaie d'utiliser Logs Insights avec des données contenant du JSON dans l'un des champs et d'analyser les champs JSON.
Mes données ressemblent à ce qui suit lorsque je les ai renseignées avec le code de démarrage
fields @timestamp, @message
| sort @timestamp desc
| limit 25
Comment puis-je facilement extraire la variable path
dans mon JSON imbriqué pour y effectuer des agrégations? En regardant certains documents, je pensais que @message.path
fonctionnerait, mais cela ne semble pas être le cas. Quelqu'un at-il interprété avec succès les journaux JSON dans Insights?
EDIT: exemple de mes données
#
@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)"}
En me basant sur @pyb insights , j’ai pu utiliser parse @message '"path":"*"' as path
pour extraire le chemin à partir de n’importe quel emplacement du @message
.
Vous pouvez continuer à obtenir votre méthode en pipillant un autre parse @message '"method":"*"' as method
sans vous soucier de commander car il s'agit d'une deuxième recherche globale en texte brut sur @message
Dans le cas où votre @message
est:
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)"}
En utilisant:
parse @message '"path":"*"' as path | parse @message '"method":"*"' as method
donnera les champs: path = '/api/v1/professionals/ID'
et method = 'GET'
Notez qu’il s’agit toujours simplement d’une analyse syntaxique de chaînes et qu’en tant que tel, il n’a pas de concept de clés imbriquées comme params.format
ne trouverait pas json
, mais l’utilisation de format
suffirait, tant qu’il n’y aurait pas d’autre chaîne format
dans votre @message
.
Notez également que cela s’applique au cas où Insights ne découvre pas votre JSON dans le message. Je crois que c'est le cas auquel @pyb faisait référence dans cette réponse . Mes journaux ne sont pas découverts en utilisant le format suivant
info - Request: {"method":"POST","path":"/auth/login/","body":{"login":{"email":"[email protected]","password":"********"}},"uuid":"36d76df2-aec4-4549-8b73-f237e8f14e23","ip":"*.*.*.*"}
Vous pouvez utiliser la commande parse
pour extraire des champs.
Si @message
est
I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}
Ensuite, vous extrayez les champs comme suit:
fields @timestamp, @message
| parse "I, [*T*] INFO -- : {"method":"*"}" as @date, @time, @method
| filter method=GET
| sort @timestamp desc
| limit 20
La documentation est plutôt légère pour le moment. Je peux obtenir des résultats en remplaçant le caractère générique *
par une expression régulière, mais l'analyse échoue.
CloudWatch Insights Logs découvre automatiquement les champs pour les types de journaux suivants:
Bûches lambda
CloudWatch Logs Insights découvre automatiquement les champs de journal dans les journaux Lambda, mais uniquement pour le premier fragment JSON incorporé dans chaque événement de journal (Remarque: l'emphase mine). Si un événement de journal Lambda contient plusieurs fragments JSON, vous pouvez analyser et extraire les champs de journal à l'aide de la commande d'analyse. Pour plus d'informations, voir Champs dans les journaux JSON.
Journaux CloudTrail
Source:Journaux pris en charge et champs découverts
Si @message
est I, [2018-12-11T13:20:27] INFO -- : {"method":"GET"}
Ensuite, vous pouvez sélectionner et filtrer les champs comme suit:
fields @timestamp, @message, method
| filter method = "GET"
| sort @timestamp desc
Cela fonctionne aussi avec les champs imbriqués, à savoir params.format = "json"
ou results.0.firstName = "Paul"
.