Logstash 的命令列入門 ( 附上相關實驗步驟 )
在之前的部落格中,我們已經在 Macbook Big Sur 環境下安裝了 ELK 的相關軟體,並且已經可以成功執行對應的模組;
如果沒有安裝的同學,或者對於安裝有困惑的朋友請點選下邊的連結,僅限於 Mac OS 環境的安裝指南,後期可能會補上在 Linux 下的安裝步驟:
https://www.cnblogs.com/doherasyang/p/14629555.html
目前,我在 ELK方向 的主要的精力都在學習 Elasticsearch 的相關特性 以及 與 Kibana 的配合進行資料展示,但是 嘗試寫了一下 Elasticsearch 的相關部落格內容,我真的覺得很難寫,因為只是知識點,對於實際操作部分的內容撰寫比較花時間,我也是在逐步摸索中,難以形成體系的內容,因此我決定先將這部分的內容放下,先集中精力 撰寫 ELK 的資料處理部分 - Logstash
1. 資料準備
資料是你幹啥都非常重要的事情,沒有資料基本上做啥都沒有用,並且資料的相關格式內容必須要貼近你自己的需求,對於我個人來說,對於 ELK 的需求有兩個方面:
- 第一個方面:借鑑 Github 在程式碼、文件搜尋功能中的整合,為即將開始搭建的部落格網站提供文件搜尋引擎以及相關性計算的支援;
- 第二個方面:使用 ELK 做到日誌審計和安全審計分析,生成相關個姓化圖片和報表,為 整個生產環境 提供安全態勢感知的支援,這個方面的相關內容和思路,會在之後持續更新;
總之,使用 ELK 的技術 是為了應對大資料環境和做好日常的運維日誌處理、審計工作的重要一環,也是未來資料中心IDC運維工程師技術發展的重要方向,因此我認為學習的重要性也是非常大的;‘
從這麼長時間的學習上來看,我認為 ELK 具備未來技術的相關特性,簡單來說有以下幾個方面:
- 支援 Docker 和 叢集部署、排程,為相關雲化提供瞭解決方案,並且基於 jruby、Python 等語言,尤其是 Python 的相關支援,為成為雲技術發展提供了支撐,目前 Go 語言在雲端計算領域的火熱程度呈現上升的趨勢,有 Python 作為支撐的前提,我認為這只是一個時間問題;
- 支援 REST API 的擴充套件,只要 Web 技術一日不倒,那麼 ELK 就是非常棒的選擇,在最近的學習中,我也體驗了 REST API 的相關特性,我認為真的是非常的出色,只要你有Web 應用,你就可以輕鬆獲得ELK技術的支援;
- 外掛化 (Plug-in) 的管理,外掛化的管理讓整個技術上手非常容易,我之前做過 React Native 的開發,深知模組化對於快速開發和相關功能擴充的意義,因此 ELK 的外掛化管理讓我覺得上手非常快,非常容易上手,並且相關文件豐富,開源社群強大;
- 開源的優勢,因為外掛的開源,不論是個人還是開發團隊都可以做到獲得原始碼的二次開發,潛力不可預估;
說了這麼多,我非常推薦你使用ELK技術棧來解決你在工作、或者個人興趣開發上遇到的任何問題,因此我也會盡心來準備 和 編寫關於這方面的內容的部落格內容,如果有什麼問題或者錯誤,請您傳送問題和內容到: doherasyanng@gamil.com
1.1 開源資料庫推薦
-
第一個是一個關於網路安全的資料庫,被託管在 GIthub 網站上,免費使用:
https://github.com/shramos/Awesome-Cybersecurity-Datasets#network-traffic
-
第二個是一個名叫 Security Repo 的安全資料網站:
「後續將會繼續補充我遇到的比較好的資料來源」
當然,我也會後續自己上傳自己製作的相關資料集,有興趣的朋友可以關注一下這部分的內容;
1.2 本文中用到的資料集
@copyright Security Repo - auth.log - approx 86k lines, and mostly failed SSH login attempts
內容:
- 記錄失敗登入 SSH 的相關 syslog
- 涉及到的服務有:
SSHD
和CRON
的服務;
1.3 摘取部分日誌內容 - auth.log
Dec 1 08:31:33 ip-172-31-27-153 sshd[24839]: Received disconnect from 67.205.20.23: 11: Bye Bye [preauth]
Dec 1 08:31:34 ip-172-31-27-153 sshd[24841]: Invalid user git from 67.205.20.23
Dec 1 08:31:34 ip-172-31-27-153 sshd[24841]: input_userauth_request: invalid user git [preauth]
Dec 1 08:31:34 ip-172-31-27-153 sshd[24841]: Received disconnect from 67.205.20.23: 11: Bye Bye [preauth]
Dec 1 08:31:35 ip-172-31-27-153 sshd[24843]: Received disconnect from 67.205.20.23: 11: Bye Bye [preauth]
Dec 1 08:31:35 ip-172-31-27-153 sshd[24845]: Received disconnect from 67.205.20.23: 11: Bye Bye [preauth]
2. Logstash 的命令列配置講解
從之前的內容我們已經可以正常在 MacOS 環境下使用 Logstash
命令,從而啟動 Logstash 服務為我們處理相關的資料流,本章的內容結構如下:
- 2.1 - 搞清楚 Logstash 服務在系統中存在的形式以及如何被呼叫的
- 2.2 - 通過命令列啟動 Logstash 並 自定義相關配置引數
2.1 Logstash 服務
Logstash 是可以作為服務被託管在你的Linux系統上,詳細如何瞭解怎麼被託管,你可以參考 Elastic 的官方文件,在這裡不做更加詳細的介紹:https://www.elastic.co/guide/en/logstash/current/running-logstash.html
但是,需要了解 Logstash 是怎麼工作的,下邊的圖片簡單的揭示了 Logstash 的整體運作原理:
Logstash 被分成了三種部分:
-
第一個部分:input 負責處理資料流的輸入,資料通過 input 外掛(模組)輸入到 Logstash 的引擎中 以供進一步進行處理;
-
第二個部分:filter 負責對 input 輸入的資料流進行處理,處理的外掛有:
- grok - 利用正規表示式 / 匹配模式 進行處理輸入的資料流;
- date - 標準化處理時間格式: 將輸入的時間處理成標準格式;
- geoip - IP 的地理位置資料庫,用於獲取和分析 IP的地理位置;
經過 filter 模組處理完的資料的格式是: 標準 JSON 資料格式 - 非常方便進行通訊的資料格式;
-
第三個部分:output 負責將處理完的 JSON 資料傳遞給指定的服務或者輸出到檔案,因此 Logstash 可以將資料處理、分析、結構化完成之後可以將資料傳送給 Elasticsearch 引擎 或者 Graphite 資料工具;
在不同部分中,Logstash 使用 pipeline 進行資料在不同外掛(模組)的傳遞和處理, 你可以在 Logstash 的配置檔案中,配置 pipeline 的相關引數,接下來的內容會講到 pipeline 的引數配置;
其實對於 Elasticsearch 來說, Logstash 整體就是一個 pipeline 為 Elasticsearch 提供資料;
2.2 Logstash 命令的引數配置
在前邊中,我們已經知道了 Logstash 是通過命令列或者自己配置服務進行啟動的,那麼通過命令列啟動就一定要涉及到引數的配置問題,Logstash 支援指定引數配置檔案從而執行相關服務;
你可以通過 --help
命令來列印 Logstash 的所有的引數資訊配置,非常非常的長和複雜,在這裡挑幾個重要的說一下:
-
--node.name
: 為 Logstash 的例項進行命名,預設值: 你的本機的 host name ; -
-f / --path.config
: 為 Logstash 指定配置檔案,這個配置檔案是指你自己定義的關於處理文件的相關配置檔案,包含 2.1 部分的三個主要外掛:input / filter / output ,在這個配置檔案當中,可以指定外掛實現的具體功能;如果你想要制定多個檔案,那麼你可以嘗試使用下邊的格式:
logstash
-
-e / --config.string
: 為 Logstash 指定配置內容,這個內容的格式是:String
,與--path.config
的比對一下,--path.config
檔案的內容是--config.string
輸入的內容;如果不配置這個引數的話:
- defalut input :
input {stdin {type => stdin}}
- default output :
output { stdout {codec => rubydebug}}
- defalut input :
-
--path.logs / -l
: 為 Logstash 指定預設的日誌輸出路徑;logstash -l ./logstash_log.log
-
--log.level
: 為 Logstash 輸出的fatal
- 非常嚴重的錯誤error
- 錯誤warn
- 報警info
- 記錄詳細資訊 ( 預設 )debug
- 為開發者提供除錯的相關資訊trace
- 記錄除除錯資訊外的更細粒度的訊息
-
--log.format
: Logstash 提供了兩種日誌的相關格式:JSON
和PLAIN
, 可以自由被指定; -
--pipeline-workers / -w
: 為output
和filter
外掛指定執行的管道的個數 - “執行緒數”,預設的管道數是你的 CPU 的 核數,你可以適當的增加改值來有效利用伺服器的核數,在你的伺服器計算能力允許的情況下; -
--pipeline-ordered
: 可以被設定的值是:auto
true
false
,預設的值是default
與上邊的
--pipeline-workers
進行配合,只有在workers=1
時生效,做到對所有 Logstash 的事件流進行排序,-
當這個引數值設定成為
auto
時,當pipeline-workers=1
會自動啟動事件排序( event ordering) 並回影響 filter 和 output 的效能; -
當這個引數值設定成為
true
時,當pipeline-workers != 1
時,那麼 Logstash 就不會被啟動,因此有阻止多個管道執行緒數啟動的功能; -
當這個引數值設定成為
false
時,可以在任何情況下都阻止事件排序;
-
-
--pipeline-batch-size
/ -b: 設定每個 Logstash 管道 ( pipeline ) 的可以處理的事件數,每一個管道可以當成一個“執行緒”,可以為每一個“執行緒” 設定能夠儲存的最大事件條數( Maximum Events) ,預設的值是: 125 ;-
需要深入理解一下這個概念:
以 日誌檔案進行舉例,每一個 日誌檔案都有很多行具體的日誌資訊,像
auth.log
有8K+行;Logstash 在將這個檔案放入 input 外掛時會指定將會建立的管道數 (--pipeline-workers 指定);
指定了管道數 ( workers ) 之後,Logstash 需要建立 - 批量 ( batch ), 構成 批 的基本單位就是 事件 (events) ;
而
pipeline-batch-size
設定的就是每一個批量 ( batch ) 的大小,這個大小當然是由每一個 批 (batch) 中的事件數來決定的,因此pipeline-batch-size
就是設定每一個批中可以打包事件的數量;事件 (events) 是 日誌檔案中的每一行日誌記錄,即單行的日誌資訊就是單個事件;
預設的值: 125 ,即 Logstash 從 日誌檔案
auth.log
讀取1 25行日誌條數 組成一個 批量( batch ),然後通過管道傳遞給filter
和output
外掛進行處理; -
但是這個存在一個 記憶體消耗的問題,因為 Logstash 是執行在自己的 JVM 上的,因此需要配合修改配置檔案:
/config/jvm.options
-
-
--pipeline-batch-delay
: 在 Logstah 打包 批量 傳給fitter
和output
之前,需要等待 Logstash 將所有的事件進行打包,打包過程中需要等待每一個事件被打包到批量當中,需要給這個過程設定一個超時時間,預設的超時時間是: 50ms;在 50ms 之後,即使 批量沒有達到最大的容量,都會給
-
--config.reload.automatic / -r
: 自動判斷配置檔案是否更新; -
--http.host
: 設定 Logstash 的 Web API 繫結的地址; -
--http.port
: 設定 Logstash 的 埠,埠範圍是 9600 - 9700 ; -
--config.debug
: 配置的 Debug 模式, 可能會導致你輸入的密碼洩露;
簡單的做一個簡單的例子,首先建立一個實驗的目錄,我建立的實驗目錄如下:
DoHeras-Macbook-Pro ~/Desktop/Elastic/demo $pwd
/Users/doheras/Desktop/Elastic/demo
目前當前目錄下所有的檔案:
DoHeras-Macbook-Pro ~/Desktop/Elastic/demo $ls
auth.log demo.config
# auth.log 就是之前下載的關於 SSHD 和 CRON 服務的相關日誌資訊
# demo.config 是你需要去建立的一個 Logstash 的配置檔案
demo.config
的內容如下:
input {
file {
# 必須是絕對路徑
path => "/Users/doheras/Desktop/Elastic/demo/auth.log"
start_position => "beginning"
type => "syslog"
# 需要指定特定的檔案
sincedb_path => "/Users/doheras/Desktop/Elastic/demo/.storedb"
}
}
filter {
grok {
# 第一步我們需要來提取日期這個非常關鍵的日誌資訊-下邊的正規表示式可以
match => {
"message" => "^(?<Date_Time>\w+\s\d+\s\d+:\d+:\d+)"
}
}
}
output {
stdout {
codec => rubydebug {
}
}
}
上邊檔案的相關內容會在下一篇: Logstash 的配置檔案內容詳解 中講到,這裡不做介紹;
執行下邊的命令:
DoHeras-Macbook-Pro ~/Desktop/Elastic/demo $sudo logstash -f ./demo.config -l ./logstash.log --log.format json --pipeline.batch.size 200 --pipeline.workers 5 --log.level debug --config.debug
上邊的命令:
- 指定了一個配置檔案:
-f demo.config
- 指定 Logstash 輸出的日誌目錄:
-l ./logstash.log
- 指定的 Logstash 的輸出日誌格式 :
--log.format json
- 指定批量包含的事件數:
--pipeline.batch.size 200
- 指定開通的管道數:
--pipeline.workers 5
- 指定需要記錄的日誌等級:
--log.level debug
- 進入完全Debug 模式:
--config.debug
如果正常你的螢幕就可以列印相關的日誌資訊了,如下所示:
在配置檔案中建立了 .storedb
來存放當前日誌檔案讀取的日誌檔案的位置,當你的控制檯沒有任何輸出時,需要刪除這個檔案:
DoHeras-Macbook-Pro ~/Desktop/Elastic/demo $ls -a
. .. .DS_Store .storedb auth.log demo.config logstash.log
DoHeras-Macbook-Pro ~/Desktop/Elastic/demo $rm -rf ./.storedb
我們還可以發現,Logstash 為我們建立了一個資料夾: logstash.log
該資料夾下邊有三個檔案:
logstash-deprecation.log
: 被廢棄功能的呼叫日誌;logstash-json.log
: 正兒八經執行的日誌;logstash-slowlog-json.log
: 對花費時間較長的管道進行記錄;