讀取文件
Logstash 使用一個名叫 FileWatch 的 Ruby Gem 庫來監聽文件變化。這個庫支持 glob 展開文件路徑,而且會記錄一個叫 .sincedb 的數據庫文件來跟蹤被監聽的日志文件的當前讀取位置。所以,不要擔心 logstash 會漏過你的數據。
sincedb 文件中記錄了每個被監聽的文件的 inode, major number, minor number 和 pos。
input file { path => ["/var/log/*.log", "/var/log/message"] type => "system" start_position => "beginning" } }
有一些比較有用的配置項,可以用來指定 FileWatch 庫的行為:
- discover_interval
logstash 每隔多久去檢查一次被監聽的 path
下是否有新文件。默認值是 15 秒。
- exclude
不想被監聽的文件可以排除出去,這里跟 path
一樣支持 glob 展開。
- sincedb_path
如果你不想用默認的 $HOME/.sincedb
(Windows 平台上在 C:\Windows\System32\config\systemprofile\.sincedb
),可以通過這個配置定義 sincedb 文件到其他位置。
- sincedb_write_interval
logstash 每隔多久寫一次 sincedb 文件,默認是 15 秒。
- stat_interval
logstash 每隔多久檢查一次被監聽文件狀態(是否有更新),默認是 1 秒。
- start_position
logstash 從什么位置開始讀取文件數據,默認是結束位置,也就是說 logstash 進程會以類似 tail -F
的形式運行。如果你是要導入原有數據,把這個設定改成 "beginning",logstash 進程就從頭開始讀取,有點類似 cat
,但是讀到最后一行不會終止,而是繼續變成 tail -F
。
讀取網絡TCP
Logstash有自己的 TCP/UDP 插件,在臨時任務的時候,也算能用,尤其是測試環境。
小貼士:雖然 LogStash::Inputs::TCP
用 Ruby 的 Socket
和 OpenSSL
庫實現了高級的 SSL 功能,但 Logstash 本身只能在 SizedQueue
中緩存 20 個事件。這就是我們建議在生產環境中換用其他消息隊列的原因。
input { tcp { port => 8888 mode => "server" ssl_enable => false } }
目前來看,LogStash::Inputs::TCP
最常見的用法就是配合 nc
命令導入舊數據。在啟動 logstash 進程后,在另一個終端運行如下命令即可導入數據:
# nc 127.0.0.1 8888 < olddata
這種做法比用 LogStash::Inputs::File
好,因為當 nc 命令結束,我們就知道數據導入完畢了。而用 input/file 方式,logstash 進程還會一直等待新數據輸入被監聽的文件,不能直接看出是否任務完成了。
讀取redis數據
input { redis { batch_count => 1 #EVAL命令返回的事件數目 data_type => "list" #logstash redis插件工作方式 key => "logstash-test-list" #監聽的鍵值 host => "127.0.0.1" #redis地址 port => 6379 #redis端口號 password => "123qwe" #如果有安全認證,此項為密碼 db => 0 #redis數據庫的編號 threads => 1 #啟用線程數量 } } output { stdout{} }
data_type logstash工作的類型
logstash中的redis插件,指定了三種方式來讀取redis隊列中的信息。
- list=>BLPOP
- channel=>SUBSCRIBE
- pattern_channel=>PSUBSCRIBE
其中list,相當於隊列;channel相當於發布訂閱的某個特定的頻道;pattern_channel相當於發布訂閱某組頻道。