2014-11-14 45 views
5

我有一個Java應用程序,它以json格式寫入日誌文件。 日誌中的字段是可變的。 logstash讀取此日誌文件並將其發送給Kibana。Logstash + Kibana術語面板沒有斷詞

我已經配置了以下文件logstash:

input { 
     file { 
       path => ["[log_path]"] 
       codec => "json" 
     } 
} 

filter{ 
     json { 
       source => "message" 
     } 

     date { 
       match => [ "data", "dd-MM-yyyy HH:mm:ss.SSS" ] 
       timezone => "America/Sao_Paulo" 
     } 
} 

output { 
     elasticsearch_http { 
       flush_size => 1 
       host => "[host]" 
       index => "application-%{+YYYY.MM.dd}" 
     } 
} 

我已經成功地顯示Kibana一切正常,沒有任何映射。 但是,當我嘗試創建一個術語面板來顯示發送這些消息的服務器的計數,我有一個問題。 我在我的json中有一個名爲server的字段,它顯示服務器名稱(如:a1-name-server1),但術語面板由於「 - 」而將服務器名稱分開。 此外,我想統計出現錯誤消息的次數,但會出現相同的問題,因爲術語面板由於空格而將錯誤消息分開。

我使用Kibana 3和Logstash 1.4。 我在網上搜索了很多,找不到任何解決方案。 我也嘗試使用logstash中的.raw,但它不起作用。

我該如何管理?

感謝您的幫助。

回答

1

由於您沒有在elasticsearch中定義映射,因此默認設置將針對您的索引中類型的每個字段進行。字符串字段(如服務器字段)的默認設置是分析該字段,這意味着彈性搜索將標記字段內容。這就是爲什麼它將您的服務器名稱拆分爲多個部分。

您可以通過定義映射來克服此問題。您不必定義所有字段,但只需定義那些您不希望elasticsearch進行分析的字段。在您的特定情況下,發送以下put命令就可以了:

http://[host]:9200/[index_name]/_mapping/[type] 

{ 
    "type" : { 
     "properties" : { 
      "server" : {"type" : "string", "index" : "not_analyzed"} 
     } 
    } 
} 

,因爲從分析到not_analyzed切換你不能做到這一點上已經存在的指數是在映射的重大變化。

4

你的問題在於你的數據是標記化的。這有助於對數據進行任何搜索。 ES(默認情況下)會將您的字段message拆分爲不同的部分以便能夠搜索它們。例如,您可能希望在日誌中搜索單詞ERROR,因此您可能希望在結果消息中看到「您的羣集中存在錯誤」或「錯誤處理任何內容」。如果您不用tokenizers分析該字段的數據,那麼您將無法像這樣進行搜索。

分析行爲是有用的,當你想搜索的東西,但它不允許你分組時,不同的消息,具有相同的內容。這是你的用例。對此的解決方案是更新您的映射,將not_analyzed用於不希望劃分爲令牌的特定字段。這可能適用於您的host字段,但可能會破壞搜索。

我通常爲這種情況做的事情是使用index templatesmultifields。索引模板允許我爲每個匹配正則表達式的索引設置一個映射,並且多字段允許我在同一個字段中使用analyzednot_analyzed行爲。

使用下面的查詢會做你的問題的工作:

curl -XPUT https://example.org/_template/name_of_index_template -d ' 
{ 
    "template": "indexname*", 
    "mappings": { 
     "type": { 
      "properties": { 
       "field_name": { 
        "type": "multi_field", 
        "fields": { 
        "field_name": { 
         "type": "string", 
         "index": "analyzed" 
        }, 
        "untouched": { 
         "type": "string", 
         "index": "not_analyzed" 
        }      
       } 
      } 
     } 
    } 
}' 

,然後在條件面板,您可以使用field.untouched,要考慮現場的全部內容,當你計算不同的計數元素。

如果您不想使用索引模板(也許您的數據位於單個索引中),使用Put Mapping API設置映射也可以完成這項工作。如果使用多字段,則不需要重新索引數據,因爲從爲索引設置新映射的那一刻起,新數據將在這兩個子字段(field_namefield_name.untouched)中複製。如果您只是將映射從analyzed更改爲not_analyzed,那麼在重新索引所有數據之前,您將無法看到任何更改。

+0

我是否需要傳遞確切的字段名稱而不是「field_name」,或者只是將它應用於所有字段? – brunodahora 2014-11-18 11:59:22

+0

@brunodahora你必須指定字段名稱。 – Pigueiras 2014-11-18 12:57:23