我有这样的日志:
{"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"
}
}
但是,我仍然以字符串格式获取日志:
"消息&#34 ;: " {\" LOGID \":\" 57aaf6c96224b \" \" clientIp \":\" 127.0.0.1 \ " \"时间\":\" 03:11:29 PM \" \" CHANNELNAME \":\" JSPC \" \" apiVersion \":空,\" modulName \":空,\" actionName \":\" 404 \" \" typeOfError \":\"例外\" \"的StatusCode \":0,\"消息\":\" 404 页面遇到了 HTTP:\ / \ / localjs.com \ /上传\ / NonScreenedImages \ / profilePic120 \ / 16 \ / 29 \ /15997002iicee52ad041fed55e952d4e4e163d5972ii4c41f8845105429abbd11cc184d0e330.jpeg \" \" LOGTYPE \":\&# 34;错误\"}",
请帮我解决这个问题。
答案 0 :(得分:7)
要解析从Filebeat发送的Logstash中的JSON日志行,您需要使用json filter而不是编解码器。这是因为Filebeat将其数据作为JSON发送,并且日志行的内容包含在message
字段中。
Logstash config:
input {
beats {
port => 5044
}
}
filter {
if [tags][json] {
json {
source => "message"
}
}
}
output {
stdout { codec => rubydebug { metadata => true } }
}
Filebeat config:
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的博客文章演示了如何使用Filebeat 5.0解析JSON。
答案 1 :(得分:2)
从FileBeat 5.x您可以在不使用Logstash的情况下完成。
Filebeat config:
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
答案 2 :(得分:1)
我已经在互联网上搜索了你遇到的完全相同的问题,并尝试了各种建议,包括上述建议。然而,没有人帮助我,所以我采用老式的方式。我继续使用elasticsearch文档included in Standard Edition
以及所需的全部内容(在logstash中不需要过滤器配置)
Filebeat config:
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键复制到输出文档的顶层。
我的文件版本是5.2.2。