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: Sorting with timestamps: OK

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:

Sorting with string: Not OK. Any suggestions?

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" ]
        }
    }
}
21
demandé sur Josep 2014-08-06 13:17:00

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.

19
répondu Ben Lim 2014-08-06 09:33:25

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 }
}
0
répondu mawl 2017-11-23 06:51:40