1. 程式人生 > >ELK-logstash

ELK-logstash

elk

logstash簡介:

logstash日誌分析的配置和使用

logstash是一個數據分析軟件,主要目的是分析log日誌。整一套軟件可以當作一個MVC模型,logstash是controller層,Elasticsearch是一個model層,kibana是view層。


首先將數據傳給logstash,它將數據進行過濾和格式化(轉成JSON格式),然後傳給Elasticsearch進行存儲、建搜索的索引,kibana提供前端的頁面再進行搜索和圖表可視化,它是調用Elasticsearch的接口返回的數據進行可視化。logstash和Elasticsearch是用Java寫的,kibana使用node.js框架。


官網地址:https://www.elastic.co/downloads/logstash

安裝:

yum安裝

rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch

cat > /etc/yum.repos.d/logstash.repo <<EOF

[logstash-5.0]

name=logstash repository for 5.0.x packages

baseurl=http://packages.elasticsearch.org/logstash/5.0/centos

gpgcheck=1

gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch

enabled=1

EOF

yum clean all

yum install logstash

或者官網下載安裝

tar zxf logstash.tar.gz


語法:

Logstash 設計了自己的 DSL —— 有點像 Puppet 的 DSL,或許因為都是用 Ruby語言寫的吧 —— 包括有區域,註釋,數據類型(布爾值,字符串,數值,數組,哈希),條件判斷,字段引用等。

區段(section)

Logstash 用 {} 來定義區域。區域內可以包括插件區域定義,你可以在一個區域內定義多個插件。插件區域內則可以定義鍵值對設置。


數據類型

Logstash 支持少量的數據值類型:

bool #布爾值

debug => true

string #字符串

host => "hostname"

number #數值

port => 514

array #數組

match => ["datetime", "UNIX", "ISO8601"]

hash #哈希

options => {

key1 => "value1",

key2 => "value2"

}

字段引用(field reference)

如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字寫在中括號 []裏就行了,這就叫字段引用。

條件判斷(condition)

Logstash從 1.3.0 版開始支持條件判斷和表達式。

表達式支持下面這些操作符:

== (等於), != (不等於), < (小於), > (大於), <= (小於等於), >= (大於等

於)

=~ (匹配正則), !~ (不匹配正則)

in (包含), not in (不包含)

and (與), or (或), nand(非與), xor(非或)

() (復合表達式), !() (對復合表達式結果取反)

logstash命令行參數:

-e:意在執行。直接運行 bin/logstash -e ” 達到相同效果。這個參數的默認值是下面這樣:

input {

stdin { }

}

output {

stdout { }

}

–config 或 -f

意即文件。真實運用中,我們會寫很長的配置,甚至可能超過 shell 所能支持的1024 個字符長度。所以我們必把配置固化到文件裏,然後通過 bin/logstash -f agent.conf 這樣的形式來運行。 此外,logstash 還提供一個方便我們規劃和書寫配置的小功能。你可以直接用

bin/logstash -f /etc/logstash.d/

來運行。logstash 會自動讀取

/etc/logstash.d/ 目錄下所有 *.conf 的文本文件,然後在自己內存裏拼接成一個完整的大配置文件,再去執行。

註意:

logstash 列出目錄下所有文件時,是字母排序的。而 logstash 配置段的 filter 和output 都是順序執行,所以順序非常重要。采用多文件管理的用戶,推薦采用數字編號方式命名配置文件,同時在配置中,嚴謹采用 if 判斷限定不同日誌的動作。

–configtest 或 -t

意即測試。用來測試 Logstash 讀取到的配置文件語法是否能正常解析。Logstash配置語法是用 grammar.treetop 定義的。尤其是使用了上一條提到的讀取目錄方式的讀者,尤其要提前測試。


–log 或 -l

意即日誌。Logstash 默認輸出日誌到標準錯誤。生產環境下你可以通過bin/logstash -l logs/logstash.log 命令來統一存儲日誌。


–pipeline-workers 或 -w

運行 filter 和 output 的 pipeline 線程數量。默認是 CPU 核數。


–pipeline-batch-size 或 -b

每個 Logstash pipeline 線程,在執行具體的 filter 和 output 函數之前,最多能累積的日誌條數。默認是 125 條。越大性能越好,同樣也會消耗越多的 JVM 內存。


–pipeline-batch-delay 或 -u

每個 Logstash pipeline 線程,在打包批量日誌的時候,最多等待幾毫秒。默認是 5ms。


–pluginpath 或 -P

可以寫自己的插件,然後用

bin/logstash --pluginpath /path/to/own/plugins 加載它們。


–verbose

輸出一定的調試日誌。

–debug

輸出更多的調試日誌。


plugin的安裝

plugin 用法說明

Usage:

bin/logstash-plugin [OPTIONS] SUBCOMMAND [ARG] ...

Parameters:

SUBCOMMAND subcommand

[ARG] ... subcommand arguments

Subcommands:

install Install a plugin

uninstall Uninstall a plugin

update Install a plugin

list List all installed plugins

Options:

-h, --help print help

首先,你可以通過 bin/logstash-plugin list 查看本機現在有多少插件可用。(其實就在 vendor/bundle/jruby/1.9/gems/ 目錄下)

本地插件安裝

bin/logstash-plugin 不單可以通過 rubygems 平臺安裝插件,還可以讀取本地路徑的 gem 文件。這對自定義插件或者無外接網絡的環境都非常有效。例:

bin/logstash-plugin install /path/to/logstash-filter-crash.gem

