Logstash 設計了本身的 DSL —— 有點像 Puppet 的 DSL,或許由於都是用 Ruby 語言寫的吧 —— 包括有區域,註釋,數據類型(布爾值,字符串,數值,數組,哈希),條件判斷,字段引用等。php
1、基本語法組成python
logstash.conf配置文件裏至少須要有input和output兩個部分構成
input {
#輸入
}
filter {
#過濾匹配
}
output {
#輸出
}
一、input配置nginx
1.一、file{}(文件讀取)
監聽文件變化,記錄一個叫 .sincedb 的數據庫文件來跟蹤被監聽的日誌文件的當前讀取位(也就是時間戳)git
input {
file {
path => ["/var/log/access.log", "/var/log/message"] #監聽文件路徑
type => "system_log" #定義事件類型
start_position => "beginning" #檢查時間戳
}
}
參數說明:
exclude :排除掉不想被監聽的文件數據庫
stat_interval :logstash 每隔多久檢查一次被監聽文件狀態(是否有更新),默認是 1 秒。json
start_position :logstash 默認是從結束位置開始讀取文件數據,也就是說 logstash 進程會以相似 tail -f 的形式運行。若是你是要導入原有數據,把這個設定改爲 「beginning」,logstash 進程就按時間戳記錄的地方開始讀取,若是沒有時間戳則從頭開始讀取,有點相似cat,可是讀到最後一行不會終止,而是繼續變成 tail -f。數組
1.二、codec(定義編碼類型)
優化建議:直接輸入預約義好的 JSON 數據,這樣就能夠省略掉 filter/grok 配置,從而減輕過濾器 logstash 的 CPU 負載消耗;具體操做以下:
1.2.一、修改nginx配置文件,添加以下markdown
logformat json '{"@timestamp":"$time_iso8601",'
'"@version":"1",'
'"host":"$server_addr",'
'"client":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,' #$request_time沒有雙引號代表該值爲int類型
'"domain":"$host",'
'"url":"$uri",'
'"status":"$status"}';
access_log /var/log/nginx/access.log_json json;
1.2.二、重啓 nginx 應用,而後修改input/file 區段配置成下面這樣網絡
input {
file {
path => "/var/log/nginx/access.log_json"" codec => "json" } }
二、filter過濾器配置dom
2.一、data(時間處理)
用來轉換日誌記錄中的時間字符串,變成LogStash::Timestamp 對象,而後轉存到 @timestamp 字段裏。
注意:由於在稍後的 outputs/elasticsearch 中index經常使用的 %{+YYYY.MM.dd} 這種寫法必須讀取 @timestamp數據,因此必定不要直接刪掉這個字段保留本身的時間字段,而是應該用 filters/date 轉換後刪除本身的字段!至於elasticsearch 中index使用 %{+YYYY.MM.dd}這種寫法的緣由後面會說明。
filter {
grok {
match => ["message", "%{HTTPDATE:logdate}"]
}
date {
match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
2.二、grok (正則匹配)
filter {
grok {
match => [ "message", "\s+(?<status>\d+?)\s+" ] #跟python的正則有點差異
}
}
優化建議:若是把 「message」 裏全部的信息都 grok 到不一樣的字段了,數據實質上就至關因而重複存儲了兩份。因此能夠用 remove_field 參數來刪除掉 message 字段,或者用 overwrite 參數來重寫默認的 message 字段,只保留最重要的部分。
filter {
grok {
patterns_dir => "/path/to/your/own/patterns"
match => {
"message" => "%{SYSLOGBASE} %{DATA:message}"
}
overwrite => ["message"]
}
}
filter {
grok {
match => ["message", "%{HTTPDATE:logdate}"]
remove_field => ["logdate"]
}
}
2.三、GeoIP (地址查詢歸類)
GeoIP 是最多見的免費 IP 地址歸類查詢庫,同時也有收費版能夠採購。GeoIP 庫能夠根據 IP 地址提供對應的地域信息,包括國別,省市,經緯度等,對於可視化地圖和區域統計很是有用。
filter {
geoip {
source => "clientip"
database => "/etc/logstash/GeoLiteCity.dat" #需去官網下載ip庫放到本地
}
}
filter {
geoip {
source => "message" #若是能聯網可查詢在線ip庫
}
}
注:geoip 插件的 「source」 字段能夠是任一處理後的字段,好比 「clientip」,可是字段內容卻須要當心!geoip 庫內只存有公共網絡上的 IP 信息,查詢不到結果的,會直接返回 null,而 logstash 的 geoip 插件對 null 結果的處理是:不生成對應的 geoip.字段。
因此在測試時,若是使用了諸如 127.0.0.1, 172.16.0.1, 182.168.0.1, 10.0.0.1 等內網地址,會發現沒有對應輸出!
GeoIP 庫數據較多,若是不須要這麼多內容,能夠經過 fields 選項指定本身所須要的。下例爲所有可選內容
filter {
geoip {
fields => ["city_name", "continent_code", "country_code2", "country_code3", "country_name", "dma_code", "ip", "latitude", "longitude", "postal_code", "region_name", "timezone"]
}
}