Logstash完成ELK集群
注:本文與同步(9條消息) 搭建Elasticsearch和kibana完成初步ELK日志分析平臺搭建_kali_yao的博客-CSDN博客
logstash搭建
1)logstash介紹
什么是logstash
-是一個數據采集、加工處理以及傳輸的工具
特點
-所有類型的數據集中處理
-不同模式和格式數據的正常化
-自定義日志格式的迅速擴展
-為自定義數據源輕松添加插件
Logstash工作結構(與流水線類似)
{數據源} ==> input{} ==> filter{ } ==> output {} ==>{輸出結果}
- input 負責收集數據
-filter負責處理數據
-output負責輸出數據
logstash 里面的類型
-布爾值類型: ssI_ enable => true
-字節類型: bytes =>1MiB"
-字符串類型: name => " xkops'
-數值類型: port => 22
-數組: match => [" datetime", "UNIX"]
-哈希(鍵值對) : options => {k => "v",k2 => "v2"}
-注釋: #
logstash 里面的判斷語法
-等于: ==
-不等于: !=
-小于: <
-大于: >
-小于等于: <=
-大于等于: >=
-匹配正則:-不匹配正則: !
logstash 里面的邏輯判斷
-包含: in
-不包含: notin
-與: and
-或: or
-非與: nand
-非或: xor
其他
-編碼類型: codec => "json'
2)logstash安裝
logstash安裝概述
-ogstash依賴Java環境,需要安裝java-openjdk
-logstash沒有默認的配置文件,需要手動配置
-logstash安裝在/usr/share/logstash 目錄下
配置好yum源以后直接使用yum進行安裝或手動下載logstash
~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.8.rpm ~]# yum install -y java-1.8.0-openjdk logstashlogstash安裝準備
主機配置
| logstash | 192.168.1.47 | 最低配置2核2G |
logstash基礎配置安裝
# 注需于前面的配置elasticsearch對應 ~]# vim /etc/hosts 192.168.1.41 ? es-0001 192.168.1.42 ? es-0002 192.168.1.43 ? es-0003 192.168.1.44 ? es-0004 192.168.1.45 ? es-0005 192.168.1.47 ? logstash ~]# yum install -y java-1.8.0-openjdk logstash # 默認安裝在/usr/share/logstash/bin/logstash ~]# cd /usr/share/logstash/bin/ && ls注: /usr/share/logstash/bin/logstash直接執行會報錯沒找到配置文件
# 服務配置文件默認一般在/etc下 ~]# ln -s /etc/logstash /usr/share/logstash/config ~]# vim /etc/logstash/conf.d/my.conf input {stdin {} } ? filter{ } ? output{stdout{} } ~]# /usr/share/logstash/bin/logstash?做完軟連接之后直接啟動會告訴我沒沒用配置文件,(配置文件需要自己書寫,如上)
?注:啟動后進入交互視,輸入任意測試,回應json格式
?
ctrl + c退出
3)插件的使用
logstash 配置文件路徑
-logstash安裝路徑/usr/share/ logstash (默認路徑)
-配置文件安裝路徑/etc/logstash
●啟動命令logstash
/usr/share/ logstash/bin/logstash
插件的管理
-
使用插件
-面的配置文件使用了logstash-input-stdin 和
logstash-output- -stdout兩個插件,logstash對數據的處理依賴插件
-
管理命令/usr/share/ logstash/bin/ logstash-plugin
-安裝插件install
-刪除插件uninstall
-查看插件list
~]# cd /usr/share/logstash/bin ~]# ./logstash-plugin list # 注:同一種插件只能工作在同一個工作區里?
-
只能用于input段的插件: Iogstash-input- -xxx
-
只能用于output段的插件: logstash-output- -xxx
-
只能用于filter段的插件: logstash-filter-xxx,
-
編碼格式插件: logstash-codec-xxx
插件與調試格式
/usr/share/logstash/bin/logstash-plugin list #查看所有
使用json格式字符串測試 {"a":"1", "b":"2", "c":"3"}
# 注:當沒有輸入格式之前所有的輸入都會打印成普通字符串 ~]# vim /etc/logstash/conf.d/my.conf input { stdin { codec => "json" } ?# 以json格式打印 } ? filter{ } ? output{ stdout{ codec => "rubydebug" } #調試格式 } ~]# /usr/share/logstash/bin/logstash [2021-09-09T10:28:49,544][INFO ][logstash.agent ? ? ? ? ? ] Successfully started Logstash API endpoint {:port=>9600}{"a":"1", "b":"2", "c":"3"} # 輸入 /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated {"@version" => "1","c" => "3","host" => "logstash","@timestamp" => 2021-09-09T02:28:52.117Z,"b" => "2","a" => "1" }服務啟動報錯(由于上一個服務關閉進程沒有關閉則需要關閉上一個進程)
此時普通的查進程以經不能解決
~]# ps -exf | grep logstash # 因為logstash是java啟動的,這邊安裝一個java的命令工具查找并殺死 ~]# yum install java-1.8.0-openjdk-devel ~]# jps 629 WrapperSimpleApp 2078 Jps ~]# kill 20784)插件官方手策使用
官方手冊地址
Logstash Reference [8.0] | Elastic
注:這里我用的是6.8
下面三個模式任選一個我這里演示input
這里演示file文件
找到path這一行點array有案例
案例可以直接使用
查看使用規則
5)input file插件(文件插件)
~]# vim /etc/logstash/conf.d/my.conf input { stdin { codec => "json" }file {path => ["/tmp/b.log","/tmp/c.log"] ? ? ? ?# 指定監控的文件當有多條的時候加[]type => "test" ? # 指定標簽,如果是apache的日志可以打上apachestart_position => "beginning" # 開始,如果不寫的話在啟動服務之前的數據不會打印 ? ? ?sincedb_path => "/var/lib/logstash/sincedb" ?# 書簽文件}file { ? ? ? ? ? ? ?# 或者可以支持多個file書寫path => "/tmp/d.log"type => "mysql"} } ? } filter{ } output{ stdout{ codec => "rubydebug" } } ~]# rm -rf /var/lib/logstash/plugins/inputs/file/.sincedb_* # 刪除原有書簽文件,這樣就可以重頭開始輸出了 ~]# /usr/share/logstash/bin/logstash寫入數據測試
~]# cd /tmp ~]# echo aaa >>a.log ~]# echo bbb >>a.log ~]# /usr/share/logstash/bin/logstash .... /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated {"message" => "aaa","@version" => "1","@timestamp" => 2021-09-09T03:57:10.178Z,"host" => "logstash","type" => "test","path" => "/tmp/c.log" } {"message" => "bbb","@version" => "1","@timestamp" => 2021-09-09T03:57:10.200Z,"host" => "logstash","type" => "test","path" => "/tmp/c.log"官網查看解析
?
?
?
6)web頁面展示
# 瀏覽器訪問apache服務的ip(之前有寫) ~]# http://172.17.0.51/info.php查看日志
~]# tail -f /etc/httpd/logs/access_log 172.17.0.126 - - [07/Mar/2022:11:42:03 +0800] "GET /info.php HTTP/1.1" 200 279 "-" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36" ? # 第一個字段是ip,發現不是本機ip訪問的默認在云上訪問使用的是LB負載ip
?設置監聽服務器時打開獲取真實ip
?
測試,把apache的日志拷貝到/tmp/b.log中,啟動查看
此時發現只要再次啟動就不會打印輸出了,因為有標簽,
?修改標簽指定文件或刪除標簽文件
?
?
7)filter(過濾) grok插件
1)filter插件配置管理的概述
grok插件
-解析各種非結構化的日志數據插件
-grok使用正則表達式把非結構化的數據結構化在分組匹配-正則表達式需要根據具體數據結構編寫
-雖然編寫困難,但適用性極廣
-幾乎可以應用于各類數據
filter{ grok {match => { "message" => "" }} }2)filter插件配置的正則概述
-
正則表達式分組匹配格式:
調用格式:(?<名字>正則表達式)
## 以apache日志為例寫一個正則 ~]# vim /etc/logstash/conf.d/my.conf ? input {stdin { codec => "json" }file {path => ["/tmp/b.log","/tmp/c.log"]type => "test"start_position => "beginning"sincedb_path => "/dev/null"} } ? filter{grok {match => { "message" => "(?<client_IP>(25[0-5]|2[0-4]\d|1?\d?\d\.){3}(25[0-5]|2[0-4]\d|1?\d?\d)) (?<vber>\S+) (?<auth>\S+) \[(?<time>.+)\] \"(?<method>[A-Z]+) (?<url>\S+) (?<proto>[A-Z]+\/\d\.\d)\" (?<rc>\d+) (?<size>\d+) \"(?<ref>\S+)\" \"(?<agent>[^\"]+)\"" }} } ? output{stdout{ codec => "rubydebug" } }-
正則表達式宏調用格式
調用格式: %{宏名稱:名字}
~]# vim /etc/logstash/conf.d/my.conf input {stdin { codec => "json" }file {path => ["/tmp/b.log","/tmp/c.log"]type => "test"start_position => "beginning"sincedb_path => "/dev/null"} } ? filter{grok {match => { "message" => "%{IP:client_IP}" } ? # 用宏} } ? output{stdout{ codec => "rubydebug" } ?宏文件路徑
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns
]# cd /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-patterns-core-4.1.2/patterns ~]# ls aws ? ? exim ? ? ? ? ? httpd ? ? ? ? maven ? ? ? ? ? ? ? ? nagios ? ? ruby bacula firewalls ? ? java ? ? ? ? mcollective ? ? ? ? ? postgresql squid bind ? grok-patterns junos ? ? ? ? mcollective-patterns rails bro ? ? haproxy ? ? ? linux-syslog mongodb ? ? ? ? ? ? ? redis查看IP的宏
## 用httpd宏示例 ~]# echo '192.168.1.252 - - [29/Jul/2020:14:06:57 +0800] "GET /info.html HTTP/1.1" 200 119 "-" "curl/7.29.0"' >/tmp/c.log ~]# vim /etc/logstash/conf.d/my.conf input {file {path => ["/tmp/c.log"]type => "test"start_position => "beginning"sincedb_path => "/dev/null" ? ? #把日志位置指針指向空可以反復讀取} } filter{grok {match => { "message" => "%{HTTPD_COMBINEDLOG}" } # 調用httpd的宏把匹配出日志的各個字段含義轉化成json格式} } output{stdout{ codec => "rubydebug" } } ~]# /usr/share/logstash/bin/logstash?
?8)output elasticsearch插件
~]# vim /etc/logstash/conf.d/my.conf input {file {path => ["/tmp/c.log"]type => "test"start_position => "beginning"sincedb_path => "/dev/null"} } filter{grok {match => { "message" => "%{HTTPD_COMBINEDLOG}" }} } output{stdout{ codec => "rubydebug" }elasticsearch {hosts => ["es-0004:9200", "es-0005:9200"] ?# 把數據寫入集群(注,為了防止單點故障,head(es-0001),kibana(es-002,es-003),所以這里就用4和5)index => "weblog-%{+YYYY.MM.dd}"} ? # 索引的名字用來存放日志 } ~]# /usr/share/logstash/bin/logstash ? # 瀏覽器打開 head 插件,通過 web 頁面瀏覽驗證http://公網IP:9200/_plugin/head/?
查看內容
8.遠程獲取WEB日志
1)beats插件
如何收集日志?
-由于logstash 依賴JAVA環境,而且占用資源非常大,因此在每一臺web 服務器上部署logstash 非常不合適
-我們可以使用更輕量的filebeat 收集日志,通過網絡給logstash發送數據
- logstash 使用beats 接收日志,完成分析
logstash接收日志
-如果想接收數據,必須監聽網絡服務。logstash 可以通過beats插件接收filebeats 發送過來的數據
2)logstash beats插件配置
~]# vim /etc/logstash/conf.d/my.conf input { stdin { codec => "json" }file{path => ["/tmp/c.log"]type => "test"start_position => "beginning"sincedb_path => "/var/lib/logstash/sincedb"}beats { ? ? ? ? ?# 配置beatsport => 5044} } ? filter{ grok {match => { "message" => "%{HTTPD_COMBINEDLOG}" }} } ? output{ stdout{ codec => "rubydebug" }elasticsearch {hosts => ["es-0004:9200", "es-0005:9200"]index => "weblog-%{+YYYY.MM.dd}"} } ~]# /usr/share/logstash/bin/logstash ? # 測試,開啟另一個終端查看 ~]# ss -nulpt | grep 50443)web服務安裝filebeat
下載軟件包
或者
~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.8.8-x86_64.rpm # 在web服務器上操作 ~]# yum install -y filebeat.x86_64 0:6.8.8-1 ~]# vim /etc/filebeat/filebeat.yml 24: enabled: true ? ?# 打開模塊 28: ?- /var/log/httpd/access_log ?# 監控日志文件名 45: ? fields: ? ? ? ?# 定義標簽 46: ? ? ? my_type: apache # 改成自己的標簽 148, 150 注釋掉 ? ? ? ? ? ?# 因為日志不是json格式不能直接寫 161: output.logstash: 163: ? hosts: ["(logstash的ip):5044"] 180, 181, 182 注釋掉 ?# 收集系統性息 ? # 查看修改 ~]# grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml # 啟動filebeat服務(最好重啟一下apache服務,為了更好的識別filebeat) ~]# systemctl enable --now filebeat4.驗證
配置完成以后可以 使用grep查看
~]# grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml # 啟動服務 ~]# /usr/share/logstash/bin/logstash訪問web服務器查看
?
?kibana配置
?
?
?
排錯思路
# 1.查看端口是否啟動(5044) ~]# ss -nulpt | grep 5044 # 2.查看配置文件是否有問題 ~]# cat /etc/logstash/conf.d/my.conf # ping一下指定的elasticsearch集群的ip # 3.查看elasticsearch數據庫集群的狀態(red為錯誤狀態) ~]# curl http://node-2:9200/_cat/indices # 4.查看集群(如果沒有啟動則需要到所有服務上啟動elasticsearch) ~]# curl http://node-2:9200/_cat/nodes # 查看是否恢復 ~]# curl http://node-2:9200/_cluster/health?pretty訪問測試
~]# ab -c 20 -n 200 http://172.17.0.51/info.php-c # 并發-n # 次數直接選擇查看ip
再次拆分(可以看到是apache的ab壓力測試)
總結
以上是生活随笔為你收集整理的Logstash完成ELK集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell脚本安装mysql并安装一个小
- 下一篇: mysql数据库基础(密码策略)