然後,假如你看到 https://github.com/logstash-plugins/ 下新發布了一個logstash-output-webhdfs 模塊(當然目前還沒有)。打算試試,就只需要運行:

bin/logstash-plugin install logstash-output-webhdfs


同樣,假如是升級,只需要運行:

bin/logstash-plugin update logstash-input-tcp


運行:

# bin/logstash -e ‘input{stdin{}}output{stdout{codec=>rubydebug}}‘

hello world

結果:

{

"message" => "Hello World",

"@version" => "1",

"@timestamp" => "2014-08-07T10:30:59.937Z",

"host" => "raochenlindeMacBook-Air.local",

}

長期運行:nohup bin/logstash -f /path/conf.d/logstash.conf &

input配置:

讀取文件:

Logstash 使用一個名叫 FileWatch 的 Ruby Gem 庫來監聽文件變化。這個庫支持glob 展開文件路徑,而且會記錄一個叫 .sincedb 的數據庫文件來跟蹤被監聽的日

誌文件的當前讀取位置。所以,不要擔心 logstash 會漏過你的數據。

input {

file {

path => ["/var/log/*.log", "/var/log/message"]

type => "system"

start_position => "beginning"

}

}

解釋

有一些比較有用的配置項,可以用來指定 FileWatch 庫的行為:

discover_interval

logstash 每隔多久去檢查一次被監聽的 path 下是否有新文件。默認值是 15秒。

exclude

不想被監聽的文件可以排除出去,這裏跟 path 一樣支持 glob 展開。

close_older

一個已經監聽中的文件,如果超過這個值的時間內沒有更新內容,就關閉監聽它的文件句柄。默認是 3600 秒,即一小時。

ignore_older

在每次檢查文件列表的時候,如果一個文件的最後修改時間超過這個值,就忽略這個文件。默認是 86400 秒,即一天。

sincedb_path

如果你不想用默認的 $HOME/.sincedb (Windows 平臺上在C:\Windows\System32\config\systemprofile\.sincedb ),可以通過這個配置定義 sincedb 文件到其他位置。


sincedb_write_interval

logstash 每隔多久寫一次 sincedb 文件,默認是 15 秒。


stat_interval

logstash 每隔多久檢查一次被監聽文件狀態(是否有更新),默認是 1 秒。


start_position

logstash 從什麽位置開始讀取文件數據,默認是結束位置,也就是說 logstash 進程會以類似 tail -F 的形式運行。如果你是要導入原有數據,把這個設定改成"beginning",logstash 進程就從頭開始讀取,類似 less +F 的形式運行。


註意

1. 通常你要導入原有數據進 Elasticsearch 的話,你還需要 filter/date 插件來修改默認的"@timestamp" 字段值。

2. FileWatch 只支持文件的絕對路徑,而且會不自動遞歸目錄。所以有需要的話,請用數組方式都寫明具體哪些文件。

3. LogStash::Inputs::File 只是在進程運行的註冊階段初始化一個 FileWatch 對象。所以它不能支持類似 fluentd 那樣的 path => "/path/to/% {+yyyy/MM/dd/hh}.log" 寫法。達到相同目的,你只能寫成 path => "/path/to/*/*/*/*.log" 。FileWatch 模塊提供了一個稍微簡單一點的寫法: /path/to/**/*.log ,用 ** 來縮寫表示遞歸全部子目錄。

4. 在單個 input/file 中監聽的文件數量太多的話,每次啟動掃描構建監聽隊列會消耗較多的時間。給使用者的感覺好像讀取不到一樣,這是正常現象。

5. start_position 僅在該文件從未被監聽過的時候起作用。如果 sincedb 文件中已經有這個文件的 inode 記錄了,那麽 logstash 依然會從記錄過的 pos開始讀取數據。所以重復測試的時候每回需要刪除 sincedb 文件(官方博客上提供了另一個巧妙的思路:將 sincedb_path 定義為 /dev/null ,則每次重啟自動從頭開始讀)。

6. 因為 windows 平臺上沒有 inode 的概念,Logstash 某些版本在 windows 平臺上監聽文件不是很靠譜。windows 平臺上,推薦考慮使用 nxlog 作為收集端


標準輸入(stdin):

配置示例

input {

stdin {

add_field => {"key" => "value"}

codec => "plain"

tags => ["add"]

type => "std"

}

}


運行結果


{

"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 {

}

}

}


合並多行數據(Multiline)

有些時候,應用程序調試日誌會包含非常豐富的內容,為一個事件打印出很多行內容。這種日誌通常都很難通過命令行解析的方式做分析。而 logstash 正為此準備好了 codec/multiline 插件!

小貼士:multiline 插件也可以用於其他類似的堆棧式信息,比如 linux 的內核日誌。


配置示例

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 輸出下面這樣的返回:codec配置

{

"@timestamp" => "2014-08-09T13:32:03.368Z",

"message" => "[Aug/08/08 14:54:03] hello world\n",

"@version" => "1",

"host" => "raochenlindeMacBook-Air.local"

}

{

"@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"

}

你看,後面這個事件,在 "message" 字段裏存儲了三行數據!

你可能註意到輸出的事件中都沒有最後的"the end"字符串。這是因為你最後輸入的回車符 \n 並不匹配設定的 ^\[ 正則表達式,logstash 還得等下一行數據直到匹配成功後才會輸出這個事件。

解釋

其實這個插件的原理很簡單,就是把當前行的數據添加到前面一行後面,,直到新進的當前行匹配 ^\[ 正則為止。這個正則還可以用 grok 表達式。



ELK-logstash