[LogStash] Génération automatique du schéma dans ELS?

Bonjour,

Suite au passage de LogStash avec cette conf

input {
    file {
        path => "C:/logstash-1.5.4/logstash-1.5.4/middle-global.2015-08-15.log"
        start_position => beginning
    }
}
filter {
    grok {
        match => { "message" => "%{DATESTAMP:date}.\[%{USERNAME:server}\].*INFO.*accessLogs \- %{IP:ip}.\- \- \[%{HTTPDATE:timestamp}*\].\"%{WORD:verb}.%{URIPATH:service}?%{URIPARAM:params}.HTTP/%{NUMBER:httpversion}\".%{NUMBER:responseCode}.%{NUMBER:responseSize}.%{QS:threadName}.%{QS:agent}.%{NUMBER:treatmentTime}"}
    }		
    geoip {
        source => "ip"
    }
	if "_grokparsefailure" in [tags] {
		drop {}
	}
}
output {
    elasticsearch {
        protocol => "http"
    }
    stdout {}
}

Je m’aperçois que les champs créés dans Elastic correspondant aux différents nombres et aux dates sont tous de format "String".

Exemple :

"treatmentTime" : {
            "type" : "string",
            "norms" : {
              "enabled" : false
            },
            "fields" : {
              "raw" : {
                "type" : "string",
                "index" : "not_analyzed",
                "ignore_above" : 256
              }
            }
          },

Dans les logs de logstash j'ai :

{
          "message" => "2015-08-06 19:11:39,441 [middle] [pool-7-thread-656        ] INFO  c.e.c.n.H.accessLogs - 10.10.12.12 - - [06/Aug/2015:19:11:39 +0200] \
"GET /service/search/s/catalog2?vl=fr&psz=16&maxCount=16 HTTP/1.1\" 200 17404 \"pool-7-thread-656\" \"Jakarta Commons-HttpClient/3.1\" 2",
         "@version" => "1",
       "@timestamp" => "2015-08-25T15:53:56.457Z",
             "host" => "Opti780-info-3",
             "path" => "C:/logstash-1.5.4/logstash-1.5.4/middle-global.2015-08-16.log",
             "date" => "15-08-06 19:11:39,441",
           "server" => "middle",
               "ip" => "10.10.12.12",
        "timestamp" => "06/Aug/2015:19:11:39 +0200",
             "verb" => "GET",
          "service" => "/service/search/s/catalog2",
           "params" => "?vl=fr&psz=16&maxCount=16",
      "httpversion" => "1.1",
     "responseCode" => "200",
     "responseSize" => "17404",
       "threadName" => "\"pool-7-thread-656\"",
            "agent" => "\"Jakarta Commons-HttpClient/3.1\"",
    "treatmentTime" => "2"
}

Tout semble passé sous forme de chaine. Est-ce au niveau de l'expression grok qu'il y aurait un problème ?

Faut il créer un mapping particulier avant le lancement de logstash afin que les champs soient bien dans le type escompté ?

Merci d'avance,
Denis.

Oui. Tu peux dans le mapping donner le format de date attendu et forcer le type à date pour ce champ.

Je ne comprends pas pourquoi chez moi tout passe en String alors que normalement d'après le filtre, certains champs devraient être en date ou en number. Comme ce qui se passe dans les exemples : https://www.elastic.co/guide/en/logstash/current/config-examples.html

Bon si il faut forcer le mapping pourquoi pas. Je vais essayer :smile:

Si tu veux forcer GROK à utiliser des numériques alors au lieu de NUMBER:responseSize, écris NUMBER:responseSize:int

Ok pour les int, par contre pour les dates il y a un moyen de les forcer ?

C'est bon avec
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}

youpi :smile:

Merci bien.