什麼是 Logstash
Logstash 是一個開源工具,它可以對你的日誌進行收集、分析、並將其存儲以後使用
怎麼用 Logstash
安裝配置
在安裝之前要有 Java1.8 環境,因此先要配置 Java 環境,這點不懂可自行百度。
首先安裝 Logstash,[Logstash下載地址][1]。因爲我是在 Windows 下安裝,因此下載的是 ZIP 版本 。下載完成後,直接解壓即可。
解壓完畢後,進入 bin 目錄,首先要寫響應的配置文件,先新建一個配置文件,pipeline.conf 配置文件主要包括三個部分,分別是 input、filter、output 分別定義了輸入來源,過濾規則,輸出到什麼地方。一個簡單地配置文件如下,從控制檯輸入,在輸出到控制檯,沒有過濾規則。
input { stdin { } }
output { stdout {} }
然後執行命令 logstash agent -f pipeline.conf ,結果如下:
PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed
表示運行成功,在命令行輸入 hello world ,顯示如下:
PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed
hello world
2015-12-03T13:30:39.180Z liuyb hello world
配置語法
Logstash 設計了自己的 DSL ———— 包括有區域、註釋、數據類型(布爾值、字符串、數值、數組、哈希)、條件判斷、字段引用。
- 區段(section)
Logstash 用 {} 來定義區域,區域內可以包括插件區域定義,你可以在一個區域內定義多個插件,插件區域內則可以定義鍵值對設置。如下所示。
input{
stdin{}
syslog{}
}
數據類型
bool
debug=>true
String
host=>”hostname”
number
port=>514
array
options=>{key1=>val1,key2=>val2}
字段引用
字段是 Logstash::Event 對象的屬性。我們之前提過事件就像一個哈希一樣,所以你可以想象字段就想一個鍵值對。
如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字寫在中括號 [] 裏就行了,這就叫做字段引用。
對於嵌套字段(也就是多維哈希表,或者叫哈希的哈希),每層的字段名都寫在 [] 裏就可以了。條件判斷
表達式支持以下這些操作符- ==(等於), !=(不等於), <(小於), >(大於), <=(小於等於), >=(大於等於)
- =~(匹配正則), !~(不匹配正則)
- in(包含), not in(不包含)
- and(與), or(或), nand(非與), xor(非或)
- ()(複合表達式), !()(對複合表達式結果取反)
插件介紹
在 “Hello World” 示例中,我麼已經見到並介紹了 Logstash 的運行流程和配置的基礎語法。從這裏開始我們就要逐一介紹 Logstash 流程中比較常用的一些插件,並在介紹中針對其主要適用的場景,推薦的配置,做一些說明。
配置示例中代碼並不能貼完整,請記住一個原則:Logstash 配置一定要有一個 input 和一個 output。
input
collectd
collectd 是一個守護進程,用來收集系統性能和提供各種存儲方式來存儲不同值的機制,他會在系統運行和存儲信息時週期性的統計系統相關信息。利用這些信息有助於查找當前系統性能瓶頸(如作爲性能分析 performance analysis)和預測系統未來的 load(如能力部署 capacity planning)等。
collectd 的配置
以下配置可以實現對服務器基本的 CPU、內存、網卡流量、磁盤IO以及磁盤空間佔用情況監控
Hostname "host.example.com"
LoadPlugin interface
LoadPlugin cpu
LoadPlugin memory
LoadPlugin network
LoadPlugin df
LoadPlugin disk
<Plugin interface>
Interface "eth0"
IgnoreSelected false
</Plugin>
<Plugin network>
<Server "10.0.0.1" "25826"> ## logstash 的 IP 地址和 collectd 的數據接收端口號
</Server>
</Plugin>
Logstash配置
以下配置實現通過 logstash 監聽 25826 端口,接受從 collectd 發送過來的各項檢測數據:
input {
collectd {
port => 25826 ## 端口號與發送端對應
type => collectd
}
推薦配置
udp {
port => 25826
buffer_size => 1452
workers => 3 # Default is 2
queue_size => 30000 # Default is 2000
codec => collectd { }
type => "collectd"
}
運行結果
{
"_index": "logstash-2014.12.11",
"_type": "collectd",
"_id": "dS6vVz4aRtK5xS86kwjZnw",
"_score": null,
"_source": {
"host": "host.example.com",
"@timestamp": "2014-12-11T06:28:52.118Z",
"plugin": "interface",
"plugin_instance": "eth0",
"collectd_type": "if_packets",
"rx": 19147144,
"tx": 3608629,
"@version": "1",
"type": "collectd",
"tags": [
"_grokparsefailure"
]
},
"sort": [
1418279332118
]
}
file
Logstash 使用一個名叫 FileWatch 的 Ruby Gem 庫來監聽文件變化。這個庫支持 glob 展開文件路徑,而且會記錄一個叫 .sincedb 的數據庫文件來跟蹤被監聽的日誌文件的當前讀取位置。所以不要擔心 logstash 會漏過你的數據。
實例配置
input {
file {
path => ["/var/log/*.log", "/var/log/message"]
type => "system"
start_position => "beginning"
}
}
解釋
discover_interval
logstash 每隔多久去檢查一次被監聽的 path 下是否有新文件,默認值是15秒
exclude
不想被監聽的文件可以排除出去,這裏跟 path 一樣支持 glob 展開
close_older
一個已經監聽中的文件,如果超過這個值的時間內沒有更新內容,就關閉監聽它的文件句柄。默認是 3600 秒,即一個小時
ignore_older
在每次檢測文件列表的時候,如果一個文件的最後修改時間超過這個值,就忽略這個文件,默認是 86400 秒,即一天
since_path
如果你不想使用默認的$HOME/.sincedb
(Windows平臺上在C:\Windows\System32\config\systemprofile.sincedb),可以通過這個配置定義 sincedb 文件到其他位置
sincedb_write_interval
logstash 每隔多久寫一次 sincedb 文件,默認是 15 秒
stat_interval
logstash 每隔多久檢查一次被監聽文件狀態(是否有更新),默認是 1 秒。
logstash 從什麼位置開始讀取文件數據,默認是結束位置,也就是說 logstash 進程會以類似 tail -F 的形式運行。如果你是要導入原有數據,把這個設定改成 “beginning”,logstash 進程就從頭開始讀取,有點類似 cat,但是讀到最後一行不會終止,而是繼續變成 tail -F。
stdin
配置示例
input {
stdin {
add_field => {"key" => "value"}
codec => "plain"
tags => ["add"]
type => "std"
}
}
運行結果
用上面的 stdin 設置重新運行一次最開始的 hello world 示例。得到下面的輸出:
{
"message" => "hello world",
"@version" => "1",
"@timestamp" => "2014-08-08T06:48:47.789Z",
"type" => "std",
"tags" => [
[0] "add"
],
"key" => "value",
"host" => "raochenlindeMacBook-Air.local"
}
解釋
type 和 tags 是 logstash 事件中兩個特殊字段,通常來說我們會在輸入區段中通過 type 來標記事件類型。而 tags 則是在數據處理過程中,有具體的插件添加或者刪除的。
常見用法如下:
input {
stdin {
type => "web"
}
}
filter {
if [type] == "web" {
grok {
match => ["message", %{COMBINEDAPACHELOG}]
}
}
}
output {
if "_grokparsefailure" in [tags] {
nagios_nsca {
nagios_status => "1"
}
} else {
elasticsearch {
}
}
}
syslog
tcp
讀取網絡數據,未來你可能會使用 Redis 服務器或者其他的消息隊列系統來作爲 logstash broker 的角色。不過 Logstash 其實也有自己的 TCP/UDP 插件,在臨時任務的時候,也算能用,尤其是在測試環境中。
配置示例
input {
tcp {
port => 8888
mode => "server"
ssl_enable => false
}
}
常見場景
目前開來,LogStash::Inputs::TCP 最常見的用法就是配合 nc 命令導入舊數據。再啓動 Logstash 進程後,在另一個終端運行如下命令即可導入數據。
nc 127.0.0.1 8888 < olddata
codec(編碼插件)
採用 Json 編碼
示例配置
input {
file {
path => "/var/log/nginx/access.log_json""
codec => "json"
}
}
合併多行數據(multiline)
有些時候,應用程序調試日誌會包含非常豐富的內容,爲一個時間打印出很多行內容,這種日誌通常都很難通過命令行解析方式分析。
而 logstash 正爲此準備好了 codec/multiline 插件
示例配置
input {
stdin {
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
運行結果
運行 logstash 進程,然後在等待輸入的終端中輸入如下幾行數據:
[Aug/08/08 14:54:03] hello world
[Aug/08/09 14:54:04] hello logstash
hello best practice
hello raochenlin
[Aug/08/10 14:54:05] the end
你會發現 logstash 輸出下面的這樣的返回:
{
"@timestamp" => "2014-08-09T13:32:24.359Z",
"message" => "[Aug/08/09 14:54:04] hello logstash\n\n hello best practice\n\n hello raochenlin\n",
"@version" => "1",
"tags" => [
[0] "multiline"
],
"host" => "raochenlindeMacBook-Air.local"
}
解釋
其實這個插件的原理很簡單,就是把當前行的數據添加到前面一行後面,指導新的當前行匹配到 ^[ 正則爲止。
netflow
filter(過濾器插件)
時間處理(Date)
filter/date 插件
grok
geoip
json
kv
metrics
ruby
split
elapsed
output
持續更新中。。。