Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Envoi de journaux à l'aide du point de terminaison NDJSON (journaux ND-JSON)
Le point de terminaison ND-JSON Logs (/ingest/bulk) accepte les journaux au format NDJSON (Newline Delimited JSON)
Si vous utilisez l'authentification par jeton porteur, suivez les étapes de configuration décrites Configuration de l'authentification par jeton porteur avant de continuer.
Format des demandes
Envoyez une valeur JSON par ligne, séparée par \n (LF) ou \r\n (CRLF). Les lignes vides sont ignorées en silence.
{"timestamp":1771007942000,"message":"event one","level":"INFO"} {"timestamp":1771007943000,"message":"event two","level":"ERROR"} {"timestamp":1771007944000,"message":"event three","level":"DEBUG"}
Les deux application/json application/x-ndjson sont acceptés en tant que type de contenu.
Types de valeurs JSON acceptés
Selon la spécification NDJSON (RFC 8259), toute valeur JSON valide est acceptée sur chaque ligne.
Objets JSON (les plus courants) :
{"timestamp":1771007942000,"message":"User logged in","service":"auth"} {"timestamp":1771007943000,"error":"Connection timeout","service":"api"}
Tableaux JSON (aplatis en événements individuels) :
[{"timestamp":1000,"message":"a"},{"timestamp":2000,"message":"b"}]
Cette seule ligne produit 2 événements. Chaque élément du tableau devient un événement de journal distinct.
Valeurs primitives :
"a plain string log message" 42 true null
Chaque primitive devient son propre événement avec l'horodatage actuel du serveur.
Types mixtes :
{"timestamp":1771007942000,"message":"structured event"} "unstructured string message" 42 {"timestamp":1771007943000,"error":"something failed"}
Les 4 lignes sont acceptées comme des événements valides.
| Contenu de la ligne | Comportement |
|---|---|
| Objet JSON | Accepté, horodatage extrait s'il est présent |
| un tableau JSON | Aplati : chaque élément devient un événement distinct |
Tableau vide [] |
Accepté, produit 0 événements |
| chaîne JSON | Accepté comme message d'événement |
| Numéro JSON | Accepté comme message d'événement |
| booléen JSON | Accepté comme message d'événement |
| JSON nul | Accepté comme message d'événement |
| JSON non valide | Ignoré (compté, le traitement continue) |
| Ligne vide | Ignoré (non compté comme ignoré) |
Champ d'horodatage
Le "timestamp" champ est exprimé en millisecondes d'époque (et non en secondes).
| Format | Exemple | Interprété comme |
|---|---|---|
| Numérique (millis) | "timestamp":1771007942000 |
1771007942000 ms |
| Manquant | (aucun champ d'horodatage) | Heure actuelle du serveur |
| Non numérique | "timestamp":"invalid" |
Heure actuelle du serveur |
| Ligne sans objet | "hello", 42, true |
Heure actuelle du serveur |
Lignes non valides
Les lignes qui ne sont pas des JSON valides sont ignorées et comptées en silence. Le traitement se poursuit avec la ligne suivante.
{"message":"valid event"} this is not valid json {"message":"another valid event"}
Résultat : 2 événements ingérés, 1 ignoré. Renvoie HTTP 200.
Si toutes les lignes ne sont pas valides, renvoie HTTP 400 avec"All events were invalid".
Exemple de demande
curl -X POST "https://logs.<region>.amazonaws.com/ingest/bulk?logGroup=MyLogGroup&logStream=MyStream" \ -H "Authorization: Bearer ACWL<token>" \ -H "Content-Type: application/x-ndjson" \ -d '{"timestamp":1771007942000,"message":"User logged in","level":"INFO"} {"timestamp":1771007943000,"message":"Query took 42ms","level":"DEBUG"} {"timestamp":1771007944000,"error":"Connection refused","level":"ERROR"}'
Réponses
Succès (tous les événements sont acceptés) :
HTTP 200 OK {}
Succès partiel (certains événements rejetés) :
{ "partialSuccess": { "rejectedLogRecords": 5, "errorMessage": "{\"tooOldLogEventCount\": 3, \"tooNewLogEventCount\": 1, \"expiredLogEventCount\": 1}" } }
Le rejectedLogRecords champ indique le nombre total d'événements rejetés. Le errorMessage champ contient une ventilation codée en JSON par motif de rejet :
tooOldLogEventCount— Événements dont l'horodatage est antérieur à la période de conservationtooNewLogEventCount— Événements dont l'horodatage est trop lointain dans le futurexpiredLogEventCount— Événements qui ont expiré pendant le traitement
Bonnes pratiques
Événements de mise en lots
Pour de meilleures performances et une meilleure efficacité :
Batch de plusieurs événements en une seule demande lorsque cela est possible
Taille de lot recommandée : 10 à 100 événements par demande
Taille maximale de la demande : 1 Mo
Gestion des erreurs
Mettez en œuvre une gestion appropriée des erreurs dans votre application. Codes d'état HTTP courants :
200 OK— Logs correctement ingérés400 Bad Request— Format ou paramètres de demande non valides401 Unauthorized— Jeton porteur non valide ou expiré403 Forbidden— Autorisations insuffisantes404 Not Found— Le groupe de journaux ou le flux n'existe pas429 Too Many Requests— Limite de débit dépassée500 Internal Server Error— Erreur de service (nouvelle tentative avec retard exponentiel)
Limitations
Taille maximale de l'événement : 256 Ko par événement
Taille maximale de la demande : 1 Mo
Nombre maximum d'événements par demande : 10 000
Les noms des groupes de journaux doivent respecter les conventions de dénomination des CloudWatch journaux
L'authentification par jeton porteur doit être activée sur le groupe de journaux si l'authentification par jeton porteur est utilisée.