ELK学习笔记之Logstash详解
0x00 Logstash概述
官方介紹:Logstash is an open source data collection engine with real-time pipelining capabilities。簡(jiǎn)單來(lái)說(shuō)logstash就是一根具備實(shí)時(shí)數(shù)據(jù)傳輸能力的管道,負(fù)責(zé)將數(shù)據(jù)信息從管道的輸入端傳輸?shù)焦艿赖妮敵龆?#xff1b;與此同時(shí)這根管道還可以讓你根據(jù)自己的需求在中間加上濾網(wǎng),Logstash提供里很多功能強(qiáng)大的濾網(wǎng)以滿足你的各種應(yīng)用場(chǎng)景。
Logstash常用于日志關(guān)系系統(tǒng)中做日志采集設(shè)備,最常用于ELK(elasticsearch + logstash + kibane)中作為日志收集器使用;
官網(wǎng)介紹
從 Logstash 的名字就能看出,它主要負(fù)責(zé)跟日志相關(guān)的各類操作,在此之前,我們先來(lái)看看日志管理的三個(gè)境界吧
境界一 『昨夜西風(fēng)凋碧樹(shù)。獨(dú)上高樓,望盡天涯路』,在各臺(tái)服務(wù)器上用傳統(tǒng)的 linux 工具(如 cat, tail, sed, awk, grep 等)對(duì)日志進(jìn)行簡(jiǎn)單的分析和處理,基本上可以認(rèn)為是命令級(jí)別的操作,成本很低,速度很快,但難以復(fù)用,也只能完成基本的操作。境界二 『衣帶漸寬終不悔,為伊消得人憔悴』,服務(wù)器多了之后,分散管理的成本變得越來(lái)越多,所以會(huì)利用 rsyslog 這樣的工具,把各臺(tái)機(jī)器上的日志匯總到某一臺(tái)指定的服務(wù)器上,進(jìn)行集中化管理。這樣帶來(lái)的問(wèn)題是日志量劇增,小作坊式的管理基本難以滿足需求。境界三 『眾里尋他千百度,驀然回首,那人卻在燈火闌珊處』,隨著日志量的增大,我們從日志中獲取去所需信息,并找到各類關(guān)聯(lián)事件的難度會(huì)逐漸加大,這個(gè)時(shí)候,就是 Logstash 登場(chǎng)的時(shí)候了Logstash 的主要優(yōu)勢(shì),一個(gè)是在支持各類插件的前提下提供統(tǒng)一的管道進(jìn)行日志處理(就是 input-filter-output 這一套),二個(gè)是靈活且性能不錯(cuò)
logstash里面最基本的概念(先不管codec)
logstash收集日志基本流程:
input–>filter–>output input:從哪里收集日志filter:對(duì)日志進(jìn)行過(guò)濾output:輸出哪里0x01?Logstash架構(gòu)
Logstash 是由 JRuby 編寫的,使用基于消息的簡(jiǎn)單架構(gòu),在 JVM 上運(yùn)行。理念非常簡(jiǎn)單,如果說(shuō) MapReduce 框架分為 Mapper 和 Reducer 兩大模塊,那么 Logstash?有
Collect: 數(shù)據(jù)輸入。對(duì)應(yīng) input Enrich: 數(shù)據(jù)處理。對(duì)應(yīng) filter Transport: 數(shù)據(jù)輸出。對(duì)應(yīng) outputLogstash的事件(logstash將數(shù)據(jù)流中等每一條數(shù)據(jù)稱之為一個(gè)event)處理流水線有三個(gè)主要角色完成:inputs –> filters –> outputs:
inpust:必須,負(fù)責(zé)產(chǎn)生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats) filters:可選,負(fù)責(zé)數(shù)據(jù)處理與轉(zhuǎn)換(filters modify them),常用:grok、mutate、drop、clone、geoip outpus:必須,負(fù)責(zé)數(shù)據(jù)輸出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd雖然模塊僅僅比 MapReduce 框架多了一個(gè),但是無(wú)三不成幾,通過(guò)不同的拓?fù)浣Y(jié)構(gòu),可以完成各類數(shù)據(jù)處理應(yīng)用。不過(guò)這里我們主要還是以日志匯總處理系統(tǒng)的思路來(lái)進(jìn)行介紹,一個(gè)典型的架構(gòu)為:
0x02?Logstash安裝
1. 環(huán)境清單
- 操作系統(tǒng):CentOS Linux release 7.3.1611
- Logstash版本:logstash-5.4.1
- Jdk版本:1.8.0_131
2. 軟件下載
- 下載Jdk:
- 下載Logstash:
3. 安裝Jdk
- 創(chuàng)建安裝目錄
- 解壓縮安裝文件
- 測(cè)試安裝是否成功
- 配置JAVA_HOME環(huán)境變量
4.?安裝Logstash
- 創(chuàng)建安裝目錄
- 解壓縮安裝文件
測(cè)試安裝是否成功
- 測(cè)試一、快速啟動(dòng),標(biāo)準(zhǔn)輸入輸出作為input和output,沒(méi)有filter
- 測(cè)試二、在測(cè)試一堆基礎(chǔ)上加上codec進(jìn)行格式化輸出
0x03?Logstash參數(shù)與配置
Logstash宏觀的配置文件內(nèi)容格式如下:
# 輸入 input {... }# 過(guò)濾器 filter {... }# 輸出 output {... }配置文件參考
input {# 從文件讀取日志信息file {path => "/var/log/error.log"type => "error"//type是給結(jié)果增加一個(gè)type屬性,值為"error"的條目start_position => "beginning"//從開(kāi)始位置開(kāi)始讀取# 使用 multiline 插件,傳說(shuō)中的多行合并codec => multiline {# 通過(guò)正則表達(dá)式匹配,具體配置根據(jù)自身實(shí)際情況而定pattern => "^\d"negate => truewhat => "previous"}} }#可配置多種處理規(guī)則,他是有順序,所以通用的配置寫下面 # filter { # grok { # match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }} # }output {# 輸出到 elasticsearchelasticsearch {hosts => ["192.168.22.41:9200"]index => "error-%{+YYYY.MM.dd}"//索引名稱} }上面的file可以配置多個(gè):
file { type => "tms_inbound.log" path => "/JavaWeb/tms2.wltest.com/logs/tms_inbound.es.*.log" codec => json { charset => "UTF-8" } } file { type => "tms_outbound.log" path => "/JavaWeb/tms2.wltest.com/logs/tms_outbound.es.*.log" codec => json { charset => "UTF-8" } }1. 常用啟動(dòng)參數(shù)
2. 配置文件結(jié)構(gòu)及語(yǔ)法
-
區(qū)段
??Logstash通過(guò){}來(lái)定義區(qū)域,區(qū)域內(nèi)可以定義插件,一個(gè)區(qū)域內(nèi)可以定義多個(gè)插件,如下:
- 數(shù)據(jù)類型
?? Logstash僅支持少量的數(shù)據(jù)類型:
? Boolean:ssl_enable => true
? Number:port => 33
? String:name => “Hello world”
? Commonts:# this is a comment
- 字段引用
?? Logstash數(shù)據(jù)流中的數(shù)據(jù)被稱之為Event對(duì)象,Event以JSON結(jié)構(gòu)構(gòu)成,Event的屬性被稱之為字段,如果你像在配置文件中引用這些字段,只需要把字段的名字寫在中括號(hào)[]里就行了,如[type],對(duì)于嵌套字段每層字段名稱都寫在[]里就可以了,比如:[tags][type];除此之外,對(duì)于Logstash的arrag類型支持下標(biāo)與倒序下表,如:[tags][type][0],[tags][type][-1]。
- 條件判斷
?? Logstash支持下面的操作符:
? equality:==, !=, <, >, <=, >=
? regexp:=~, !~
? inclusion:in, not in
? boolean:and, or, nand, xor
? unary:!
??例如:
if EXPRESSION {... } else if EXPRESSION {... } else {... }- 環(huán)境變量引用
?? Logstash支持引用系統(tǒng)環(huán)境變量,環(huán)境變量不存在時(shí)可以設(shè)置默認(rèn)值,例如:
export TCP_PORT=12345 input {tcp {port => "${TCP_PORT:54321}"} }0x04?常用輸入插件(Input?Plug)
1. File讀取插件
?文件讀取插件主要用來(lái)抓取文件的變化信息,將變化信息封裝成Event進(jìn)程處理或者傳遞。
- 配置事例
- 常用參數(shù)
2. Beats監(jiān)聽(tīng)插件
Beats插件用于建立監(jiān)聽(tīng)服務(wù),接收Filebeat或者其他beat發(fā)送的Events;
- 配置事例
- 常用參數(shù)(空 => 同上)
3. TCP監(jiān)聽(tīng)插件
TCP插件有兩種工作模式,“Client”和“Server”,分別用于發(fā)送網(wǎng)絡(luò)數(shù)據(jù)和監(jiān)聽(tīng)網(wǎng)絡(luò)數(shù)據(jù)。
- 配置事例
- 常用參數(shù)(空 => 同上)
?
4. Redis讀取插件
用于讀取Redis中緩存的數(shù)據(jù)信息。
- 最小化配置
- 詳細(xì)配置
5. Syslog監(jiān)聽(tīng)插件
監(jiān)聽(tīng)操作系統(tǒng)syslog信息
- 配置事例
- 輸出至屏幕
- 修改rsyslog配置文件
- 輸出至es
0x05?常用過(guò)濾插件(Filter plugin)
豐富的過(guò)濾器插件的是 logstash威力如此強(qiáng)大的重要因素,過(guò)濾器插件主要處理流經(jīng)當(dāng)前Logstash的事件信息,可以添加字段、移除字段、轉(zhuǎn)換字段類型,通過(guò)正則表達(dá)式切分?jǐn)?shù)據(jù)等,也可以根據(jù)條件判斷來(lái)進(jìn)行不同的數(shù)據(jù)處理方式。
1. grok正則捕獲
??grok 是Logstash中將非結(jié)構(gòu)化數(shù)據(jù)解析成結(jié)構(gòu)化數(shù)據(jù)以便于查詢的最好工具,非常適合解析syslog logs,apache log, mysql log,以及一些其他的web log
預(yù)定義表達(dá)式調(diào)用
??Logstash提供120個(gè)常用正則表達(dá)式可供安裝使用,安裝之后你可以通過(guò)名稱調(diào)用它們,語(yǔ)法如下:%{SYNTAX:SEMANTIC}
??SYNTAX:表示已經(jīng)安裝的正則表達(dá)式的名稱
??SEMANTIC:表示從Event中匹配到的內(nèi)容的名稱
??例如:Event的內(nèi)容為“[debug] 127.0.0.1 - test log content”,匹配%{IP:client}將獲得“client: 127.0.0.1”的結(jié)果,前提安裝了IP表達(dá)式;如果你在捕獲數(shù)據(jù)時(shí)想進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換可以使用%{NUMBER:num:int}這種語(yǔ)法,默認(rèn)情況下,所有的返回結(jié)果都是string類型,當(dāng)前Logstash所支持的轉(zhuǎn)換類型僅有“int”和“float”;
??一個(gè)稍微完整一點(diǎn)的事例:
? 日志文件http.log內(nèi)容:55.3.244.1 GET /index.html 15824 0.043
? 表達(dá)式:%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
? 配置文件內(nèi)容:
input {file {path => "/var/log/http.log"} } filter {grok {match => {"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}} }輸出結(jié)果:
client: 55.3.244.1 method: GET request: /index.html bytes: 15824 duration: 0.043- 自定義表達(dá)式調(diào)用
語(yǔ)法:(?<field_name>the pattern here)
舉例:捕獲10或11和長(zhǎng)度的十六進(jìn)制queue_id可以使用表達(dá)式(?<queue_id>[0-9A-F]{10,11})
- 安裝自定義表達(dá)式
?? 與預(yù)定義表達(dá)式相同,你也可以將自定義的表達(dá)式配置到Logstash中,然后就可以像于定義的表達(dá)式一樣使用;以下是操作步驟說(shuō)明:
?? 1、在Logstash根目錄下創(chuàng)建文件夾“patterns”,在“patterns”文件夾中創(chuàng)建文件“extra”(文件名稱無(wú)所謂,可自己選擇有意義的文件名稱);
?? 2、在文件“extra”中添加表達(dá)式,格式:patternName regexp,名稱與表達(dá)式之間用空格隔開(kāi)即可,如下:
# contents of ./patterns/postfix: POSTFIX_QUEUEID [0-9A-F]{10,11}3、使用自定義的表達(dá)式時(shí)需要指定“patterns_dir”變量,變量?jī)?nèi)容指向表達(dá)式文件所在的目錄,舉例如下:
## 日志內(nèi)容 ## Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com>?
## Logstash配置 ## filter {grok {patterns_dir => ["./patterns"]match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }} }?
## 運(yùn)行結(jié)果 ## timestamp: Jan 1 06:25:43 logsource: mailserver14 program: postfix/cleanup pid: 21403 queue_id: BEF25A72965- grok常用配置參數(shù)(空 => 同上)
- 其他
- 一般的正則表達(dá)式只能匹配單行文本,如果一個(gè)Event的內(nèi)容為多行,可以在pattern前加“(?m)”
- 對(duì)于Hash和Array類型,Hash表示鍵值對(duì),Array表示數(shù)組
- Grok表達(dá)式在線debug地址:http://grokdebug.herokuapp.com
- 預(yù)定義正則表達(dá)式參考地址:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
?
2. date時(shí)間處理插件
??該插件用于時(shí)間字段的格式轉(zhuǎn)換,比如將“Apr 17 09:32:01”(MMM dd HH:mm:ss)轉(zhuǎn)換為“MM-dd HH:mm:ss”。而且通常情況下,Logstash會(huì)為自動(dòng)給Event打上時(shí)間戳,但是這個(gè)時(shí)間戳是Event的處理時(shí)間(主要是input接收數(shù)據(jù)的時(shí)間),和日志記錄時(shí)間會(huì)存在偏差(主要原因是buffer),我們可以使用此插件用日志發(fā)生時(shí)間替換掉默認(rèn)是時(shí)間戳的值。
- 常用配置參數(shù)(空 => 同上)
3. mutate數(shù)據(jù)修改插件
mutate 插件是 Logstash另一個(gè)重要插件。它提供了豐富的基礎(chǔ)類型數(shù)據(jù)處理能力。可以重命名,刪除,替換和修改事件中的字段。
# logstash-filter-mutate 插件是Logstash 另一個(gè)重要插件,它提供了豐富的基礎(chǔ)類型數(shù)據(jù)處理能力,包括類型轉(zhuǎn)換,字符串處理和字段處理等#1.類型轉(zhuǎn)換#類型轉(zhuǎn)換是logstash-filter-mutate 插件最初誕生時(shí)的唯一功能,#可以設(shè)置的轉(zhuǎn)換類型包括:"integer","float" 和 "string"。示例如下:input {stdin {}}filter {grok {match =>{"message" =>"(?<request_time>\d+(?:\.\d+)?)"} } } output {stdout {codec =>rubydebug} }[elk@Vsftp logstash]$ logstash -f t2.conf Settings: Default pipeline workers: 4 Pipeline main started 23.45 {"message" => "23.45","@version" => "1","@timestamp" => "2017-01-11T02:07:33.581Z","host" => "Vsftp","request_time" => "23.45" }#字符串 轉(zhuǎn)換為float型[elk@Vsftp logstash]$ cat t2.conf input {stdin {}}filter {grok {match =>{"message" =>"(?<request_time>\d+(?:\.\d+)?)"}}mutate {convert => ["request_time", "float"] } } output {stdout {codec =>rubydebug} }[elk@Vsftp logstash]$ logstash -f t2.conf Settings: Default pipeline workers: 4 Pipeline main started 23.45 {"message" => "23.45","@version" => "1","@timestamp" => "2017-01-11T02:10:07.045Z","host" => "Vsftp",#字符串轉(zhuǎn)換成數(shù)值型:[elk@Vsftp logstash]$ cat t2.conf input {stdin {}}filter {grok {match =>{"message" =>"(?<request_time>\d+(?:\.\d+)?)"}}mutate {convert => ["request_time", "integer"] } } output {stdout {codec =>rubydebug} }[elk@Vsftp logstash]$ logstash -f t2.conf Settings: Default pipeline workers: 4 Pipeline main started 23.45 {"message" => "23.45","@version" => "1","@timestamp" => "2017-01-11T02:11:21.071Z","host" => "Vsftp","request_time" => 234. JSON插件
JSON插件用于解碼JSON格式的字符串,一般是一堆日志信息中,部分是JSON格式,部分不是的情況下
- 配置事例
?
## 事例配置,message是JSON格式的字符串:"{\"uid\":3081609001,\"type\":\"signal\"}" ## filter {json {source => "message"target => "jsoncontent"} }?
## 輸出結(jié)果 ## {"@version": "1","@timestamp": "2014-11-18T08:11:33.000Z","host": "web121.mweibo.tc.sinanode.com","message": "{\"uid\":3081609001,\"type\":\"signal\"}","jsoncontent": {"uid": 3081609001,"type": "signal"} } ## 如果從事例配置中刪除`target`,輸出結(jié)果如下 ## {"@version": "1","@timestamp": "2014-11-18T08:11:33.000Z","host": "web121.mweibo.tc.sinanode.com","message": "{\"uid\":3081609001,\"type\":\"signal\"}","uid": 3081609001,"type": "signal" }- 常用配置參數(shù)(空 => 同上)
5. elasticsearch查詢過(guò)濾插件
用于查詢Elasticsearch中的事件,可將查詢結(jié)果應(yīng)用于當(dāng)前事件中
- 常用配置參數(shù)(空 => 同上)
?
6. 其他
??還有很多其他有用插件,如:Split、GeoIP、Ruby,這里就不一一寫了,等以后用到再補(bǔ)充
0x06 常用輸出插件(Output plugin)
1. ElasticSearch輸出插件
用于將事件信息寫入到Elasticsearch中,官方推薦插件,ELK必備插件
- 配置事例
- 常用配置參數(shù)(空 => 同上)
2、Redis輸出插件
??用于將Event寫入Redis中進(jìn)行緩存,通常情況下Logstash的Filter處理比較吃系統(tǒng)資源,復(fù)雜的Filter處理會(huì)非常耗時(shí),如果Event產(chǎn)生速度比較快,可以使用Redis作為buffer使用
- 配置事例
- 常用配置參數(shù)(空 => 同上)
3. File輸出插件
用于將Event輸出到文件內(nèi)
- 配置事例
- 常用配置參數(shù)(空 => 同上)
4. TCP插件
??Write events over a TCP socket.Each event json is separated by a newline.Can either accept connections from clients or connect to a server, depending on mode.
- 配置事例
- 常用配置參數(shù)(空 => 同上)
0x07?常用編碼插件(Codec plugin)
1. JSON編碼插件
直接輸入預(yù)定義好的 JSON 數(shù)據(jù),這樣就可以省略掉 filter/grok 配置
- 配置事例
- 常用配置參數(shù)
?
0x08?Logstash實(shí)例
1. 接收Filebeat事件,輸出到Redis
input {beats {port => 5044} }output {redis {host => "127.0.0.1"port => 6379data_type => "list"key => "logstash-list"} }2. 讀取Redis數(shù)據(jù),根據(jù)“type”判斷,分別處理,輸出到ES
input {redis {host => "127.0.0.1"port => 6379data_type => "list"key => "logstash-list"} }filter {if [type] == "application" {grok {match => ["message", "(?m)-(?<systemName>.+?):(?<logTime>(?>\d\d){1,2}-(?:0?[1-9]|1[0-2])-(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) (?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?)) \[(?<level>(\b\w+\b)) *\] (?<thread>(\b\w+\b)) \((?<point>.*?)\) - (?<content>.*)"]}date {match => ["logTime", "yyyy-MM-dd HH:mm:ss,SSS"]}json {source => "message"}date {match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]}}if [type] == "application_bizz" {json {source => "message"}date {match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]}}mutate {remove_field => ["@version", "beat", "logTime"]} }output {stdout{}elasticsearch {hosts => ["127.0.0.1:9200"]index => "filebeat-%{type}-%{+yyyy.MM.dd}"document_type => "%{documentType}"template_overwrite => true} }0x09?Logstash注意事項(xiàng)
- 問(wèn)題記錄
啟動(dòng)logstash慢,輸入./bin/logstash沒(méi)有反應(yīng),多出現(xiàn)在新安裝的操作系統(tǒng)上
- 原因
?? jruby啟動(dòng)的時(shí)候jdk回去從/dev/random中初始化隨機(jī)數(shù)熵,新版本的jruby會(huì)用RPNG算法產(chǎn)生隨后的隨機(jī)數(shù),但是舊版本的jruby會(huì)持續(xù)從/dev/random中獲取數(shù)字。但是不幸的是,random發(fā)生器會(huì)跟不上生成速度,所以獲取隨機(jī)數(shù)的過(guò)程會(huì)被阻塞,直到隨機(jī)數(shù)池?fù)碛凶銐虻撵厝缓蠡謴?fù)。這在某些系統(tǒng)上,尤其是虛擬化系統(tǒng),熵?cái)?shù)池可能會(huì)比較小從而會(huì)減慢jruby的啟動(dòng)速度。
?? 檢查一下系統(tǒng)的熵?cái)?shù)池 cat /proc/sys/kernel/random/entropy_avail,正常情況這個(gè)數(shù)字推薦大于1000,對(duì)比了一下獨(dú)立主機(jī)的這個(gè)數(shù)值,大約在700-900之間晃悠。
- 解決
?? 使用偽隨機(jī),編輯/usr/local/logstash/logstash-5.4.1/config/jvm.options,在最后增加一行:-Djava.security.egd=file:/dev/urandom
- 參考
https://github.com/elastic/logstash/issues/5507
http://www.tuicool.com/articles/jEBBZbb
"Trust the computer, he is your Friend."
隨筆 - 571??文章 - 0??評(píng)論 - 38??閱讀 -?65萬(wàn)
ELK學(xué)習(xí)筆記之Logstash詳解
閱讀目錄
- 0x00 Logstash概述
- 0x01?Logstash架構(gòu)
- 0x02?Logstash安裝
- 0x03?Logstash參數(shù)與配置
- 0x04?常用輸入插件(Input?Plug)
- 0x05?常用過(guò)濾插件(Filter plugin)
- 0x06 常用輸出插件(Output plugin)
- 0x07?常用編碼插件(Codec plugin)
- 0x08?Logstash實(shí)例
- 0x09?Logstash注意事項(xiàng)
- 參考
0x00 Logstash概述
官方介紹:Logstash is an open source data collection engine with real-time pipelining capabilities。簡(jiǎn)單來(lái)說(shuō)logstash就是一根具備實(shí)時(shí)數(shù)據(jù)傳輸能力的管道,負(fù)責(zé)將數(shù)據(jù)信息從管道的輸入端傳輸?shù)焦艿赖妮敵龆?#xff1b;與此同時(shí)這根管道還可以讓你根據(jù)自己的需求在中間加上濾網(wǎng),Logstash提供里很多功能強(qiáng)大的濾網(wǎng)以滿足你的各種應(yīng)用場(chǎng)景。
Logstash常用于日志關(guān)系系統(tǒng)中做日志采集設(shè)備,最常用于ELK(elasticsearch + logstash + kibane)中作為日志收集器使用;
官網(wǎng)介紹
從 Logstash 的名字就能看出,它主要負(fù)責(zé)跟日志相關(guān)的各類操作,在此之前,我們先來(lái)看看日志管理的三個(gè)境界吧
境界一 『昨夜西風(fēng)凋碧樹(shù)。獨(dú)上高樓,望盡天涯路』,在各臺(tái)服務(wù)器上用傳統(tǒng)的 linux 工具(如 cat, tail, sed, awk, grep 等)對(duì)日志進(jìn)行簡(jiǎn)單的分析和處理,基本上可以認(rèn)為是命令級(jí)別的操作,成本很低,速度很快,但難以復(fù)用,也只能完成基本的操作。境界二 『衣帶漸寬終不悔,為伊消得人憔悴』,服務(wù)器多了之后,分散管理的成本變得越來(lái)越多,所以會(huì)利用 rsyslog 這樣的工具,把各臺(tái)機(jī)器上的日志匯總到某一臺(tái)指定的服務(wù)器上,進(jìn)行集中化管理。這樣帶來(lái)的問(wèn)題是日志量劇增,小作坊式的管理基本難以滿足需求。境界三 『眾里尋他千百度,驀然回首,那人卻在燈火闌珊處』,隨著日志量的增大,我們從日志中獲取去所需信息,并找到各類關(guān)聯(lián)事件的難度會(huì)逐漸加大,這個(gè)時(shí)候,就是 Logstash 登場(chǎng)的時(shí)候了Logstash 的主要優(yōu)勢(shì),一個(gè)是在支持各類插件的前提下提供統(tǒng)一的管道進(jìn)行日志處理(就是 input-filter-output 這一套),二個(gè)是靈活且性能不錯(cuò)
logstash里面最基本的概念(先不管codec)
logstash收集日志基本流程:
input–>filter–>output input:從哪里收集日志filter:對(duì)日志進(jìn)行過(guò)濾output:輸出哪里0x01?Logstash架構(gòu)
Logstash 是由 JRuby 編寫的,使用基于消息的簡(jiǎn)單架構(gòu),在 JVM 上運(yùn)行。理念非常簡(jiǎn)單,如果說(shuō) MapReduce 框架分為 Mapper 和 Reducer 兩大模塊,那么 Logstash?有
Collect: 數(shù)據(jù)輸入。對(duì)應(yīng) input Enrich: 數(shù)據(jù)處理。對(duì)應(yīng) filter Transport: 數(shù)據(jù)輸出。對(duì)應(yīng) outputLogstash的事件(logstash將數(shù)據(jù)流中等每一條數(shù)據(jù)稱之為一個(gè)event)處理流水線有三個(gè)主要角色完成:inputs –> filters –> outputs:
inpust:必須,負(fù)責(zé)產(chǎn)生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats) filters:可選,負(fù)責(zé)數(shù)據(jù)處理與轉(zhuǎn)換(filters modify them),常用:grok、mutate、drop、clone、geoip outpus:必須,負(fù)責(zé)數(shù)據(jù)輸出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd雖然模塊僅僅比 MapReduce 框架多了一個(gè),但是無(wú)三不成幾,通過(guò)不同的拓?fù)浣Y(jié)構(gòu),可以完成各類數(shù)據(jù)處理應(yīng)用。不過(guò)這里我們主要還是以日志匯總處理系統(tǒng)的思路來(lái)進(jìn)行介紹,一個(gè)典型的架構(gòu)為:
0x02?Logstash安裝
1. 環(huán)境清單
- 操作系統(tǒng):CentOS Linux release 7.3.1611
- Logstash版本:logstash-5.4.1
- Jdk版本:1.8.0_131
2. 軟件下載
- 下載Jdk:
- 下載Logstash:
3. 安裝Jdk
- 創(chuàng)建安裝目錄
- 解壓縮安裝文件
- 測(cè)試安裝是否成功
- 配置JAVA_HOME環(huán)境變量
4.?安裝Logstash
- 創(chuàng)建安裝目錄
- 解壓縮安裝文件
測(cè)試安裝是否成功
- 測(cè)試一、快速啟動(dòng),標(biāo)準(zhǔn)輸入輸出作為input和output,沒(méi)有filter
- 測(cè)試二、在測(cè)試一堆基礎(chǔ)上加上codec進(jìn)行格式化輸出
0x03?Logstash參數(shù)與配置
Logstash宏觀的配置文件內(nèi)容格式如下:
# 輸入 input {... }# 過(guò)濾器 filter {... }# 輸出 output {... }配置文件參考
input {# 從文件讀取日志信息file {path => "/var/log/error.log"type => "error"//type是給結(jié)果增加一個(gè)type屬性,值為"error"的條目start_position => "beginning"//從開(kāi)始位置開(kāi)始讀取# 使用 multiline 插件,傳說(shuō)中的多行合并codec => multiline {# 通過(guò)正則表達(dá)式匹配,具體配置根據(jù)自身實(shí)際情況而定pattern => "^\d"negate => truewhat => "previous"}} }#可配置多種處理規(guī)則,他是有順序,所以通用的配置寫下面 # filter { # grok { # match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }} # }output {# 輸出到 elasticsearchelasticsearch {hosts => ["192.168.22.41:9200"]index => "error-%{+YYYY.MM.dd}"//索引名稱} }上面的file可以配置多個(gè):
file { type => "tms_inbound.log" path => "/JavaWeb/tms2.wltest.com/logs/tms_inbound.es.*.log" codec => json { charset => "UTF-8" } } file { type => "tms_outbound.log" path => "/JavaWeb/tms2.wltest.com/logs/tms_outbound.es.*.log" codec => json { charset => "UTF-8" } }1. 常用啟動(dòng)參數(shù)
2. 配置文件結(jié)構(gòu)及語(yǔ)法
-
區(qū)段
??Logstash通過(guò){}來(lái)定義區(qū)域,區(qū)域內(nèi)可以定義插件,一個(gè)區(qū)域內(nèi)可以定義多個(gè)插件,如下:
- 數(shù)據(jù)類型
?? Logstash僅支持少量的數(shù)據(jù)類型:
? Boolean:ssl_enable => true
? Number:port => 33
? String:name => “Hello world”
? Commonts:# this is a comment
- 字段引用
?? Logstash數(shù)據(jù)流中的數(shù)據(jù)被稱之為Event對(duì)象,Event以JSON結(jié)構(gòu)構(gòu)成,Event的屬性被稱之為字段,如果你像在配置文件中引用這些字段,只需要把字段的名字寫在中括號(hào)[]里就行了,如[type],對(duì)于嵌套字段每層字段名稱都寫在[]里就可以了,比如:[tags][type];除此之外,對(duì)于Logstash的arrag類型支持下標(biāo)與倒序下表,如:[tags][type][0],[tags][type][-1]。
- 條件判斷
?? Logstash支持下面的操作符:
? equality:==, !=, <, >, <=, >=
? regexp:=~, !~
? inclusion:in, not in
? boolean:and, or, nand, xor
? unary:!
??例如:
if EXPRESSION {... } else if EXPRESSION {... } else {... }- 環(huán)境變量引用
?? Logstash支持引用系統(tǒng)環(huán)境變量,環(huán)境變量不存在時(shí)可以設(shè)置默認(rèn)值,例如:
export TCP_PORT=12345 input {tcp {port => "${TCP_PORT:54321}"} }0x04?常用輸入插件(Input?Plug)
1. File讀取插件
?文件讀取插件主要用來(lái)抓取文件的變化信息,將變化信息封裝成Event進(jìn)程處理或者傳遞。
- 配置事例
- 常用參數(shù)
2. Beats監(jiān)聽(tīng)插件
Beats插件用于建立監(jiān)聽(tīng)服務(wù),接收Filebeat或者其他beat發(fā)送的Events;
- 配置事例
- 常用參數(shù)(空 => 同上)
3. TCP監(jiān)聽(tīng)插件
TCP插件有兩種工作模式,“Client”和“Server”,分別用于發(fā)送網(wǎng)絡(luò)數(shù)據(jù)和監(jiān)聽(tīng)網(wǎng)絡(luò)數(shù)據(jù)。
- 配置事例
- 常用參數(shù)(空 => 同上)
?
4. Redis讀取插件
用于讀取Redis中緩存的數(shù)據(jù)信息。
- 最小化配置
- 詳細(xì)配置
5. Syslog監(jiān)聽(tīng)插件
監(jiān)聽(tīng)操作系統(tǒng)syslog信息
- 配置事例
- 輸出至屏幕
- 修改rsyslog配置文件
- 輸出至es
0x05?常用過(guò)濾插件(Filter plugin)
豐富的過(guò)濾器插件的是 logstash威力如此強(qiáng)大的重要因素,過(guò)濾器插件主要處理流經(jīng)當(dāng)前Logstash的事件信息,可以添加字段、移除字段、轉(zhuǎn)換字段類型,通過(guò)正則表達(dá)式切分?jǐn)?shù)據(jù)等,也可以根據(jù)條件判斷來(lái)進(jìn)行不同的數(shù)據(jù)處理方式。
1. grok正則捕獲
??grok 是Logstash中將非結(jié)構(gòu)化數(shù)據(jù)解析成結(jié)構(gòu)化數(shù)據(jù)以便于查詢的最好工具,非常適合解析syslog logs,apache log, mysql log,以及一些其他的web log
預(yù)定義表達(dá)式調(diào)用
??Logstash提供120個(gè)常用正則表達(dá)式可供安裝使用,安裝之后你可以通過(guò)名稱調(diào)用它們,語(yǔ)法如下:%{SYNTAX:SEMANTIC}
??SYNTAX:表示已經(jīng)安裝的正則表達(dá)式的名稱
??SEMANTIC:表示從Event中匹配到的內(nèi)容的名稱
??例如:Event的內(nèi)容為“[debug] 127.0.0.1 - test log content”,匹配%{IP:client}將獲得“client: 127.0.0.1”的結(jié)果,前提安裝了IP表達(dá)式;如果你在捕獲數(shù)據(jù)時(shí)想進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換可以使用%{NUMBER:num:int}這種語(yǔ)法,默認(rèn)情況下,所有的返回結(jié)果都是string類型,當(dāng)前Logstash所支持的轉(zhuǎn)換類型僅有“int”和“float”;
??一個(gè)稍微完整一點(diǎn)的事例:
? 日志文件http.log內(nèi)容:55.3.244.1 GET /index.html 15824 0.043
? 表達(dá)式:%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
? 配置文件內(nèi)容:
input {file {path => "/var/log/http.log"} } filter {grok {match => {"message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}} }輸出結(jié)果:
client: 55.3.244.1 method: GET request: /index.html bytes: 15824 duration: 0.043- 自定義表達(dá)式調(diào)用
語(yǔ)法:(?<field_name>the pattern here)
舉例:捕獲10或11和長(zhǎng)度的十六進(jìn)制queue_id可以使用表達(dá)式(?<queue_id>[0-9A-F]{10,11})
- 安裝自定義表達(dá)式
?? 與預(yù)定義表達(dá)式相同,你也可以將自定義的表達(dá)式配置到Logstash中,然后就可以像于定義的表達(dá)式一樣使用;以下是操作步驟說(shuō)明:
?? 1、在Logstash根目錄下創(chuàng)建文件夾“patterns”,在“patterns”文件夾中創(chuàng)建文件“extra”(文件名稱無(wú)所謂,可自己選擇有意義的文件名稱);
?? 2、在文件“extra”中添加表達(dá)式,格式:patternName regexp,名稱與表達(dá)式之間用空格隔開(kāi)即可,如下:
# contents of ./patterns/postfix: POSTFIX_QUEUEID [0-9A-F]{10,11}3、使用自定義的表達(dá)式時(shí)需要指定“patterns_dir”變量,變量?jī)?nèi)容指向表達(dá)式文件所在的目錄,舉例如下:
## 日志內(nèi)容 ## Jan 1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver14.example.com> ## Logstash配置 ## filter {grok {patterns_dir => ["./patterns"]match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }} } ## 運(yùn)行結(jié)果 ## timestamp: Jan 1 06:25:43 logsource: mailserver14 program: postfix/cleanup pid: 21403 queue_id: BEF25A72965- grok常用配置參數(shù)(空 => 同上)
- 其他
- 一般的正則表達(dá)式只能匹配單行文本,如果一個(gè)Event的內(nèi)容為多行,可以在pattern前加“(?m)”
- 對(duì)于Hash和Array類型,Hash表示鍵值對(duì),Array表示數(shù)組
- Grok表達(dá)式在線debug地址:http://grokdebug.herokuapp.com
- 預(yù)定義正則表達(dá)式參考地址:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
?
2. date時(shí)間處理插件
??該插件用于時(shí)間字段的格式轉(zhuǎn)換,比如將“Apr 17 09:32:01”(MMM dd HH:mm:ss)轉(zhuǎn)換為“MM-dd HH:mm:ss”。而且通常情況下,Logstash會(huì)為自動(dòng)給Event打上時(shí)間戳,但是這個(gè)時(shí)間戳是Event的處理時(shí)間(主要是input接收數(shù)據(jù)的時(shí)間),和日志記錄時(shí)間會(huì)存在偏差(主要原因是buffer),我們可以使用此插件用日志發(fā)生時(shí)間替換掉默認(rèn)是時(shí)間戳的值。
- 常用配置參數(shù)(空 => 同上)
3. mutate數(shù)據(jù)修改插件
mutate 插件是 Logstash另一個(gè)重要插件。它提供了豐富的基礎(chǔ)類型數(shù)據(jù)處理能力。可以重命名,刪除,替換和修改事件中的字段。
# logstash-filter-mutate 插件是Logstash 另一個(gè)重要插件,它提供了豐富的基礎(chǔ)類型數(shù)據(jù)處理能力,包括類型轉(zhuǎn)換,字符串處理和字段處理等#1.類型轉(zhuǎn)換#類型轉(zhuǎn)換是logstash-filter-mutate 插件最初誕生時(shí)的唯一功能,#可以設(shè)置的轉(zhuǎn)換類型包括:"integer","float" 和 "string"。示例如下:input {stdin {}}filter {grok {match =>{"message" =>"(?<request_time>\d+(?:\.\d+)?)"} } } output {stdout {codec =>rubydebug} }[elk@Vsftp logstash]$ logstash -f t2.conf Settings: Default pipeline workers: 4 Pipeline main started 23.45 {"message" => "23.45","@version" => "1","@timestamp" => "2017-01-11T02:07:33.581Z","host" => "Vsftp","request_time" => "23.45" }#字符串 轉(zhuǎn)換為float型[elk@Vsftp logstash]$ cat t2.conf input {stdin {}}filter {grok {match =>{"message" =>"(?<request_time>\d+(?:\.\d+)?)"}}mutate {convert => ["request_time", "float"] } } output {stdout {codec =>rubydebug} }[elk@Vsftp logstash]$ logstash -f t2.conf Settings: Default pipeline workers: 4 Pipeline main started 23.45 {"message" => "23.45","@version" => "1","@timestamp" => "2017-01-11T02:10:07.045Z","host" => "Vsftp",#字符串轉(zhuǎn)換成數(shù)值型:[elk@Vsftp logstash]$ cat t2.conf input {stdin {}}filter {grok {match =>{"message" =>"(?<request_time>\d+(?:\.\d+)?)"}}mutate {convert => ["request_time", "integer"] } } output {stdout {codec =>rubydebug} }[elk@Vsftp logstash]$ logstash -f t2.conf Settings: Default pipeline workers: 4 Pipeline main started 23.45 {"message" => "23.45","@version" => "1","@timestamp" => "2017-01-11T02:11:21.071Z","host" => "Vsftp","request_time" => 234. JSON插件
JSON插件用于解碼JSON格式的字符串,一般是一堆日志信息中,部分是JSON格式,部分不是的情況下
- 配置事例
- 常用配置參數(shù)(空 => 同上)
5. elasticsearch查詢過(guò)濾插件
用于查詢Elasticsearch中的事件,可將查詢結(jié)果應(yīng)用于當(dāng)前事件中
- 常用配置參數(shù)(空 => 同上)
?
6. 其他
??還有很多其他有用插件,如:Split、GeoIP、Ruby,這里就不一一寫了,等以后用到再補(bǔ)充
0x06 常用輸出插件(Output plugin)
1. ElasticSearch輸出插件
用于將事件信息寫入到Elasticsearch中,官方推薦插件,ELK必備插件
- 配置事例
- 常用配置參數(shù)(空 => 同上)
2、Redis輸出插件
??用于將Event寫入Redis中進(jìn)行緩存,通常情況下Logstash的Filter處理比較吃系統(tǒng)資源,復(fù)雜的Filter處理會(huì)非常耗時(shí),如果Event產(chǎn)生速度比較快,可以使用Redis作為buffer使用
- 配置事例
- 常用配置參數(shù)(空 => 同上)
3. File輸出插件
用于將Event輸出到文件內(nèi)
- 配置事例
- 常用配置參數(shù)(空 => 同上)
4. TCP插件
??Write events over a TCP socket.Each event json is separated by a newline.Can either accept connections from clients or connect to a server, depending on mode.
- 配置事例
- 常用配置參數(shù)(空 => 同上)
0x07?常用編碼插件(Codec plugin)
1. JSON編碼插件
直接輸入預(yù)定義好的 JSON 數(shù)據(jù),這樣就可以省略掉 filter/grok 配置
- 配置事例
- 常用配置參數(shù)
?
0x08?Logstash實(shí)例
1. 接收Filebeat事件,輸出到Redis
input {beats {port => 5044} }output {redis {host => "127.0.0.1"port => 6379data_type => "list"key => "logstash-list"} }2. 讀取Redis數(shù)據(jù),根據(jù)“type”判斷,分別處理,輸出到ES
input {redis {host => "127.0.0.1"port => 6379data_type => "list"key => "logstash-list"} }filter {if [type] == "application" {grok {match => ["message", "(?m)-(?<systemName>.+?):(?<logTime>(?>\d\d){1,2}-(?:0?[1-9]|1[0-2])-(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9]) (?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:(?:[0-5][0-9]|60)(?:[:.,][0-9]+)?)) \[(?<level>(\b\w+\b)) *\] (?<thread>(\b\w+\b)) \((?<point>.*?)\) - (?<content>.*)"]}date {match => ["logTime", "yyyy-MM-dd HH:mm:ss,SSS"]}json {source => "message"}date {match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]}}if [type] == "application_bizz" {json {source => "message"}date {match => ["timestamp", "yyyy-MM-dd HH:mm:ss,SSS"]}}mutate {remove_field => ["@version", "beat", "logTime"]} }output {stdout{}elasticsearch {hosts => ["127.0.0.1:9200"]index => "filebeat-%{type}-%{+yyyy.MM.dd}"document_type => "%{documentType}"template_overwrite => true} }0x09?Logstash注意事項(xiàng)
- 問(wèn)題記錄
啟動(dòng)logstash慢,輸入./bin/logstash沒(méi)有反應(yīng),多出現(xiàn)在新安裝的操作系統(tǒng)上
- 原因
?? jruby啟動(dòng)的時(shí)候jdk回去從/dev/random中初始化隨機(jī)數(shù)熵,新版本的jruby會(huì)用RPNG算法產(chǎn)生隨后的隨機(jī)數(shù),但是舊版本的jruby會(huì)持續(xù)從/dev/random中獲取數(shù)字。但是不幸的是,random發(fā)生器會(huì)跟不上生成速度,所以獲取隨機(jī)數(shù)的過(guò)程會(huì)被阻塞,直到隨機(jī)數(shù)池?fù)碛凶銐虻撵厝缓蠡謴?fù)。這在某些系統(tǒng)上,尤其是虛擬化系統(tǒng),熵?cái)?shù)池可能會(huì)比較小從而會(huì)減慢jruby的啟動(dòng)速度。
?? 檢查一下系統(tǒng)的熵?cái)?shù)池 cat /proc/sys/kernel/random/entropy_avail,正常情況這個(gè)數(shù)字推薦大于1000,對(duì)比了一下獨(dú)立主機(jī)的這個(gè)數(shù)值,大約在700-900之間晃悠。
- 解決
?? 使用偽隨機(jī),編輯/usr/local/logstash/logstash-5.4.1/config/jvm.options,在最后增加一行:-Djava.security.egd=file:/dev/urandom
- 參考
https://github.com/elastic/logstash/issues/5507
http://www.tuicool.com/articles/jEBBZbb
?
總結(jié)
以上是生活随笔為你收集整理的ELK学习笔记之Logstash详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 查看表空间相关命令
- 下一篇: RHEL7 修改SSH默认端口