- 理解
Logstash
如何採集、解析並將各種格式和型別的資料轉換成通用格式,然後被用來為不同的應用構建多樣的分析系統
配置Logstash
- 輸入外掛將源頭資料轉換成通用格式的事件,過濾外掛修改這些事件,最終輸出外掛將它們輸出到其他系統
Logstash
外掛
列出Logstash
的所有外掛
bin/plugin list
- 使用下面命令列出指定分組的外掛
bin/plugin list --group <group_name>
bin/plugin list --group output
外掛屬性的資料型別
陣列(Array
)
path => ["value1", "value2"]
布林值(Boolean
)
periodic_flush => false
編解碼器(Codec
)
- 編解碼器實際上並不是一種資料型別,它是在輸入或輸出的時候對資料進行解碼或編碼的一種方式。上面例子指定在輸出時,編解碼器會將所有輸出資料編碼成
json
格式
codec => "json"
雜湊(Hash
)
- 由一系列鍵值對組成的集合
match => {
"key1" => "value1", "key2" => "value2"
}
字串(String
)
value => "welcome"
註釋(Comment
)
- 以字元#開頭
# 這是一個註釋
欄位引用
- 可使用[
field_name
]的方式引用,巢狀欄位可以使用[
level1][
level2]
的方式指定
Logstash
條件語句
- 在某些條件下
Logstash
可以用條件語句來過濾事件或日誌記錄。Logstash
中的條件處理和其他程式語言中的類似,使用if
、if else
和else
語句。多個if else
語句塊可以巢狀
if <conditional expression1> {
# 一些處理語句
}
else if <conditional expression2> {
# 一些處理語句
}
else {
# 一些其他語句
}
- 條件語句可以與比較運算子、邏輯運算子和單目運算子一起使用
- 比較運算子包括以下幾種
- 相等運算子:==、!=、<、>、<=、>=
- 正規表示式:=
、! - 包含:
in
、not in
- 邏輯運算子:
and
、or
、nand
、xor
- 單目運算子:!
filter {
if [action] == "login" {
mutate { remove => "password" }
}
}
output {
if [loglevel] == "ERROR" and [deployment] == "production" {
email {}
}
}
Logstash
外掛的型別
- 輸入(
Input
) - 過濾器(
Filter
) - 輸出(
Output
) - 編解碼(
Codec
)
輸入外掛
檔案(file
)
Logstash檔案輸入外掛將檔案讀取的最新位點儲存在$HOME/.sincdb*的檔案中。檔案路徑和重新整理頻率可以通過sincedb_path和sincdb_write_interval配置
input {
file {
path => "/GOOG.csv"
add_field => {"input_time" => "%{@timestamp}"}
codec => "json"
delimiter => "\n"
exclude => "*.gz"
sincedb_path => "$HOME/.sincedb*"
sincedb_write_interval => 15
start_position => "end"
tags => ["login"]
type => ["apache"]
}
}
選項 | 資料型別 | 是否必選 | 預設值 | 說明 |
---|---|---|---|---|
add_field |
hash |
否 | {} | 增加欄位 |
codec |
string |
否 | plain |
用於指定編解碼器輸入 |
delimiter |
string |
否 | `n ` | 分隔符 |
exclude |
array |
否 | [] | 排除指定型別檔案 |
sincedb_path |
string |
否 | $HOME/.sincedb |
監視檔案當前讀取位點 |
sincedb_write_interval |
int |
否 | 15 | 指定sincedb 檔案寫入頻率 |
start_position |
string |
否 | end |
輸入檔案的初始讀取位點 |
tags |
array |
否 | 給輸入事件增加一系列標籤 | |
type |
string |
否 | 給多個輸入路徑中配置的不同型別的事件指定type 名稱 |
|
path |
array |
是 | 日誌檔案路徑 |
input {
file {
path => ["/var/log/syslog/*"]
type => "syslog"
}
file {
path => ["/var/log/apache/*"]
type => "apache"
}
}
filter {
if [type] == "syslog" {
grok{}
}
if [type] == "apache" {
grok{}
}
if "login" == tags[] {}
}
Redis
- 從
redis
例項中讀取事件和日誌。經常用於輸入資料的訊息代理,將輸入資料快取到佇列,等待索引器讀取日誌
選項 | 資料型別 | 是否必選 | 預設值 | 說明 |
---|---|---|---|---|
add_field |
hash |
否 | {} | 增加欄位 |
codec |
string |
否 | plain |
用於指定編解碼器輸入 |
data_type |
string |
否 | list |
list (BLPOP )、channel (SUBSCRIBE 命令訂閱key )、pattern_channel (PSUBSCRIBE 命令訂閱key ) |
host |
string |
否 | 127.0.0.1 | |
key |
string |
否 | ||
password |
string |
否 | ||
port |
int |
否 | 6379 |
輸出
elasticsearch
- 最重要的輸出外掛
過濾器
- 用於在輸出外掛輸出結果之前,對輸入外掛中讀取的事件進行中間處理。常用於識別輸入事件的欄位,並對輸入事件的部分內容進行條件判斷處理
csv
- 用於將
csv
檔案輸入的資料進行解析,並將值賦給欄位
csv {
columns => ["date_of_record","open","high","low","close","volume","adj_close"]
separator => ","
}
date
- 給事件賦予正確的時間戳非常重要,只有這樣才能在
Kibana
中使用時間過濾器對事件進行分析
date {
match => ["date_of_record", "yyyy-MM-dd"]
}
drop
- 將滿足條件的所有事件都丟棄掉,這個過濾外掛有下面這些配置選項
add_field
add_tag
remove_field
remove_tag
filter {
if [fieldname == "test"] {
drop {}
}
}
geoip
- 基於輸入事件中的
IP
地址給事件增加地理位置資訊。這些資訊從Maxmind
資料庫中讀取
Maxmind是一個專門提供IP地址資訊產品的公司。GeoIP是它們開發的智慧IP產品,用於IP地址的位置跟蹤。所有Logstash版本都自帶一個Maxmind的GeoLite城市資料庫。這個地址資料庫可以從https://dev.maxmind.com/geoip/geoip2/geolite2/獲取
geoip {
source => # 必選字串,需要使用geoip服務進行對映的ip地址或主機名
}
grok
- 目前為止最流行、最強大的外掛。使用它可以解析任何非結構化的日誌事件,並將日誌轉化成一系列結構化的欄位,用於後續的日誌處理和分析
- 可以用於解析任何型別的日誌,包括
apache
、mysql
、自定義應用日誌或者任何事件中非結構化的文字 Logstash
預設包含了很多grok
模式,可以直接用來識別特定型別的欄位,也支援自定義正規表示式- 所有可用
grok
模式從這裡獲取:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
HOSTNAME \b(?:[0-9A-Za-z][0-9A-Za-z-]{0,62})(?:\.(?:[0-9A-Za-z][0-9A-Za-z-]{0,62}))*(\.?|\b)
DAY (?:Mon(?:day)?|Tue(?:sday)?|Wed(?:nesday)?|Thu(?:rsday)?|Fri(?:day)?|Sat(?:urday)?|Sun(?:day)?)
YEAR (?>\d\d){1,2}
HOUR (?:2[0123]|[01]?[0-9])
MINUTE (?:[0-5][0-9])
- 上面
grok
模式可以使用下面這樣的操作符直接識別這些型別的欄位。希望將日誌事件中代表主機名的文字賦值給host_name
這個欄位
%{HOSTNAME:host_name}
- 看一下如何用
grok
模式表示一行HTTP
日誌
54.3.245.1 GET /index.html 14562 0.056
grok
模式是這樣的
%{IP:client_ip} %{WORD:request_method} %{URIPATHPARAM:uri_path} %{NUMBER:bytes_transfered} %{NUMBER:duration}
filter {
grok {
match => { "message" => "%{IP:client_ip} %{WORD:request_method} %{URIPATHPARAM:uri_path} %{NUMBER:bytes_transfered} %{NUMBER:duration}" }
}
}
- 使用
grok
過濾器處理上面的事件後,可以看到事件中增加了如下欄位和值
client_ip
:54.3.245.1request_method
:GET
uri_path
:/index.html
bytes_transferred
:14562duration
:0.056
- 如果
grok
模式中沒有需要的模式,可以使用正規表示式建立自定義模式
設計和測試grok模式
mutate
- 對輸入事件進行重新命名、移除、替換和修改欄位。也用於轉換欄位的資料型別、合併兩個欄位、將文字從小寫轉換為大寫等
sleep
- 將
Logstash
置於sleep
模式,時間由引數指定,也可以基於事件指定sleep
頻率 - 如果希望每處理五個事件就
sleep
一秒,可以這樣配置
filter {
sleep {
time => "1"
every => 5
}
}
編解碼
- 用於對輸入事件進行解碼,對輸出事件進行解碼,以流式過濾器的形式在輸入外掛和輸出外掛中工作,重要的編解碼外掛包括
avro
json
line
multiline
plain
rubydebug
spool
輸入事件或輸出事件是完整的json文件,可以這樣配置(其中一種方式就可以)
input {
stdin { codec => "json" }
stdin { codec => json{} }
}
將每行輸入日誌作為一個事件,將每個輸出事件解碼成一行
input {
stdin { codec => line{} }
stdin { codec => "line" }
}
把多行日誌作為一個事件處理
input {
file {
path => "/var/log/someapp.log"
codec => multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => previous
}
}
}
rubydebug在輸出事件時使用,使用Ruby Awesome列印庫列印輸出事件
本作品採用《CC 協議》,轉載必須註明作者和本文連結