使用 filebeat、logstash 和 elasticsearch 将 json 格式的日志发送到 kibana?

Sending json format log to kibana using filebeat, logstash and elasticsearch?

我有这样的日志:

{"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"}

我想将它们推送到 kibana。我正在使用 filebeat 将数据发送到 logstash,使用以下配置:

filebeat.yml

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

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

现在使用以下配置,我想更改编解码器类型:

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"

    }

}

但是,我仍然得到字符串格式的日志:

"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 encountered http:\/\/localjs.com\/uploads\/NonScreenedImages\/profilePic120\/16\/29\/15997002iicee52ad041fed55e952d4e4e163d5972ii4c41f8845105429abbd11cc184d0e330.jpeg\",\"logType\":\"Error\"}",

请帮我解决这个问题。

要解析从 Filebeat 发送的 Logstash 中的 JSON 日志行,您需要使用 json filter 而不是编解码器。这是因为 Filebeat 将其数据发送为 JSON 并且您的日志行的内容包含在 message 字段中。

Logstash 配置:

input {
  beats {
    port => 5044
  }   
}   

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

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

Filebeat 配置:

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

在 Filebeat 配置中,我向事件添加了一个 "json" 标记,以便 json 过滤器可以有条件地应用于数据。

Filebeat 5.0 能够在不使用 Logstash 的情况下解析 JSON,但目前仍是 alpha 版本。这篇名为 Structured logging with Filebeat 的博客 post 演示了如何使用 Filebeat 5.0 解析 JSON。

来自 FileBeat 5.x 您无需使用 Logstash 即可完成。

Filebeat 配置:

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 比 Logstash 更轻量级。 此外,即使您需要插入到 elasticsearch 版本 2.x,您也可以使用 FileBeat 5.x 的此功能 可以找到真实的例子here

我在互联网上搜索了与您遇到的完全相同的问题,并尝试了各种建议,包括上述建议。但是,none 有所帮助,所以我采用了老式的方式。我继续使用 elasticsearch 文档 on filebeat configuration

以及所需的一切(不需要在 logstash 中配置过滤器)

Filebeat 配置:

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

将嵌套的 json 键复制到输出文档的顶层。

我的filebeat版本是5.2.2。