logstash簡明實用教程


一、logstash是什么

Logstash 是開源的服務器端數據處理管道,能夠同時從多個來源采集數據,轉換數據,然后將數據發送到您最喜歡的“存儲庫”中。
官方介紹:Logstash is an open source data collection engine with real-time pipelining capabilities。簡單來說logstash就是一根具備實時數據傳輸能力的管道,負責將數據信息從管道的輸入端傳輸到管道的輸出端;與此同時這根管道還可以讓你根據自己的需求在中間加上濾網,Logstash提供里很多功能強大的濾網以滿足你的各種應用場景。
Logstash 能夠動態地采集、轉換和傳輸數據,不受格式或復雜度的影響。利用 Grok 從非結構化數據中派生出結構,從 IP 地址解碼出地理坐標,匿名化或排除敏感字段,並簡化整體處理過程。

Logstash常用於日志關系系統中做日志采集設備;
logstash
系統結構
logstash系統結構
Logstash的事件(logstash將數據流中等每一條數據稱之為一個event)處理流水線有三個主要角色完成:inputs –> filters –> outputs

輸入(inpust):必須,負責產生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats)
Logstash 支持 各種輸入選擇 ,可以在同一時間從眾多常用來源捕捉事件。能夠以連續的流式傳輸方式,輕松地從日志、指標、Web 應用、數據存儲以及各種 AWS 服務采集數據。

過濾器(filters):可選,負責數據處理與轉換(filters modify them),常用:grok、mutate、drop、clone、geoip
過濾器能實時解析和轉換數據
數據從源傳輸到存儲庫的過程中,Logstash 過濾器能夠解析各個事件,識別已命名的字段以構建結構,並將它們轉換成通用格式,以便更輕松、更快速地分析和實現商業價值。

  • 利用 Grok 從非結構化數據中派生出結構
  • 從 IP 地址破譯出地理坐標
  • 將 PII 數據匿名化,完全排除敏感字段
  • 簡化整體處理,不受數據源、格式或架構的影響

輸出(outpus):必須,負責數據輸出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd
Logstash 提供眾多輸出選擇,可以將數據發送到指定的地方,並且能夠靈活地解鎖眾多下游用例

其中inputs和outputs支持codecs(coder&decoder)在1.3.0 版之前,logstash 只支持純文本形式輸入,然后以過濾器處理它。但現在,我們可以在輸入 期處理不同類型的數據,所以完整的數據流程應該是:input | decode | filter | encode | output;codec 的引入,使得 logstash 可以更好更方便的與其他有自定義數據格式的運維產品共存,比如:graphite、fluent、netflow、collectd,以及使用 msgpack、

二、為什么是logstash

Logstash和Flume對比
1、Logstash比較偏重於字段的預處理,在異常情況下可能會出現數據丟失,只是在運維日志場景下,一般認為這個可能不重要;而Flume偏重數據的傳輸,幾乎沒有數據的預處理,僅僅是數據的產生,封裝成event然后傳輸;傳輸的時候flume比logstash多考慮了一些可靠性。因為數據會持久化在channel中,數據只有存儲在下一個存儲位置(可能是最終的存儲位置,如HDFS;也可能是下一個Flume節點的channel),數據才會從當前的channel中刪除。這個過程是通過事務來控制的,這樣就保證了數據的可靠性。
2、Logstash有幾十個插件,配置比較靈活,flume強調用戶自定義開發;
3、Logstash的input和filter還有output之間都存在buffer,進行緩沖;Flume直接使用channel做持久化
4、Logstash性能以及資源消耗比較嚴重,且不支持緩存;
Logstash和Flume對比
詳見參考:https://blog.csdn.net/songfeihu0810232/article/details/94406608

三、logstash安裝與配置

1、logstash安裝

環境要求:jdk1.8或以上
下載logstash軟件包 logstash官方下載地址https://www.elastic.co/cn/downloads/logstash
下載后直接解壓就可以用
如:tar zxvf logstash-7.6.0.tar.gz
解壓后目錄如下:
logstash目錄
目錄結構說明見官方文檔:https://www.elastic.co/guide/en/logstash/7.1/dir-layout.html
解壓以后可以對logstash進行簡單的測試。

bin/logstash -e 'input { stdin { } } output { stdout {} }'  

