? ? Logstash 配置一定要有一個(gè) input 和一個(gè) output量九。在演示過(guò)程中,如果沒(méi)有寫(xiě)明 input,默認(rèn)就會(huì)使用 "hello world" 里我們已經(jīng)演示過(guò)的input/stdin荠列,同理类浪,沒(méi)有寫(xiě)明的 output 就是output/stdout。
讀取文件(File)
分析網(wǎng)站訪問(wèn)日志應(yīng)該是一個(gè)運(yùn)維工程師最常見(jiàn)的工作了肌似。所以我們先學(xué)習(xí)一下怎么用 logstash 來(lái)處理日志文件费就。
Logstash 使用一個(gè)名叫FileWatch的 Ruby Gem 庫(kù)來(lái)監(jiān)聽(tīng)文件變化。這個(gè)庫(kù)支持 glob 展開(kāi)文件路徑川队,而且會(huì)記錄一個(gè)叫.sincedb的數(shù)據(jù)庫(kù)文件來(lái)跟蹤被監(jiān)聽(tīng)的日志文件的當(dāng)前讀取位置力细。所以,不要擔(dān)心 logstash 會(huì)漏過(guò)你的數(shù)據(jù)呼寸。
sincedb 文件中記錄了每個(gè)被監(jiān)聽(tīng)的文件的 inode, major number, minor number 和 pos艳汽。
配置示例
input {
? ? ? ? ? file {
? ? ? ? ? ? ? ? path => ["/var/log/*.log", "/var/log/message"]
? ? ? ? ? ? ? ? type => "system"
? ? ? ? ? ? ? ? start_position => "beginning"
? ? ? ? ? ? ? ?}
}
解釋
有一些比較有用的配置項(xiàng),可以用來(lái)指定FileWatch庫(kù)的行為:
discover_interval
logstash 每隔多久去檢查一次被監(jiān)聽(tīng)的path下是否有新文件对雪。默認(rèn)值是 15 秒河狐。
exclude
不想被監(jiān)聽(tīng)的文件可以排除出去,這里跟path一樣支持 glob 展開(kāi)瑟捣。
close_older
一個(gè)已經(jīng)監(jiān)聽(tīng)中的文件馋艺,如果超過(guò)這個(gè)值的時(shí)間內(nèi)沒(méi)有更新內(nèi)容,就關(guān)閉監(jiān)聽(tīng)它的文件句柄迈套。默認(rèn)是 3600 秒捐祠,即一小時(shí)。
ignore_older
在每次檢查文件列表的時(shí)候桑李,如果一個(gè)文件的最后修改時(shí)間超過(guò)這個(gè)值踱蛀,就忽略這個(gè)文件。默認(rèn)是 86400 秒贵白,即一天率拒。
sincedb_path
如果你不想用默認(rèn)的$HOME/.sincedb(Windows 平臺(tái)上在C:\Windows\System32\config\systemprofile\.sincedb),可以通過(guò)這個(gè)配置定義 sincedb 文件到其他位置禁荒。
sincedb_write_interval
logstash 每隔多久寫(xiě)一次 sincedb 文件猬膨,默認(rèn)是 15 秒。
stat_interval
logstash 每隔多久檢查一次被監(jiān)聽(tīng)文件狀態(tài)(是否有更新)呛伴,默認(rèn)是 1 秒勃痴。
start_position
logstash 從什么位置開(kāi)始讀取文件數(shù)據(jù),默認(rèn)是結(jié)束位置热康,也就是說(shuō) logstash 進(jìn)程會(huì)以類(lèi)似tail -F的形式運(yùn)行沛申。如果你是要導(dǎo)入原有數(shù)據(jù),把這個(gè)設(shè)定改成 "beginning"褐隆,logstash 進(jìn)程就從頭開(kāi)始讀取污它,類(lèi)似less +F的形式運(yùn)行。
注意
通常你要導(dǎo)入原有數(shù)據(jù)進(jìn) Elasticsearch 的話庶弃,你還需要filter/date插件來(lái)修改默認(rèn)的"@timestamp" 字段值衫贬。稍后會(huì)學(xué)習(xí)這方面的知識(shí)。
FileWatch只支持文件的絕對(duì)路徑歇攻,而且會(huì)不自動(dòng)遞歸目錄固惯。所以有需要的話,請(qǐng)用數(shù)組方式都寫(xiě)明具體哪些文件缴守。
LogStash::Inputs::File只是在進(jìn)程運(yùn)行的注冊(cè)階段初始化一個(gè)FileWatch對(duì)象葬毫。所以它不能支持類(lèi)似 fluentd 那樣的path => "/path/to/%{+yyyy/MM/dd/hh}.log"寫(xiě)法。達(dá)到相同目的屡穗,你只能寫(xiě)成path => "/path/to/*/*/*/*.log"贴捡。FileWatch 模塊提供了一個(gè)稍微簡(jiǎn)單一點(diǎn)的寫(xiě)法:/path/to/**/*.log,用**來(lái)縮寫(xiě)表示遞歸全部子目錄村砂。
start_position僅在該文件從未被監(jiān)聽(tīng)過(guò)的時(shí)候起作用烂斋。如果 sincedb 文件中已經(jīng)有這個(gè)文件的 inode 記錄了,那么 logstash 依然會(huì)從記錄過(guò)的 pos 開(kāi)始讀取數(shù)據(jù)础废。所以重復(fù)測(cè)試的時(shí)候每回需要?jiǎng)h除 sincedb 文件(官方博客上提供了另一個(gè)巧妙的思路:將sincedb_path定義為/dev/null汛骂,則每次重啟自動(dòng)從頭開(kāi)始讀)。
因?yàn)?windows 平臺(tái)上沒(méi)有 inode 的概念评腺,Logstash 某些版本在 windows 平臺(tái)上監(jiān)聽(tīng)文件不是很靠譜帘瞭。windows 平臺(tái)上,推薦考慮使用 nxlog 作為收集端蒿讥。