2014-04-07 92 views
4

我有一些由Log4J2生成的日誌文件。我使用log4j2.xml配置文件中的JSONLayout將日誌輸出到.json文件中。我JSONLayout的定義是這樣的:解析Logstash中的JSON

<JSONLayout complete="false"></JSONLayout> 

原木獲得進入我的機器上的日誌文件,則追加,一後另一個,和看起來像這樣在logs.log:

{ 
    "logger":"com.mycompany.myLogger", 
    "timestamp":"1396792374326", 
    "level":"ERROR", 
    "thread":"pool-2-thread-2", 
    "message":"System: unable to perform action", 
    "throwable":"java.lang.NullPointerException\\n\tat com.myCompany.MyClass $.java:432)\\n\tat java.lang.Thread.run(Thread.java:744)\\n" 
    }, 

我想構建這個JSON,以便我可以從ElasticSearch中查詢它。在那個過程中,我試圖給所有記錄添加一個自定義字段。要做到這一點,我使用了以下內容:

input { 
    file { 
    type => "json" 
    path => "/var/logs/myApp/logs.log" 
    } 
} 
filter { 
    json { 
    add_tag => [ "HardcodedTagName"] 
    source => "message" 
    } 
} 
output { 
    elasticsearch { 
    protocol => "http" 
    codec => "json" 
    host => "[myServerAddress]" 
    port => "9200" 
    } 
} 

奇怪的是,我的自定義標籤似乎從來沒有得到補充。同時,我真的很想將我的JSON分解成可以在ElasticSearch中查詢的字段。我想查詢的東西顯然是可用的。它們是:

  • 水平
  • 消息
  • 時間戳

不過,我似乎無法得到這個信息的。當我看到在Kibana的JSON記錄,我剛纔看到這樣的事情:

{ 
    "_index": "logstash-2014.04.07", 
    "_type": "json", 
    "_id": "tG-s6-5pSnq5HZwLhM6Dxg", 
    "_score": null, 
    "_source": { 
    "message": " \"message\":\"System: unable to perform action\"\r", 
    "@version": "1", 
    "@timestamp": "2014-04-07T18:01:38.739Z", 
    "type": "json", 
    "host": "ip-MyipAddress", 
    "path": "/var/logs/myApp/logs.log" 
    }, 
    "sort": [ 
    1396893698739, 
    1396893698739 
    ] 
} 

什麼最讓我驚訝的是,日誌級別才存在。線程信息也不是。我很驚訝我找不到使用過濾器的Log4J示例的博客文章。任何幫助真誠感謝!

回答

8

您不需要使用json過濾器。您可以在輸入處指定編解碼器格式。

input { 
    file { 
     type => "json" 
     path => "/var/logs/myApp/logs.log" 
     codec => json 
    } 
} 

Logstash會自動將您的日誌解析爲json格式並添加相應的字段。