這條命令表示通過命令的方式指定logstash的輸入輸出分別是標准的輸入輸出,什么是標准的輸入輸出呢?就是控制台的輸入輸出。
等待啟動成功,直接輸入“hello world”
將會在控制台會有相應的輸出
出現這些信息就表示logstash安裝成功並且可以使用了。
logstash測試

2、在線安裝logstash插件

雖然logstash默認安裝了大部分的插件,但是有些插件沒有默認安裝,如logstash-output-syslog、logstash-output-jdbc

2.1. 安裝Gem並更新

# yum install -y gem
# gem -v
2.0.14.1
# gem update --system
# gem -v
3.1.2

2.2 檢查並修改鏡像源

# gem sources -l
*** CURRENT SOURCES ***
 
https://rubygems.org/

# gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
https://gems.ruby-china.com/ added to sources
https://rubygems.org/ removed from sources

# cat ~/.gemrc 
---
:backtrace: false
:bulk_threshold: 1000
:sources:
- https://gems.ruby-china.com/
:update_sources: true
:verbose: true
:concurrent_downloads: 8

請注意:國內的鏡像站從https://gems.ruby-china.org 換成了 https://gems.ruby-china.com
!!!現在很多網上的資料就都是寫的https://gems.ruby-china.org,導致很多人換了鏡像源也裝不上。

2.3. 修改 logstash的 gem 鏡像源

cd到logstach的安裝目錄,可以看到Gemfile文件 vi Gemfile

# This is a Logstash generated Gemfile.
# If you modify this file manually all comments and formatting will be lost.
 
source "https://rubygems.org"
gem "logstash-core", :path => "./logstash-core"
......

更改默認的 https://rubygems.org 為https://gems.ruby-china.com

2.4、安裝插件

安裝插件

3、離線安裝logstash插件

在實際應用過程中有些生產環境是封閉的網絡環境,沒法連接外網。這時候就需要離線安裝插件。
說離線安裝實際就是在一個有網絡的環境下將插件裝好,然后再裝到離線環境中。
這里有兩種方式,
一種就是在有網絡的環境下將插件裝好,將整個logsash包離線拷到生產環境。
另一種方式就是在有網絡的環境下將插件裝好后,將logstash的需要離線安裝的插件打個離線包,然后再在生產環境進行離線安裝。
離線插件包打包安裝具體操作如下:

3.1 通過logstash-plugin prepare-offline-pack 命令將插件打成zip包

./logstash-plugin prepare-offline-pack --output logstash-output-syslog.zip logstash-output-syslog

打包
打包命令執行成功以后,可以看到在logstash的bin目錄下有打成的離線插件zip包
打包后生成的離線包

3.2 通過logstash-plugin install 進行離線安裝

bin/logstash-plugin install file:///home/logstash/logstash-7.6.2/tools/logstash-output-syslog.zip

安裝后成功會有如下提示

Installing file: /home/logstash/logstash-7.6.2/tools/logstash-output-syslog.zip
Install successful

3.2 通過logstash-plugin list命令檢查插件是否安裝成功

logstash-plugin list

4、logstash簡單配置說明

語法

Logstash 設計了自己的 DSL ——包括有區域,注釋,數據類型(布爾值,字符串,數值,數組,哈希),條件判斷,字段引用等。

區段(section)

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

input {
    stdin {}
    syslog {}
}

數據類型

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

  • bool

    debug => true

  • string

    host => "hostname"

  • number

    port => 514

  • array

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

  • hash

    options => {
    key1 => "value1",
    key2 => "value2"
    }

字段引用(field reference)

如果想在 Logstash 配置中使用字段的值,只需要把字段的名字寫在中括號 [] 里就行了,這就叫字段引用。
對於 嵌套字段(也就是多維哈希表,或者叫哈希的哈希),每層的字段名都寫在 [] 里就可以了。比如,你可以從 geoip 里這樣獲取 longitude 值:
[geoip][location][0]
logstash 的數組也支持倒序下標,即 [geoip][location][-1] 可以獲取數組最后一個元素的值。
Logstash 還支持變量內插,在字符串里使用字段引用的方法是這樣:
"the longitude is %{[geoip][location][0]}"

條件判斷(condition)

表達式支持下面這些操作符:
equality, etc: ==, !=, <, >, <=, >=
regexp: =~, !~
inclusion: in, not in
boolean: and, or, nand, xor
unary: !()
通常來說,你都會在表達式里用到字段引用。比如:
if "_grokparsefailure" not in [tags] {
} else if [status] !~ /^2\d\d/ and [url] == "/noc.gif" {
} else {
}

