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
: 對花費時間較長的管道進行記錄;