Je vérifiais les journaux d'erreurs nginx sur notre serveur et découvris qu'ils commencent par la date formatée comme suit:
2015/08/30 05:55:20
c'est-à-dire YYYY/MM/DD HH:mm:ss
. J'essayais de trouver un modèle de date grok existant qui pourrait m'aider à analyser rapidement tout cela, mais malheureusement, je ne pouvais pas trouver un tel format de date. Finalement, j'ai dû écrire le motif comme suit:
%{YEAR}/%{MONTHNUM}/%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
J'espère toujours s'il y a un schéma plus court pour le même?
Non, vous trouvez les modèles inclus sur github. Le commentaire à datestamp
semble correspondre à votre AAAA/MM/JJ, mais DATE_US
et DATE_EU
sont différents.
Je suggère de surcharger le modèle DATE
en utilisant l’option grok patterns_dir et d’utiliser DATESTAMP
.
DATE_YMD %{YEAR}/%{MONTHNUM}/%{MONTHDAY}
DATE %{DATE_US}|%{DATE_EU}|%{DATE_YMD}
ou ajoutez simplement votre modèle dans un fichier de modèles et utilisez l'option patterns_dir de grok.
Stratégie de capture d'horodatage réussie comprenant 3 éléments
Utilisez $msec
pour capturer des millisecondes. Sinon, vous ne pourriez pas le trier avec précision.
log_format custom '[$msec] [$remote_addr] [$remote_user] '
'"$request" $status '
'"$http_referer" "$http_user_agent"';
Utilisez GREEDYDATA:
grok {
match => { "message" => "\[%{GREEDYDATA:raw_timestamp}\] %{GREEDYDATA:message}" }
overwrite => [ "message" ]
}
date
pour analyser l'horodatage brut.date {
match => [ "timestamp", "yyyy/MM/dd HH:mm:ss.S z" ]
target => "@timestamp"
}
Vous pouvez également simplement inclure le modèle joda.time qui est simple et court.
date {
match => [ "timestamp", "yyyy/MM/dd HH:mm:ss" ]
target => "@timestamp"
}
Lien utile pour la référence: https://docs.Oracle.com/javase/8/docs/api/Java/time/format/DateTimeFormatter.html
Pour correspondre à 2015/08/30 05:55:20, utilisez:
%{DATESTAMP:mytimestamp}
testé sur Elasticsearch 6.5
Source: https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns