web-dev-qa-db-fra.com

Logstash: comment ajouter un nom de fichier en tant que champ?

J'utilise Logstash + Elasticsearch + Kibana pour avoir un aperçu de mes fichiers journaux Tomcat.

Pour chaque entrée de journal, j'ai besoin de connaître le nom du fichier dont il est issu. Je voudrais l'ajouter comme champ. Y a-t-il un moyen de le faire? J'ai googlé un peu et je n'ai trouvé que cette SO question , mais la réponse n'est plus à jour.

Jusqu'à présent, la seule solution que je vois est de spécifier une configuration distincte pour chaque nom de fichier possible avec différents "add_field" comme ceci:

input {
  file {
     type => "catalinalog"
     path => [ "/path/to/my/files/catalina**" ]
     add_field => { "server" => "prod1" }
  }
}

Mais ensuite, je dois reconfigurer le journal des connexions chaque fois qu'il y a un nouveau nom de fichier possible. De meilleures idées?

22
machinery

Salut, j'ai ajouté un filtre grok pour faire exactement cela. Je voulais seulement avoir le nom de fichier et non le chemin, mais vous pouvez le changer selon vos besoins.

filter {
  grok {
    match => ["path","%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"]
  }
}
37
Jettro Coenradie

Si vous souhaitez combiner le message et le nom de fichier en un seul événement:

filter {
grok {
    match => { 
        message => "ERROR (?<function>[\S]*)"
        }
}
grok {
    match => { 
        path => "%{GREEDYDATA}/%{GREEDYDATA:filename}\.log"
        }
}}  

Le résultat dans ElasticSearch (focus sur les champs 'nom de fichier' et 'fonction'):

"_index": "logstash-2016.08.03",
    "_type": "logs",
    "_id": "AVZRyEI49-A6kyBCq6Yt",
    "_score": 1,
    "_source": {
      "message": "27/07/16 12:16:18,321 ERROR blaaaaaaaaa.internal.com",
      "@version": "1",
      "@timestamp": "2016-08-03T19:01:33.083Z",
      "path": "/home/admin/mylog.log",
      "Host": "my-virtual-machine",
      "function": "blaaaaaaaaa.internal.com",
      "filename": "mylog"
    }
3
Vladik Y