概述
Logstash 分爲 Shipper 和 Indexer 兩種角色,分別完成不同的工作:
- Shipper:安裝在 client 上,只負責採集和傳輸日誌;
- Indexer:安裝在 server 上,從隊列(例如 redis)讀取日誌、過濾、格式化等,然後存入 Elasticsearch;
常用配置
Logstash 的工作,涉及 input 和 output 兩種插件。
input 插件
input 插件,是用來提取日誌文件,一般使用 file 插件,該插件常用的幾個參數是:
- path:日誌文件路徑;
- type:名稱,可以在後面的 filter 和 output 中對不同的 type 做不同的處理;
- start_position:指定起始讀取位置,“beginning” 表示從文件頭開始,“end” 表示從文件尾開始;
- sincedb_path:Logstash 會記錄每個文件已經被讀取到的位置,保存在 sincedb 中,如果 Logstash 重啓,那麼對於同一個文件,會繼續從上次記錄的位置開始讀取。如果想重新從頭讀取文件,需要刪除 sincedb 文件,sincedb_path 則是指定了該文件的路徑。爲了方便,我們可以根據需要將其設置爲 “/dev/null”,即不保存位置信息。
output 插件
output 插件,是用來輸出日誌的,可以將數據輸出到消息隊列(例如 redis)、標準輸出(stdout)或者 Elasticsearch。
Shipper 示例
建議不要做任何的處理,直接傳輸日誌,以免佔用過多的服務器資源。
input{
file{
type => "redis"
path => "/var/redis/redis.log"
start_position => "beginning"
#sincedb_path => "/dev/null"
}
}
output{
if [type] == "redis"{
redis{
host => "127.0.0.1"
data_type => "list"
key => "redis"
db => 1
password => "123456"
}
}
}
sincedb_path 記錄了上次讀取日誌的位置,這也算是個BUG吧,因爲服務重啓時,日誌重新加載,而 logstash 需要從 sincedb_path 處讀取,自然是獲取不到日誌內容的,如果要獲取日誌內容,需要刪掉 sincedb_path。sincedb_path 路徑可以在 logstash.yml 中查看和配置,或者爲了服務重啓時能重新讀取日誌,可以不記錄 sincedb_path 值,如 sincedb_path => "/dev/null" ,那麼服務重啓時,就從頭開始讀取日誌。
Indexer 示例
input{
redis{
type => "redis"
host => "127.0.0.1"
data_type => "list"
key => "redis"
db => 1
password => "123456"
}
}
output{
if [type] == "redis"{
elasticsearch{
hosts => "10.16.4.56"
index => "redis-%{+YYYY-MM-dd}"
}
}
}
可以寫多個文件,也可以寫在一起。
此處從 redis 隊列中讀取的日誌記錄,並未做任何的過濾和格式化,在生產環境中還是需要過濾和格式化的,並根據不同的日誌類型,寫入不同的 index 中。