命令行參數

Logstash 提供了一個 shell 腳本叫 logstash 方便快速運行。它支持一下參數:
-e
意即執行。我們在 "Hello World" 的時候已經用過這個參數了。事實上可以不寫任何具體配置,直接運行 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/ 目錄下所有的文本文件,然后在自己內存里拼接成一個完整的大配置文件,再去執行。
--configtest 或 -t
意即測試。用來測試 Logstash 讀取到的配置文件語法是否能正常解析。Logstash 配置語法是用 grammar.treetop 定義的。尤其是使用了上一條提到的讀取目錄方式的讀者,尤其要提前測試。
--log 或 -l
意即日志。Logstash 默認輸出日志到標准錯誤。生產環境下你可以通過 bin/logstash -l logs/logstash.log 命令來統一存儲日志。
--filterworkers 或 -w
意即工作線程。Logstash 會運行多個線程。你可以用 bin/logstash -w 5 這樣的方式強制 Logstash 為過濾插件運行 5 個線程。

四、logstash使用的幾種典型的應用場景

1、通過logstash將syslog日志原始日志轉發

syslog日志原始日志轉發
在logstash的bin目錄下新建配置文件

vi test-pipeline.conf

編輯input和output

input {
    stdin{
      type => "test-log"
    }
    syslog{
        type => "test-log"
        port => 514
    }
}
output
{
    stdout {
      codec => rubydebug
    }
    syslog{
        host => "192.168.2.185"
        port => 514
    }
}

這樣就相當於把日志轉發到了192.168.2.185這台機器的514端口
編輯好配置文件以后執行
./logstash -f test-pipeline.conf --config.test_and_exit 對配置文件進行檢查,如果配置文件寫得有問題,將會有錯誤提示。
配置文件檢查沒有問題后就可以啟動logstash執行了./logstash -f test-pipeline.conf --config.reload.automatic
用udpsender工具往這台機器上發送日志信息,可以看到日志轉發到192.168.2.185這台機器上了。
updsend發送日志
在控制台可以看到192.168.2.185,接收到了192.168.2.173轉發過來的日志
控制台日志

2、通過rsyslog、logstash采集nginx等中間件的日志送到ES

logstash可以與rsyslog、filebeat等無縫結合采集nginx等中間件日志,送給數據存儲。
通過rsyslog、logstash采集nginx等中間件的日志送到ES
具體參見:https://xiejava.gitee.io/posts/f3e97829/

3、通過logstash將日志入kafka再入mysql或ES

數據先放到kafka隊列里緩存削峰,然后從kafka隊列里讀取數據到mysql或其他存儲系統中進行保存。logstash將日志入kafka再入mysql或ES
具體參見:https://xiejava.gitee.io/posts/54e4fd14/

4、通過logstash進行日志補全后再轉發或入庫

采集原始日志以后,需要對原始日志進行調整合補齊,比如最常見的是根據IP來補齊IP的經緯度等信息。
logstash進行日志補全
這里就可以用logstash的geotip,也可以用其他的外部API接口,為了更具代表性的說明,這里調用的是第三方的http接口(http://ip-api.com/json/),這個接口也是可以自己定義的。
參考配置文件如下:

input {
    stdin { }
    syslog {
      port => "514"
    }
}
filter {
    grok{
         #匹配獲取IP
         match => {"message" => "%{IPV4:ip}"}
    }
    http {
        #調用外部接口獲取IP的詳細信息
        url => "http://ip-api.com/json/%{ip}"
        verb => "GET"
        add_field => {
          "new_field" => "new_static_value"
        }
    }
    mutate {
        replace => {     
            #這里對原始日志數據進行補全,如加了新的字段及從接口中獲取的信息
            "message" => "%{message}|%{ip}: My new message|%{new_field}|%{[body][as]}"
        }
    }
}
output {
    stdout { }
    syslog {
        host => "192.168.2.173"
        port => "7514"
    }
}

通過http接口調用API取得數據,然后通過mutate重新組合補全信息,這里通過調用獲取IP地址信息的API獲取IP的信息,然后補全到原始日志中。
在這里插入圖片描述

可以看出logstash是一個非常靈活好用的數據采集框架工具,可以通過簡單的配置滿足絕大多數數據采集場景的需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM