Logstash完成ELK集群
注:本文與同步(9條消息) 搭建Elasticsearch和kibana完成初步ELK日志分析平臺搭建_kali_yao的博客-CSDN博客
logstash搭建
1)logstash介紹
什么是logstash
-是一個數(shù)據(jù)采集、加工處理以及傳輸?shù)墓ぞ?/p>
特點(diǎn)
-所有類型的數(shù)據(jù)集中處理
-不同模式和格式數(shù)據(jù)的正常化
-自定義日志格式的迅速擴(kuò)展
-為自定義數(shù)據(jù)源輕松添加插件
Logstash工作結(jié)構(gòu)(與流水線類似)
{數(shù)據(jù)源} ==> input{} ==> filter{ } ==> output {} ==>{輸出結(jié)果}
- input 負(fù)責(zé)收集數(shù)據(jù)
-filter負(fù)責(zé)處理數(shù)據(jù)
-output負(fù)責(zé)輸出數(shù)據(jù)
logstash 里面的類型
-布爾值類型: ssI_ enable => true
-字節(jié)類型: bytes =>1MiB"
-字符串類型: name => " xkops'
-數(shù)值類型: port => 22
-數(shù)組: match => [" datetime", "UNIX"]
-哈希(鍵值對) : options => {k => "v",k2 => "v2"}
-注釋: #
logstash 里面的判斷語法
-等于: ==
-不等于: !=
-小于: <
-大于: >
-小于等于: <=
-大于等于: >=
-匹配正則:-不匹配正則: !
logstash 里面的邏輯判斷
-包含: in
-不包含: notin
-與: and
-或: or
-非與: nand
-非或: xor
其他
-編碼類型: codec => "json'
2)logstash安裝
logstash安裝概述
-ogstash依賴Java環(huán)境,需要安裝java-openjdk
-logstash沒有默認(rèn)的配置文件,需要手動配置
-logstash安裝在/usr/share/logstash 目錄下
配置好yum源以后直接使用yum進(jìn)行安裝或手動下載logstash
~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.8.rpm ~]# yum install -y java-1.8.0-openjdk logstashlogstash安裝準(zhǔn)備
主機(jī)配置
| logstash | 192.168.1.47 | 最低配置2核2G |
logstash基礎(chǔ)配置安裝
# 注需于前面的配置elasticsearch對應(yīng) ~]# 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 # 默認(rèn)安裝在/usr/share/logstash/bin/logstash ~]# cd /usr/share/logstash/bin/ && ls注: /usr/share/logstash/bin/logstash直接執(zhí)行會報(bào)錯沒找到配置文件
# 服務(wù)配置文件默認(rèn)一般在/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?做完軟連接之后直接啟動會告訴我沒沒用配置文件,(配置文件需要自己書寫,如上)
?注:啟動后進(jìn)入交互視,輸入任意測試,回應(yīng)json格式
?
ctrl + c退出
3)插件的使用
logstash 配置文件路徑
-logstash安裝路徑/usr/share/ logstash (默認(rèn)路徑)
-配置文件安裝路徑/etc/logstash
●啟動命令logstash
/usr/share/ logstash/bin/logstash
插件的管理
-
使用插件
-面的配置文件使用了logstash-input-stdin 和
logstash-output- -stdout兩個插件,logstash對數(shù)據(jù)的處理依賴插件
-
管理命令/usr/share/ logstash/bin/ logstash-plugin
-安裝插件install
-刪除插件uninstall
-查看插件list
~]# cd /usr/share/logstash/bin ~]# ./logstash-plugin list # 注:同一種插件只能工作在同一個工作區(qū)里?
-
只能用于input段的插件: Iogstash-input- -xxx
-
只能用于output段的插件: logstash-output- -xxx
-
只能用于filter段的插件: logstash-filter-xxx,
-
編碼格式插件: logstash-codec-xxx
插件與調(diào)試格式
/usr/share/logstash/bin/logstash-plugin list #查看所有
使用json格式字符串測試 {"a":"1", "b":"2", "c":"3"}
# 注:當(dāng)沒有輸入格式之前所有的輸入都會打印成普通字符串 ~]# vim /etc/logstash/conf.d/my.conf input { stdin { codec => "json" } ?# 以json格式打印 } ? filter{ } ? output{ stdout{ codec => "rubydebug" } #調(diào)試格式 } ~]# /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" }服務(wù)啟動報(bào)錯(由于上一個服務(wù)關(guān)閉進(jìn)程沒有關(guān)閉則需要關(guān)閉上一個進(jìn)程)
此時普通的查進(jìn)程以經(jīng)不能解決
~]# ps -exf | grep logstash # 因?yàn)閘ogstash是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這一行點(diǎn)array有案例
案例可以直接使用
查看使用規(guī)則
5)input file插件(文件插件)
~]# vim /etc/logstash/conf.d/my.conf input { stdin { codec => "json" }file {path => ["/tmp/b.log","/tmp/c.log"] ? ? ? ?# 指定監(jiān)控的文件當(dāng)有多條的時候加[]type => "test" ? # 指定標(biāo)簽,如果是apache的日志可以打上apachestart_position => "beginning" # 開始,如果不寫的話在啟動服務(wù)之前的數(shù)據(jù)不會打印 ? ? ?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寫入數(shù)據(jù)測試
~]# 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"官網(wǎng)查看解析
?
?
?
6)web頁面展示
# 瀏覽器訪問apache服務(wù)的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,發(fā)現(xiàn)不是本機(jī)ip訪問的默認(rèn)在云上訪問使用的是LB負(fù)載ip
?設(shè)置監(jiān)聽服務(wù)器時打開獲取真實(shí)ip
?
測試,把a(bǔ)pache的日志拷貝到/tmp/b.log中,啟動查看
此時發(fā)現(xiàn)只要再次啟動就不會打印輸出了,因?yàn)橛袠?biāo)簽,
?修改標(biāo)簽指定文件或刪除標(biāo)簽文件
?
?
7)filter(過濾) grok插件
1)filter插件配置管理的概述
grok插件
-解析各種非結(jié)構(gòu)化的日志數(shù)據(jù)插件
-grok使用正則表達(dá)式把非結(jié)構(gòu)化的數(shù)據(jù)結(jié)構(gòu)化在分組匹配-正則表達(dá)式需要根據(jù)具體數(shù)據(jù)結(jié)構(gòu)編寫
-雖然編寫困難,但適用性極廣
-幾乎可以應(yīng)用于各類數(shù)據(jù)
filter{ grok {match => { "message" => "" }} }2)filter插件配置的正則概述
-
正則表達(dá)式分組匹配格式:
調(diào)用格式:(?<名字>正則表達(dá)式)
## 以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" } }-
正則表達(dá)式宏調(diào)用格式
調(diào)用格式: %{宏名稱:名字}
~]# 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" ? ? #把日志位置指針指向空可以反復(fù)讀取} } filter{grok {match => { "message" => "%{HTTPD_COMBINEDLOG}" } # 調(diào)用httpd的宏把匹配出日志的各個字段含義轉(zhuǎn)化成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"] ?# 把數(shù)據(jù)寫入集群(注,為了防止單點(diǎn)故障,head(es-0001),kibana(es-002,es-003),所以這里就用4和5)index => "weblog-%{+YYYY.MM.dd}"} ? # 索引的名字用來存放日志 } ~]# /usr/share/logstash/bin/logstash ? # 瀏覽器打開 head 插件,通過 web 頁面瀏覽驗(yàn)證http://公網(wǎng)IP:9200/_plugin/head/?
查看內(nèi)容
8.遠(yuǎn)程獲取WEB日志
1)beats插件
如何收集日志?
-由于logstash 依賴JAVA環(huán)境,而且占用資源非常大,因此在每一臺web 服務(wù)器上部署logstash 非常不合適
-我們可以使用更輕量的filebeat 收集日志,通過網(wǎng)絡(luò)給logstash發(fā)送數(shù)據(jù)
- logstash 使用beats 接收日志,完成分析
logstash接收日志
-如果想接收數(shù)據(jù),必須監(jiān)聽網(wǎng)絡(luò)服務(wù)。logstash 可以通過beats插件接收filebeats 發(fā)送過來的數(shù)據(jù)
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服務(wù)安裝filebeat
下載軟件包
或者
~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.8.8-x86_64.rpm # 在web服務(wù)器上操作 ~]# 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 ?# 監(jiān)控日志文件名 45: ? fields: ? ? ? ?# 定義標(biāo)簽 46: ? ? ? my_type: apache # 改成自己的標(biāo)簽 148, 150 注釋掉 ? ? ? ? ? ?# 因?yàn)槿罩静皇莏son格式不能直接寫 161: output.logstash: 163: ? hosts: ["(logstash的ip):5044"] 180, 181, 182 注釋掉 ?# 收集系統(tǒng)性息 ? # 查看修改 ~]# grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml # 啟動filebeat服務(wù)(最好重啟一下apache服務(wù),為了更好的識別filebeat) ~]# systemctl enable --now filebeat4.驗(yàn)證
配置完成以后可以 使用grep查看
~]# grep -Pv "^\s*(#|$)" /etc/filebeat/filebeat.yml # 啟動服務(wù) ~]# /usr/share/logstash/bin/logstash訪問web服務(wù)器查看
?
?kibana配置
?
?
?
排錯思路
# 1.查看端口是否啟動(5044) ~]# ss -nulpt | grep 5044 # 2.查看配置文件是否有問題 ~]# cat /etc/logstash/conf.d/my.conf # ping一下指定的elasticsearch集群的ip # 3.查看elasticsearch數(shù)據(jù)庫集群的狀態(tài)(red為錯誤狀態(tài)) ~]# curl http://node-2:9200/_cat/indices # 4.查看集群(如果沒有啟動則需要到所有服務(wù)上啟動elasticsearch) ~]# curl http://node-2:9200/_cat/nodes # 查看是否恢復(fù) ~]# curl http://node-2:9200/_cluster/health?pretty訪問測試
~]# ab -c 20 -n 200 http://172.17.0.51/info.php-c # 并發(fā)-n # 次數(shù)直接選擇查看ip
再次拆分(可以看到是apache的ab壓力測試)
總結(jié)
以上是生活随笔為你收集整理的Logstash完成ELK集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell脚本安装mysql并安装一个小
- 下一篇: Hadoop的搭建