2016-08-10 319 views
2

我的日志是这样的:使用filebeat,logstash和elasticsearch发送json格式的日志到kibana?

{"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 \”:空,\ “modulName \”:空,\ “actionName \”:\ “404 \”,\ “typeOfError \”: \“EXCEPTION \”,\“statusCode \”:0,\“message \”:\“404页面遇到http: \/\/localjs.com \ /上传\/NonScreenedImages \/profilePic120 \/16 \/29 \ /15997002iicee52ad041fed55e952d4e4e163d5972ii4c41f8845105429abbd11cc184d0e330.jpeg \ “\ ”日志类型\“:\ ”错误\“}”,

请帮助我解决这个问题。

回答

6

要解析从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演示了如何使用Filebeat 5.0解析JSON。

+1

使你在filebeat.yml文件中提到的变化,下面的logstash配置工作:'输入{ 节拍{ 端口=> 5044 } } 滤波器{ 如果[标签] [JSON] { JSON { 源=> “消息” } } } 输出{ elasticsearch { 主机=> “本地主机:9200” manage_template =>假 指数=>“%{[@元数据] [击败]} - %{+ YYYY.MM.dd}“ docume nt_type =>“%{[@ metadata] [type]}” } } ',而不是您的配置。谢谢您的帮助。 – learner

2

从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

+0

什么是直接对弹性logstash进行折衷? –

+0

@Robbo_UK你失去了控制中央弹性访问的能力。如果你有很多filebeat节点都具有弹性认证密钥,那么你弹性授权改变,你必须更新所有这些节点对一个logstash –

0

我已经冲刷互联网对您有完全相同的问题,尝试了各种建议,包括上面的建议。然而,没有人帮助,所以我用老式的方式做了。我去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。

+0

你是对的。但是,我使用的是以前版本的filebeat,在这种情况下,只有@aj的答案是有效的。 – learner

相关问题