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.
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.
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
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.