ELK-logstash
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