web-dev-qa-db-fra.com

Envoi d'un journal au format JSON à Kibana à l'aide de FileBeat, Logstash et Elasticsearch?

J'ai des journaux comme celui-ci:

{"logId":"57aaf6c8d32fb","clientIp":"127.0.0.1","time":"03:11:29 pm","uniqueSubId":"57aaf6c98963b","channelName":"JSPC","apiVersion":"v1","modulName":null,"actionName":"apiRequest","typeOfError":"","statusCode":"","message":"In Auth","exception":"In Auth","logType":"Info"}

{"logId":"57aaf6c8d32fb","clientIp":"127.0.0.1","time":"03:11:29 pm","uniqueSubId":"57aaf6c987206","channelName":"JSPC","apiVersion":"v2","modulName":null,"actionName":"performV2","typeOfError":"","statusCode":"","message":"in inbox api v2 5","exception":"in inbox api v2 5","logType":"Info"}

Je veux les pousser vers kibana. J'utilise filebeat pour envoyer des données à logstash, en utilisant la configuration suivante:

filebeat.yml

 ### Logstash as output
logstash:
# The Logstash hosts
hosts: ["localhost:5044"]

# Number of workers per Logstash Host.
#worker: 1

Maintenant, en utilisant la configuration suivante, je veux changer le type de codec:

input {

     beats {
     port => 5000
     tags => "beats"
     codec => "json_lines"
     #ssl  => true
     #ssl_certificate => "/opt/filebeats/logs.example.com.crt"
     #ssl_key => "/opt/filebeats/logs.example.com.key"
     }


     syslog {
        type => "syslog"
        port => "5514"

    }

}

Mais, je reçois toujours les journaux au format chaîne:

"message": "{\" logId\": \" 57aaf6c96224b\", \" clientIp\": \" 127.0.0.1\", \" time\": \" 03:11:29 pm\",\"channelName \":\"JSPC \",\"apiVersion \": null,\"modulName \": null,\"actionName \":\"404 \",\"typeOfError \":\"EXCEPTION \" ,\"statusCode \": 0,\"message \":\"404 page rencontrée http: \/\/localjs.com \/uploads \/NonScreenedImages \/profilePic120 \/16 \/29\/15997002iicee52ad041fed55e952d4e4e163d5972ii4c41f884510542954 ", \" logType\": \" Erreur\"}",

Veuillez m'aider à résoudre ce problème.

7
learner

Pour analyser les lignes de journal JSON dans Logstash qui ont été envoyées depuis Filebeat, vous devez utiliser un filtre json au lieu d'un codec. En effet, Filebeat envoie ses données au format JSON et le contenu de votre ligne de journal est contenu dans le champ message.

Configuration de Logstash:

input {
  beats {
    port => 5044
  }   
}   

filter {
  if [tags][json] {
    json {
      source => "message"
    }   
  }   
}   

output {
  stdout { codec => rubydebug { metadata => true } } 
}

Configuration de battement de fichier:

filebeat:
  prospectors:
    - paths:
        - my_json.log
      fields_under_root: true
      fields:
        tags: ['json']
output:
  logstash:
    hosts: ['localhost:5044']

Dans la configuration de Filebeat, j'ai ajouté une balise "json" à l'événement afin que le filtre json puisse être appliqué conditionnellement aux données.

Filebeat 5.0 est capable d'analyser le JSON sans utiliser Logstash, mais c'est toujours une version alpha pour le moment. Cet article de blog intitulé Journalisation structurée avec Filebeat montre comment analyser JSON avec Filebeat 5.0.

8
A J

Depuis FileBeat 5.x Vous pouvez le faire sans utiliser Logstash.

Configuration de battement de fichier:

filebeat.prospectors:
- input_type: log
  paths: ["YOUR_LOG_FILE_DIR/*"]
  json.message_key: logId
  json.keys_under_root: true

output.elasticsearch:
  hosts: ["<HOSTNAME:PORT>"]
  template.name: filebeat
  template.path: filebeat.template.json

Filebeat est plus léger que Logstash. De plus, même si vous devez insérer dans elasticsearch version 2.x, vous pouvez utiliser cette fonction de l'exemple réel de FileBeat 5.x. ici

3
Netanel Malka

J'ai parcouru Internet pour exactement le même problème que vous rencontrez et j'ai essayé diverses suggestions, y compris celles ci-dessus. Cependant, personne n'a aidé, alors je l'ai fait à l'ancienne. Je suis allé sur la documentation elasticsearch sur la configuration de filebeat

et tout ce qui était nécessaire (pas besoin de configuration des filtres dans logstash)

Configuration de battement de fichier:

filebeat.prospectors:
- input_type: log
  document_type: #whatever your type is, this is optional
  json.keys_under_root: true
  paths:
    - #your path goes here

keys_under_root

copie les clés json imbriquées au niveau supérieur dans le document de sortie.

Ma version de filebeat est 5.2.2.

2
gaukhar