Logstash date de l'analyse comme timestamp en utilisant le filtre de date
Eh bien, après avoir beaucoup regardé autour de moi, je n'ai pas pu trouver une solution à mon problème, car il "devrait" fonctionner, mais évidemment ne fonctionne pas. Je suis en utilisant sur une Ubuntu 14.04 LTS machine Logstash 1.4.2-1-2-2c0f5a1, et je reçois des messages comme celui ci:
2014-08-05 10:21:13,618 [17] INFO Class.Type - This is a log message from the class:
BTW, I am also multiline
dans la configuration d'entrée, j'ai un multiline
codec et l'événement est analysé correctement. Je sépare également le texte de l'événement en plusieurs parties afin qu'il soit plus facile à lire.
à la fin, j'obtiens, comme dans Kibana, quelque chose comme ceci (vue JSON):
{
"_index": "logstash-2014.08.06",
"_type": "customType",
"_id": "PRtj-EiUTZK3HWAm5RiMwA",
"_score": null,
"_source": {
"@timestamp": "2014-08-06T08:51:21.160Z",
"@version": "1",
"tags": [
"multiline"
],
"type": "utg-su",
"host": "ubuntu-14",
"path": "/mnt/folder/thisIsTheLogFile.log",
"logTimestamp": "2014-08-05;10:21:13.618",
"logThreadId": "17",
"logLevel": "INFO",
"logMessage": "Class.Type - This is a log message from the class:rn BTW, I am also multiliner"
},
"sort": [
"21",
1407315081160
]
}
Vous avez peut-être remarqué que j'ai mis un ";" dans l'horodateur. La raison en est que je veux être capable de trier les logs en utilisant la chaîne timestamp, et apparemment logstash n'est pas si bon que ça (par exemple: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/multi-fields.html).
j'ai unsuccessfull essayé d'utiliser le date
filtrer de plusieurs façons, et il semble n'a pas fonctionné.
date {
locale => "en"
match => ["logTimestamp", "YYYY-MM-dd;HH:mm:ss.SSS", "ISO8601"]
timezone => "Europe/Vienna"
target => "@timestamp"
add_field => { "debug" => "timestampMatched"}
}
Depuis que j'ai lu que le Joda bibliothèque avoir des problèmes si la chaîne N'est pas strictement conforme à la norme ISO 8601 (très difficile et attend un T, voir https://logstash.jira.com/browse/LOGSTASH-180), j'ai aussi essayé d'utiliser mutate
pour convertir la chaîne à quelque chose comme 2014-08-05T10:21:13.618
puis utiliser "YYYY-MM-dd'T'HH:mm:ss.SSS"
. Qui aussi n'a pas de travail.
Je ne veux pas avoir à mettre manuellement un +02:00 sur l'heure parce que cela donnerait des problèmes avec l'heure d'été.
dans l'un de ces cas, l'événement va à elasticsearch, mais date
ne fait apparemment rien, comme @timestamp
et logTimestamp
sont différents et n' debug
champ est ajouté.
une idée de comment je pourrais rendre les chaînes logTime correctement sortables? Je me suis concentré sur leur conversion à un timestamp approprié, mais toute autre solution serait également la bienvenue.
Comme vous pouvez le voir ci-dessous:
Lors du tri sur @timestamp
, elasticsearch peut le faire correctement, mais puisqu'il ne s'agit pas de l'horodatage "réel", mais plutôt lorsque l'événement logstash a été lu, j'ai besoin (évidemment) d'être capable de trier aussi sur logTimestamp
. C'est ce qu'est sortie. Évidemment pas utile:
Toute aide est la bienvenue! Dites-moi si j'ai oublié des informations utiles.
mise à Jour:
voici le fichier de configuration du filtre qui finalement travaillé:
# Filters messages like this:
# 2014-08-05 10:21:13,618 [17] INFO Class.Type - This is a log message from the class:
# BTW, I am also multiline
# Take only type- events (type-componentA, type-componentB, etc)
filter {
# You cannot write an "if" outside of the filter!
if "type-" in [type] {
grok {
# Parse timestamp data. We need the "(?m)" so that grok (Oniguruma internally) correctly parses multi-line events
patterns_dir => "./patterns"
match => [ "message", "(?m)%{TIMESTAMP_ISO8601:logTimestampString}[ ;][%{DATA:logThreadId}][ ;]%{LOGLEVEL:logLevel}[ ;]*%{GREEDYDATA:logMessage}" ]
}
# The timestamp may have commas instead of dots. Convert so as to store everything in the same way
mutate {
gsub => [
# replace all commas with dots
"logTimestampString", ",", "."
]
}
mutate {
gsub => [
# make the logTimestamp sortable. With a space, it is not! This does not work that well, in the end
# but somehow apparently makes things easier for the date filter
"logTimestampString", " ", ";"
]
}
date {
locale => "en"
match => ["logTimestampString", "YYYY-MM-dd;HH:mm:ss.SSS"]
timezone => "Europe/Vienna"
target => "logTimestamp"
}
}
}
filter {
if "type-" in [type] {
# Remove already-parsed data
mutate {
remove_field => [ "message" ]
}
}
}
2 réponses
j'ai testé votre date
filtre. il fonctionne sur moi!
Voici ma configuration
input {
stdin{}
}
filter {
date {
locale => "en"
match => ["message", "YYYY-MM-dd;HH:mm:ss.SSS"]
timezone => "Europe/Vienna"
target => "@timestamp"
add_field => { "debug" => "timestampMatched"}
}
}
output {
stdout {
codec => "rubydebug"
}
}
Et j'utilise cette entrée:
2014-08-01;11:00:22.123
La sortie est:
{
"message" => "2014-08-01;11:00:22.123",
"@version" => "1",
"@timestamp" => "2014-08-01T09:00:22.123Z",
"host" => "ABCDE",
"debug" => "timestampMatched"
}
Donc, assurez-vous que votre logTimestamp
a la valeur correcte.
C'est probablement un autre problème. Ou pouvez-vous fournir votre événement de log et la configuration de logstash pour plus de discussion. Remercier.
cela a fonctionné pour moi - avec un format datetime légèrement différent:
# 2017-11-22 13:00:01,621 INFO [AtlassianEvent::0-BAM::EVENTS:pool-2-thread-2] [BuildQueueManagerImpl] Sent ExecutableQueueUpdate: addToQueue, agents known to be affected: []
input {
file {
path => "/data/atlassian-bamboo.log"
start_position => "beginning"
type => "logs"
codec => multiline {
pattern => "^%{TIMESTAMP_ISO8601} "
charset => "ISO-8859-1"
negate => true
what => "previous"
}
}
}
filter {
grok {
match => [ "message", "(?m)^%{TIMESTAMP_ISO8601:logtime}%{SPACE}%{LOGLEVEL:loglevel}%{SPACE}\[%{DATA:thread_id}\]%{SPACE}\[%{WORD:classname}\]%{SPACE}%{GREEDYDATA:logmessage}" ]
}
date {
match => ["logtime", "yyyy-MM-dd HH:mm:ss,SSS", "yyyy-MM-dd HH:mm:ss,SSS Z", "MMM dd, yyyy HH:mm:ss a" ]
timezone => "Europe/Berlin"
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}