關於ELK的歷史跟作用在此就不說了,相信網上很多,大家都能夠搜到,在此我說下他們的安裝及使用。
一、logstash的下載及安裝
下載:wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz
解壓: tar –vzxf logstash-5.2.2.tar.gz
bin/logstash –f logstash.cnf
進行運行logstash.conf 配置文件裏面的設置
長期運行:一句話就可以搞定,如果想讓某命令在後臺長期運行,需要在命令前加 nohup,後面加 &
二、input配置
file插件
在logstash中可以在input裏面添加file配置,默認的最小化配置如下:
input {
file {
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/*"
}
}
filter {
}
output {
stdout {}
}
注意:文件路徑名用絕對路徑,並且支持globs寫法。
file插件還有一些其他的屬性。
file {
#監聽文件的路徑
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
#排除不想監聽的文件
exclude => "1.log"
#添加自定義的字段(在輸出結果中增加一個字段)
add_field => {"test"=>"test"}
#增加標籤
tags => "tag1"
#設置新事件的標誌
delimiter => "\n"
#設置多長時間掃描目錄,發現新文件
discover_interval => 15
#設置多長時間檢測文件是否修改
stat_interval => 1
#監聽文件的起始位置,默認是end
start_position => beginning
#監聽文件讀取信息記錄的位置
sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
#設置多長時間會寫入讀取的位置信息
sincedb_write_interval => 15
}
其中input常用的輸入源有:file,syslog,redis,log4j,apache log或nginx log等等
三、codec配置
output{
stdout{
codec=>json
codec=>json_lines{#如果你的json文件比較長,需要換行那麼就得用到json_lines的編碼方式了
}
}
multiline多行事件編碼
input{
stdin{
codec=>multiline{
charset=>...#字符編碼,可選
max_bytes=>#bytes類型,設置最大的字節數,可選
max_lines=>#number類型,設置最大的行數,默認是500行,可選
multiline_tag=>#string類型,設置一個事件標籤,默認是"multiline",可選
pattern=>...#string類型,設置匹配的正則表達式,必選
patterns_dir=>...#array類型,可以設置多個正則表達式,可選
negate=>...#boolean類型,設置正向匹配還是反向匹配,默認是false,可選
what=>...#設置未匹配的內容是向前合併還是向後合併,previous,next兩個值選擇,必選
}
}
}
四、filter配置
Grok正則
filter {
grok {
match => { "message" => "grok_pattern" }
}
}
這段代碼中除了grok_pattern以外都是logstash的關鍵字。grok_pattern部分需要使用者填充自己的解析方式。
grok_pattern由零個或多個%{SYNTAX:SEMANTIC}組成,其中SYNTAX是表達式的名字,是由grok提供的,例如數字表達式的名字是NUMBER,IP地址表達式的名字是IP。SEMANTIC表示解析出來的這個字符的名字,由自己定義,例如IP字段的名字可以是client。
對於下面的這條日誌
55.3.244.1 GET /index.html 15824 0.043
可以這樣解析
* client: 55.3.244.1
* method: GET
* request: /index.html
* bytes: 15824
* duration: 0.043
Date插件
filter {
grok {
match => ["message", "%{HTTPDATE:logdate}"]
}
date {
match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
}
}
數據修改( Mutate)
類型轉換是 filters/mutate 插件最初誕生時的唯一功能。可以設置的轉換類型包括:"integer","float" 和 "string"。示例如下:
filter {
mutate {
convert => ["request_time", "float"]
}
}
字符串處理:
Split分割
filter {
mutate {
split => ["message", "|"]
}
}
Join 僅對數組類型字段有效
我們在之前已經用 split
割切的基礎再 join
回去。配置改成:
filter {
mutate {
split => ["message","|"]
}
mutate {
join => ["message",","]
}
}
merge
合併兩個數組或者哈希字段。依然在之前 split 的基礎上繼續:
filter {
mutate {
split => ["message","|"]
}
mutate {
merge => ["message","message"]
}
}
Merge會將所有的裝進一個數組裏面
如果 src 字段是字符串,會自動先轉換成一個單元素的數組再合併。
GEOIP地址查詢歸類
filter {
geoip {
source => "message"
}
}
運行結果:
{
"message" => "183.60.92.253",
"@version" => "1",
"@timestamp" => "2014-08-07T10:32:55.610Z",
"host" => "raochenlindeMacBook-Air.local",
"geoip" => {
"ip" => "183.60.92.253",
"country_code2" => "CN",
"country_code3" => "CHN",
"country_name" => "China",
"continent_code" => "AS",
"region_name" => "30",
"city_name" => "Guangzhou",
"latitude" => 23.11670000000001,
"longitude" => 113.25,
"timezone" => "Asia/Chongqing",
"real_region_name" => "Guangdong",
"location" => [
[0] 113.25,
[1] 23.11670000000001
]
}
}
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"]
}
}
Split拆分事件:
filter {
split {
field => "message"
terminator => "#"
}
}
會分割成n個事件。
注意:split拆分事件後會直接進入到output階段,所有的split後的其他插件都不可以用了。
output配置
標準輸出:
output {
stdout {
codec => rubydebug
workers => 2
}
}
保存到文件:
output {
file {
path =>"/path/to/%{+yyyy/MM/dd/HH}/%{host}.log.gz"
message_format =>"%{message}"
gzip => true
}
}
輸出到elasticsearch
output {
elasticsearch {
host => "192.168.0.2"
protocol => "http"
index =>"logstash-%{type}-%{+YYYY.MM.dd}"
index_type => "%{type}"
workers => 5
template_overwrite => true
}
}
輸出到redis
input {stdin {} }
output {
redis {
data_type => "channel"
key =>"logstash-chan-%{+yyyy.MM.dd}"
}
}