2016-08-10 317 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

相關問題