2014-01-20 31 views
7

我有成千上萬的日誌文件,每天都會下載。我正在使用logstash和ElasticSearch進行解析,索引和搜索。如何在logstash中使用sincedb?

現在我正在使用文件輸入插件來讀取下載的文件並解析它。我沒有設置sincedb_path所以它的存儲在$HOME。但問題是它只讀了一天的日誌文件。這裏是我的輸入配置:

input { 
    file { 
    path => "/logs/downloads/apacheLogs/env1/**/*" 
    type => "env1" 
    exclude => "*.gz" 
    start_position => "beginning" 
    } 
    file { 
    path => "/logs/downloads/appLogs/env2/**/*" 
    type => "env2" 
    exclude => "*.gz" 
    start_position => "beginning" 
    } 
} 
+1

你一直指定'START_POSITION =>「開始」',或在那裏時,你可能已經沒有運行時間?它僅在Logstash第一次找到文件時才起作用:它將從文件末尾(默認)或開始(如果已設置)開始讀取。如果從頭讀取的文件從不更新,它將永遠不會被讀取。 – rutter

+0

是的,我總是指定'start_position =>「開始」' – Ananda

回答

1

做logstash是否有錯誤信息?

一個可能的問題是在linux系統中,每個用戶對打開的文件數量都有限制。 Logstash將打開logstash輸入路徑中的所有文件(/ logs/downloads/apacheLogs/env1/* /)。因此,當您的日誌文件超過限制時,logstash無法打開任何新的日誌文件並讀取它們。你可以檢查你的系統設置(/etc/security/limits.conf)。

編輯: 修改配置文件後,您需要註銷並重新登錄。

+0

我檢查了logstash日誌文件。沒有錯誤被拋出。我已將文件限制設置爲50,000。 – Ananda

+0

如果沒有任何錯誤,您可以嘗試刪除start_position =>「開始」。根據我的經驗,你的文件API配置沒有任何錯誤。 –

+0

你能否請你多解釋一下。當我刪除start_position =>「開始」時會發生什麼? – Ananda

8

這顯然是由文件處理程序中的錯誤引起的。

當文件{}輸入法讀取日誌文件時,最後處理的字節將被保存並定期複製到sincedb文件中。如果需要,您可以將文件設置爲/dev/null,但Logstash僅在啓動時讀取文件,之後使用內存中表的信息。

問題是,內存中的表索引由inode索引位置,並且從不修剪,即使它檢測到給定文件不再存在。如果刪除一個文件然後添加一個新文件 - 即使它有不同的名稱 - 它可能有相同的inode編號,並且文件處理程序會認爲它是同一個文件。

如果新文件較大,則處理程序將只從前一個最大字節開始讀取並更新表。如果新文件較小,那麼它似乎認爲該文件被截斷了,並且可能會從默認位置再次開始處理。

因此,處理事情的唯一方法是將sincedb設置爲/dev/null,然後重新啓動logstash(導致內部表丟失),然後將所有與該模式匹配的文件從開始 - 這也有問題,因爲一些文件可能不是新的。

+0

新的'ignore_older'選項可以提供解決方法。如果您的文件每天都在旋轉,那麼使用'ignore_older = 86400'(默認值)將會阻止您重新讀取舊文件。你仍然需要使用'sincedb =/dev/null',因爲inode沒有被修剪的問題仍然存在 –