[英]Parse multiline JSON with grok in logstash
我有一個格式的JSON:
{
"SOURCE":"Source A",
"Model":"ModelABC",
"Qty":"3"
}
我正在嘗試使用logstash解析此JSON。 基本上我希望logstash輸出是一個key:value對的列表,我可以使用kibana進行分析。 我認為這可以開箱即用。 從很多閱讀中,我明白我必須使用grok插件(我仍然不確定json插件的用途)。 但我無法獲得所有領域的活動。 我得到多個事件(甚至對於我的JSON的每個屬性都有一個)。 像這樣:
{
"message" => " \"SOURCE\": \"Source A\",",
"@version" => "1",
"@timestamp" => "2014-08-31T01:26:23.432Z",
"type" => "my-json",
"tags" => [
[0] "tag-json"
],
"host" => "myserver.example.com",
"path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
"message" => " \"Model\": \"ModelABC\",",
"@version" => "1",
"@timestamp" => "2014-08-31T01:26:23.438Z",
"type" => "my-json",
"tags" => [
[0] "tag-json"
],
"host" => "myserver.example.com",
"path" => "/opt/mount/ELK/json/mytestjson.json"
}
{
"message" => " \"Qty\": \"3\",",
"@version" => "1",
"@timestamp" => "2014-08-31T01:26:23.438Z",
"type" => "my-json",
"tags" => [
[0] "tag-json"
],
"host" => "myserver.example.com",
"path" => "/opt/mount/ELK/json/mytestjson.json"
}
我應該使用多行編解碼器還是json_lines編解碼器? 如果是這樣,我該怎么做? 我是否需要編寫自己的grok模式,或者是否存在一些JSON的通用內容,這些內容將為我提供一個具有鍵值的事件:我在上面的一個事件中得到的值對? 我找不到任何能夠揭示這一點的文件。 任何幫助,將不勝感激。 我的conf文件如下所示:
input
{
file
{
type => "my-json"
path => ["/opt/mount/ELK/json/mytestjson.json"]
codec => json
tags => "tag-json"
}
}
filter
{
if [type] == "my-json"
{
date { locale => "en" match => [ "RECEIVE-TIMESTAMP", "yyyy-mm-dd HH:mm:ss" ] }
}
}
output
{
elasticsearch
{
host => localhost
}
stdout { codec => rubydebug }
}
我想我找到了解決問題的方法。 我不確定它是否是一個干凈的解決方案,但它有助於解析上述類型的多行JSON。
input
{
file
{
codec => multiline
{
pattern => '^\{'
negate => true
what => previous
}
path => ["/opt/mount/ELK/json/*.json"]
start_position => "beginning"
sincedb_path => "/dev/null"
exclude => "*.gz"
}
}
filter
{
mutate
{
replace => [ "message", "%{message}}" ]
gsub => [ 'message','\n','']
}
if [message] =~ /^{.*}$/
{
json { source => message }
}
}
output
{
stdout { codec => rubydebug }
}
我的mutliline編解碼器不處理最后一個大括號,因此它不會顯示為json { source => message }
的JSON。 因此mutate過濾器:
replace => [ "message", "%{message}}" ]
這增加了缺失的支撐。 和
gsub => [ 'message','\n','']
刪除引入的\\n
字符。 最后,我有一個可以通過json { source => message }
讀取的單行JSON
如果有一種更簡潔/更簡單的方法將原始多行JSON轉換為單行JSON,請執行POST,因為我覺得上面的內容不太干凈。
您需要使用multiline
編解碼器。
input {
file {
codec => multiline {
pattern => '^{'
negate => true
what => previous
}
path => ['/opt/mount/ELK/json/mytestjson.json']
}
}
filter {
json {
source => message
remove_field => message
}
}
您將遇到的問題與文件中的最后一個事件有關。 它不會出現,直到文件中有另一個事件(所以基本上你將丟失文件中的最后一個事件) - 你可以在文件被輪換之前附加一個{
來處理這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.