2014-09-02 37 views
2

基本上,我希望LogStash使用自己的日誌並填充字段,如@timestamplevel等用於Kibana。如何使Logstash使用自己的日誌

我現在的配置是這樣的:

input { 
    file { 
    path => "/path/to/logstash/logs/*.log" 
    type => "logstash" 
    } 
} 

這似乎很難做到 - 不還原到寫神交過濾器。這真的是LogStash不能使用自己的日誌嗎? (難以谷歌,我找不到任何東西。)

或者這是錯誤的方法呢?從LogStash

示例日誌輸出:

{ 
    :timestamp=>"2014-09-02T10:38:08.798000+0200", 
    :message=>"Using milestone 2 input plugin 'file'. This plugin should be stable, but if you see strange behavior, please let us know! For more information on plugin milestones, see http://logstash.net/docs/1.4.2/plugin-milestones", 
    :level=>:warn 
} 

回答

5

你必須訴諸使用grok因爲logstash是不能夠使用rubydebug作爲輸入編解碼器。

日誌的格式是固定的,所以grok這樣做很簡單。然後,我們使用date更換@timestamp

filter { 
    grok { 
     match => ["message", '{:timestamp=>"(?<timestamp>.*)", :message=>"(?<msg>.*)", :level=>:(?<level>.*)}'] 
    } 
    mutate { 
     replace => ["message", "%{msg}" ] 
     remove_field => msg 
    } 
    date { 
     match => [ "timestamp", "ISO8601" ] 
     remove_field => 'timestamp' 
    } 
} 

mutate步驟是必要的,因爲如果你只是把<message>進入比賽,它會變成message到一個數組和提取的消息添加到它,所以拍攝爲不同名稱,然後替換該消息。

1

是的,你可以做到這樣。 請將您的logstash控制檯日誌保存到文件中。 然後,您可以使用ruby filtergrok filter解析出信息。

這裏是例子:

input { 
    file { 
      path => "/path/to/logstash/logs/*.log" 
    } 
} 

filter { 
    ruby { 
      code => " 
        mes = event['message']; 
        startPos = mes.index('level=>'); 
        endPos = mes.length; 
        event[':level'] = mes[startPos+7..endPos-2]; 
      " 
    } 
} 

output { 
    stdout { 
      codec => "rubydebug" 
    } 
} 
+1

但這真的是唯一的方法嗎?對不起,但它似乎是一種應該被LogStash直接支持的東西。 無法讀取自己日誌的日誌框架? :-) – Nicholas 2014-09-02 11:09:39