目錄css
ELK是三個開源軟件的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於在各個服務器上搜集日誌後傳輸給Logstash,官方也推薦此工具。html
Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。java
Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。通常工做方式爲c/s架構,client端安裝在須要收集日誌的tt主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。node
Kibana 也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助彙總、分析和搜索重要數據日誌。python
Filebeat隸屬於Beats。目前Beats包含四種工具:mysql
Filebeat:linux
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.htmlnginx
Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.htmlgit
Kibana:github
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/5.5/index.html
Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
elasticsearch中文社區:
https://elasticsearch.cn/
實驗架構總共用到的主機:
10.0.0.71 elk01
10.0.0.72 elk02
10.0.0.73 elk03
架構圖:
Linux的日誌記錄用戶在系統中的全部操做,經過看日誌分析系統的狀態,這是i運維的基本功,所以咱們須要熟練掌握rsyslog服務的使用 日誌記錄後會實時傳輸到一個更加安全的遠程服務器中,達到真正記錄用戶行爲,使得日誌的二次更改可能性下降,從而達到日誌真實回訪,問題追蹤的目的 rsyslog功能介紹 rsyslog是比syslog更增強大的工具 他具備如下優點 1.直接將日誌寫入數據庫 2.日誌隊列(內存隊列和磁盤隊列) 3.靈活模板,可獲得多種輸出結果,獲得想要的可視化圖形輸出 4.插件結構,多種輸入輸出模塊 5.能夠把日誌存放在MySQL postgresql oracle 等數據庫中
rsyslog.conf文件中的日誌規則定義
facitity.priority Target facility 日誌設備 auth #pam產生的日誌,認證日誌 authpriv #ssh,ftp等登陸信息的驗證信息,認證受權認證 cron #時間任務相關 kern #內核 lpr #打印 mail #郵件 mark(syslog) #rsyslog服務內部的信息,時間標識 news #新聞組 user #用戶程序產生的相關信息 uucp #unix to unix copy, unix主機之間相關的通信 local 1~7 #自定義的日誌設備 priority 日誌級別(低-高) debug 調試 info 通常信息格式 notice 最具備重要性的普通條件信息 warning,warn 警告級別 err,error 錯誤級別 阻止某個功能或者模塊不能正常工做的信息 crit 嚴重級別 組織整個系統或者整個軟件沒法正常工做的消息 alert 須要馬上修改的信息 emerg,panic 內核崩潰 嚴重信息 級別最高 注意:日誌級別記錄方式爲 只記錄自己級別或到更高的級別 低於設定級別將不被記錄。 Target: 輸入的目標 日誌處理方式 如:文件 用戶 日誌服務器 管道 等處理方式
拓撲圖:
基本步驟:
經過rsyslog收集本機全部日誌 filebeat 拿到日誌傳給elasticsearch elasticsearch分析日誌而且將其處理爲json格式 elasticsearch把分析結果傳送給kibana kibana進行結果分析作可視化結果 如 出圖 等操做
rsyslog安裝配置:
rpm -qa rsyslog yum install -y rsyslog
vi /etc/rsyslog.conf 配置日誌收集方式, 若是是本機則直接寫文件路徑,若是是本機 則直接寫路徑 若是是要傳送到遠端服務器 ============UDP日誌傳輸配置[建議UDP傳輸]================= UDP協議傳輸日誌配置 # Provides UDP syslog reception #$ModLoad imudp #$UDPServerRun 514 更改成(去掉協議和端口的註釋): # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Save boot messages also to boot.log local7.* /var/log/boot.log *.* @10.0.0.72:514 --新增配置 ============UDP日誌傳輸配置[建議UDP傳輸]================= ============TCP日誌傳輸配置============================ tcp協議傳輸日誌配置: # Provides TCP syslog reception #$ModLoad imtcp #$InputTCPServerRun 514 更改成(去掉協議和端口的註釋): # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 找到local7.* 下面添加傳送的服務器 # Save boot messages also to boot.log local7.* /var/log/boot.log *.* @@10.0.0.72:514 --新增配置 ============TCP日誌傳輸配置============================ 兩個協議能夠同時監聽。
收集本機日誌: vi /etc/rsyslog.conf 約74行 # Save boot messages also to boot.log local7.* /var/log/boot.log 此行如下新增如下內容行 [這是服務器配置,客戶端直接 @@10.0.0.72:514 便可] *.* /var/log/chenleilei.log 以上配置是將全部日誌都進行收集,配置完成後保存文件,重啓服務
rsyslog配置小總結: 服務器端配置日誌文件 vim /etc/rsyslog.conf 中的 1.修改日誌傳輸協議 # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 2.配置寫入日誌的文件位置 # Save boot messages also to boot.log 行下添加寫入的日誌文件 3.重啓服務 客戶端配置: 1. 開啓與服務器相同的協議(去除#號) # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 2. 配置遠端服務器地址和端口[tcp協議爲 兩個@ 傳輸日誌 udp協議使用一個@傳輸日誌] # Save boot messages also to boot.log *.* @10.0.0.71:514
啓動rsyslog服務
systemctl start rsyslog
使用logger命令 測試日誌收集是否正常
以上配置完成會產生一個 /var/log/chenleilei.log 的配置文件。 新開一個窗口來監視這個配置文件 tailf /var/log/chenleilei.log 另外一窗口使用 logger 'rsyslog test from chenleilei' 測試寫入日誌 而後檢查監視的窗口是否多出新寫入的日誌 若是寫入成功便可表明配置正確 寫入的日誌: Feb 20 16:03:59 elk01 root: rsyslog test from chenleilei 通過這裏的檢查即表明 rsyslog配置成功 能夠進行設置開啓此服務 systemctl enable rsyslog [設置開機啓動] systemctl start rsyslog [啓動服務] systemctl status rsyslog [查看服務狀態] 注意配置到這裏 是 rsyslog收集了全部日誌。而且沒有進行處理,下面會講解 檢查服務端口: netstat -lnpu [root@elk01 ~]# netstat -lnpu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 0.0.0.0:514 0.0.0.0:* 5469/rsyslogd udp 0 0 127.0.0.1:323 0.0.0.0:* 564/chronyd udp6 0 0 :::514 :::* 5469/rsyslogd udp6 0 0 ::1:323 :::* 564/chronyd 514端口爲rsyslog服務默認端口,看到存在即表明服務啓動成功
開啓日誌收集 udp/tcp 模式
#--安裝rsyslog軟件 yum install -y rsyslog #配置日誌傳送服務器 vi /etc/rsyslog.conf ----------------------去掉#號 開啓TCP模式傳送日誌------------ # Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 # Save boot messages also to boot.log local7.* /var/log/boot.log *.* @@10.0.0.72:514 ----------------------去掉#號 開啓TCP模式傳送日誌------------ 除此以外還可使用UDP協議進行傳輸,UDP無需認證效率更高,安全性較差 可是寫入日誌內容較少 沒有三次握手信息,切記 開啓協議必須保持一隻不然沒法傳輸 ----------------------去掉#號 開啓UDP模式傳送日誌------------ # Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 # Save boot messages also to boot.log local7.* /var/log/boot.log *.* @10.0.0.72:514 ----------------------去掉#號 開啓UDP模式傳送日誌------------ 配置完成重啓服務便可 systemctl restart rsyslog
以上配置僅僅只是配置了日誌收集方式,並無進行處理
JDK 1.8.0下載: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 注意: 必須使用JDK8.0 才能夠繼續安裝使用,建議選擇 JDK-8u201-Linux的x64.rpm 若是有高版本建議刪除: 先查詢 rpm -qa | grep jdk [root@elk02 java]# rpm -qa | grep jdk jdk-11.0.2-11.0.2-ga.x86_64 jdk1.8-1.8.0_201-fcs.x86_64 若是不是1.8版本就刪除 而後安裝1.8版本 rpm -e --nodeps jdk-11.0.2-11.0.2-ga.x86_64 下載好 jdk-8u201-linux-x64.rpm 安裝: rpm -ivh jdk-8u201-linux-x64.rpm 如發現沒法安裝請使用: -force --nodeps 參數安裝 添加環境變量 [vi /etc/profile] 尾部添加如下變量: JAVA_HOME=/usr/java/jdk1.8.0_131 CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin export PATH CLASSPATH JAVA_HOME 保存退出 使用 source /etc/profile 讓變量生效 ===================================== 另外可使用 yum -y list java 來查看對應java版本 而後直接安裝對應版本 查詢當前版本: [root@elk02 ~]# java -version java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
java截圖
https://www.elastic.co/guide/en/beats/filebeat/6.6/setup-repositories.html
1. 首先須要下載公鑰,執行下載公鑰 rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch 2. 新建repo文件 vi /etc/yum.repos.d/elk.repo [elastic-6.x] name=Elastic repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md 3.安裝filebeat yum install filebeat -y 4. 啓動filebeat systemctl start filebeat.service 5. 設置開機啓動 systemctl enable filebeat.service
filebeat配置文件地址: /etc/filebeat/ [root@elk01 yum.repos.d]# ls /etc/filebeat/ fields.yml filebeat.reference.yml filebeat.yml modules.d <<---filebeat配置文件 先備份原始文件 cp /etc/filebeat/filebeat.yml{,.bak} 配置filebeat vim /etc/filebeat/filebeat.yml 修改約24行 複製 # enabled: false 粘貼後去除註釋 23 # Change to true to enable this input configuration. 24 # enabled: false 25 enabled: true 修改約29行,複製後另起一行配置日誌記錄文件 29 # - /var/log/httpd/access_log 30 -/var/log/chenleilei.log 修改 153行左右 #-------------------------- Elasticsearch output ------------------------------ output.elasticsearch: # Array of hosts to connect to. hosts: ["localhost:9200"] 改成: output.elasticsearch: # Array of hosts to connect to. hosts: ["10.0.0.72:9200"] ###這裏IP地址爲傳給誰的 #瞭解: # Optional protocol and basic auth credentials. #protocol: "https" #username: "elastic" #password: "changeme" #這段配置是給 https 和須要驗證賬號密碼的場景使用的,若是有須要能夠開啓
#安裝 elasticsearch yum -y install elasticsearch #配置 elasticsearch # 配置文件地址: /etc/elasticsearch/elasticsearch.yml 備份一次配置文件: cp /etc/elasticsearch/elasticsearch.yml{,.bak}
vim /etc/elasticsearch/elasticsearch.yml # Set the bind address to a specific IP (IPv4 or IPv6): # network.host: 10.0.0.72 ##----->這裏修改成 elasticsearch服務器地址,默認改爲0.0.0.0 監聽全部便可,若是寫成IP地址那麼curl獲取 日誌的時候 curl 127.0.0.1:9200/_cat/indices 會沒法獲取到相關信息 ,只能使用定義的 curl 10.0.0.72:9200/_cat/indices 若是隻有一臺 建議直接使用0.0.0.0 就行
systemctl enable elasticsearch.service systemctl start elasticsearch.service systemctl status elasticsearch.service
elasticsearch日誌: /var/log/elasticsearch/elasticsearch.log
能夠經過日誌文件來判斷elastic search是否正常啓動
經過網頁驗證 elasticsearch 服務是否啓動成功
http://10.0.0.72:9200/
成功訪問即表明配置正確
處理日誌將使用到filebeat:
yum直接安裝有點大 從國外源下載太慢,因此須要本身先手動下載而後經過rpm來安裝 rpm -ivh kibana-6.6.0-x86_64.rpm [root@elk01 ~]# rpm -ivh kibana-6.6.0-x86_64.rpm Preparing... ################################# [100%] package kibana-6.6.0-1.x86_64 is already installed
vi /etc/kibana/kibana.yml 跳轉到 第 2 行 開啓服務端口 #server.port: 5601 ##原來 server.port: 5601 ## 新增一行 去掉註釋 跳轉到 第 8 行左右 開啓服務端口 #server.host: "localhost" ## 不用解除註釋 直接 yyp 從新粘貼一行 server.host: "0.0.0.0" ## 這一行 服務監聽電口改成 0.0.0.0 監聽全部 跳轉到 第 31 行左右 開啓服務端口 #elasticsearch.hosts: ["http://localhost:9200"] elasticsearch.hosts: ["http://10.0.0.71:9200"] 配置完成保存退出 重啓kibana systemctl restart kibana.service
服務中使用: curl 127.0.0.1:9200/_cat/indices 查看現有數據 刪除kibana數據: [root@elk01 Kibana_Hanization-master]# curl -XDELETE 127.0.0.1:9200/.kibana_1 {"acknowledged":true} ####[出現true 表明刪除成功,能夠再次查看]
http://10.0.0.71:5601/app/kibana#/management/kibana/index?_g=() 點擊進入: Management - kibana - Index Patterns #Step 1 of 2: Define index pattern #Index pattern filebeat-* ###---第一步輸入索引名 filebeat-6.6.1-2019.03.13 ##這是匹配出來的,匹配出來了就 點擊 【Next step】 #Step 2 of 2: Configure settings [設置根據什麼選擇索引] 選擇 @timestamp 選擇完成建立索引 點擊 Create index pattern
已經能夠收集日誌了 配置完成
vim /etc/filebeat/filebeat.yml 找到 大約39行 內容爲: #include_lines: ['^ERR', '^WARN'] 修改成: include_lines: ['^ERR', '^WARN', 'sshd'] 這樣的話 系統只會收集以ERROR WARN 開頭 和包含sshd 的日誌 修改完成保存後重啓filebeat 經過tailf /var/log/chenleilei.log[日誌文件] 已經看不到了 一些亂七八糟的日誌了 只會出現 咱們設置的3中日誌 添加 sshd 只是爲了測試 sshd 登陸是否會被記錄 日誌記錄: elk01上登陸root用戶後kibana上的記錄: beat.name:elk01 beat.hostname:elk01 host.name:elk01 @timestamp:March 13th 2019, 19:03:23.624 message:Mar 13 19:03:17 elk03 sshd[14134]: pam_unix(sshd:session): session opened for user root by (uid=0) prospector.type:log input.type:log beat.version:6.6.1 host.architecture:x86_64 host.os.name:CentOS Linux host.os.codename:Core host.os.platform:centos host.os.version:7 (Core) host.os.family:redhat host.id:a498e2c9c250499a8d68e8f1a980c3f5 host.containerized:true source:/var/log/chenleilei.log offset:1,069,329 log.file.path:/var/log/chenleilei.log _id:u-m4dmkBA26OlE2TnhDS _type:doc _index:filebeat-6.6.1-2019.03.13 _score: - elk02上登陸root用戶後kibana上的記錄: message:Mar 13 19:07:48 elk02 sshd[14831]: pam_unix(sshd:session): session opened for user root by (uid=0) @timestamp:March 13th 2019, 19:07:48.707 prospector.type:log input.type:log beat.name:elk01 beat.hostname:elk01 beat.version:6.6.1 host.name:elk01 host.architecture:x86_64 host.os.platform:centos host.os.version:7 (Core) host.os.family:redhat host.os.name:CentOS Linux host.os.codename:Core host.id:a498e2c9c250499a8d68e8f1a980c3f5 host.containerized:true log.file.path:/var/log/chenleilei.log source:/var/log/chenleilei.log offset:1,115,205 _id:wOm8dmkBA26OlE2TqhBM _type:doc _index:filebeat-6.6.1-2019.03.13 _score: - elk03上登陸root用戶後kibana上的記錄: message:Mar 13 19:03:17 elk03 sshd[14134]: pam_unix(sshd:session): session opened for user root by (uid=0) @timestamp:March 13th 2019, 19:03:23.624 prospector.type:log input.type:log beat.name:elk01 beat.hostname:elk01 beat.version:6.6.1 host.architecture:x86_64 host.os.name:CentOS Linux host.os.codename:Core host.os.platform:centos host.os.version:7 (Core) host.os.family:redhat host.id:a498e2c9c250499a8d68e8f1a980c3f5 host.containerized:true host.name:elk01 source:/var/log/chenleilei.log offset:1,069,329 log.file.path:/var/log/chenleilei.log _id:u-m4dmkBA26OlE2TnhDS _type:doc _index:filebeat-6.6.1-2019.03.13 _score: - ssh鏈接到elk03 故意輸錯密碼的記錄: March 13th 2019, 19:18:11.792 message:Mar 13 19:18:11 elk03 sshd[14921]: Failed password for chenleilei from 10.0.0.71 port 60284 ssh2 @timestamp:March 13th 2019, 19:18:11.792 prospector.type:log input.type:log beat.version:6.6.1 beat.name:elk01 beat.hostname:elk01 host.name:elk01 host.containerized:true host.architecture:x86_64 host.os.name:CentOS Linux host.os.codename:Core host.os.platform:centos host.os.version:7 (Core) host.os.family:redhat host.id:a498e2c9c250499a8d68e8f1a980c3f5 source:/var/log/chenleilei.log offset:1,124,133 log.file.path:/var/log/chenleilei.log _id:yOnGdmkBA26OlE2TLBA5 _type:doc _index:filebeat-6.6.1-2019.03.13 _score: - ------------------------------------------------------------------
登陸記錄:
elk01
elk02
elk03
日誌收集與清除
刪除filebeat收集數據 查看數據: curl 10.0.0.71:9200/_cat/indices [root@elk01 ~]# curl 10.0.0.71:9200/_cat/indices yellow open filebeat-6.6.1-2019.03.13 6piRJ-G_QQ-n8Xjk8oClEQ 3 1 3 0 21.6kb 21.6kb yellow open filebeat-6.6.1-2019.03.15 _z4Eq8d3Rtm9Ur7W2luQxA 3 1 6 0 52.5kb 52.5kb green open .monitoring-es-6-2019.03.14 qVEPYEeHRCil_WTWmZt3wg 1 0 340 147 563.9kb 563.9kb green open .kibana_1 tOEm5-DYRTa94rBzTVyN_g 1 0 4 0 15.6kb 15.6kb green open .monitoring-kibana-6-2019.03.14 hkL9pHgMTc6sZIPr9R3izQ 1 0 31 0 52.1kb 52.1kb yellow open filebeat-6.6.1-2019.03.14 DPeKhOf_RRupSo1iOk_7xA 3 1 9 0 62.9kb 62.9kb 清除數據: [root@elk01 ~]# curl -XDELETE 10.0.0.71:9200/filebeat-6.6.1-2019.03.13 {"acknowledged":true} ##---刪除13號數據,出現 {"acknowledged":true} 即刪除成功 清除全部數據: 通配符刪除 [root@elk01 ~]# curl -XDELETE 10.0.0.71:9200/filebeat-6.6.1-2019.03.1* {"acknowledged":true} [root@elk01 ~]# curl 10.0.0.71:9200/_cat/indices green open .kibana_1 tOEm5-DYRTa94rBzTVyN_g 1 0 4 0 15.6kb 15.6kb green open .monitoring-kibana-6-2019.03.14 hkL9pHgMTc6sZIPr9R3izQ 1 0 78 0 107.9kb 107.9kb green open .monitoring-es-6-2019.03.14 qVEPYEeHRCil_WTWmZt3wg 1 0 809 30 516kb 516kb 能夠看到已經所有filebeat數據都被刪除
kibana漢化: https://github.com/anbai-inc/Kibana_Hanization 方法: #yum安裝進入漢化包目錄 /root/test/Kibana_Hanization [下載不一樣目錄也不同] #進入目錄後安裝 "/usr/share/kibana/" 是kibana的安裝目錄,根據自身條件來配置: 首先中止kibana服務 systemctl stop kibana.service 下載漢化包: git clone https://github.com/anbai-inc/Kibana_Hanization cd Kibana_Hanization-master/ 命令: python main.py "/usr/share/kibana/" 過程: root@elk01 Kibana_Hanization]# python main.py "/usr/share/kibana/" 文件[/usr/share/kibana/dlls/vendors.bundle.dll.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/canvas/index.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/canvas/canvas_plugin/renderers/all.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/canvas/canvas_plugin/uis/arguments/all.s]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/canvas/canvas_plugin/uis/datasources/al.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/canvas/public/register_feature.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/ml/index.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/ml/public/register_feature.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/spaces/index.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/spaces/public/components/manage_spaces_utton.js]已翻譯。 文件[/usr/share/kibana/node_modules/x-pack/plugins/spaces/public/views/nav_control/componets/spaces_description.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/apm.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/canvas.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/commons.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/infra.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/kibana.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/login.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/ml.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/monitoring.bundle.js]已翻譯。 文件[/usr/share/kibana/optimize/bundles/timelion.bundle.js]已翻譯。 文件[/usr/share/kibana/src/legacy/core_plugins/kibana/server/tutorials/kafka_logs/index.js已翻譯。 文件[/usr/share/kibana/src/ui/public/chrome/directives/global_nav/global_nav.js]已翻譯。 恭喜,Kibana漢化完成! 從新啓動服務: systemctl start kibana.service systemctl status kibana.service
使用elk收集本機全部日誌思路
1) filebeat讀取slow日誌到logstash 2) logstash處理日誌,將全部日誌過濾整理成json格式 grok是使得無結構的日誌結構化和可查詢的最好插件 3)將json日誌發送給slasticsearch 4)kibana經過索引獲取日誌而且及逆行展現
yum -y install httpd systemctl start httpd.service日誌: apache日誌: tailf /var/log/httpd/access_log
curl 10.0.0.71:9200/_cat/indices ##查看現有數據 curl -XDELETE 10.0.0.71:9200/.monitoring-es-6-2019.03.18 ##刪除現有數據 還可使用 * 來匹配刪除 curl -XDELETE 10.0.0.71:9200/.monitoring-es-6-2019.03.1* curl -XDELETE 10.0.0.71:9200/.monitoring-kibana-6-2019.03.1*
設置apache 日誌爲 json
設置filebeat讀取日誌,按照json格式給elastic
kibana讀取elastic日誌
apache默認安裝日誌地址:/var/log/httpd/access_log 配置思路: 1. 修改filebeat.yml文件 而後啓動filebeat 2. curl 10.0.0.71:9200/_cat/indices 查看索引 3. curl -XDELETE 10.0.0.71:9200/.monitoring-es-6-2019.03.18 刪除全部索引 安裝filebeat: rpm -ivh ~/filebeat-6.6.1-x86_64.rpm [這是安裝本地下載的包,也能夠yum來安裝] 配置filebeat傳送日誌給服務器: cp /etc/filebeat/filebeat.yml{,.bak_$(date \+%F)} ##備份 vim /etc/filebeat/fields.yml ##編輯配置 找到 大約 158行 : 找到 : Filebeat inputs 段 更改此段: ---------------------------------------- filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. enabled: false ------------------------------------------ 改成: filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. # enabled: false enabled: true #-----指定開啓日誌收集(別忘了) # Paths that should be crawled and fetched. Glob based paths. paths: #- /var/log/*.log - /var/log/httpd/access_log ------指定access日誌地址[同時這裏能夠指定多個日誌文件,如再指定一個/var/log/chenleilei.log] #- c:\programdata\elasticsearch\logs\* json.keys_under_root: true -----新增行 json.overwrite_keys: true -----新增行 找到大約150行的 Elasticsearch output 將日誌傳輸給Elasticsearch 修改: output.elasticsearch: # Array of hosts to connect to. hosts: ["localhost:9200"] 改成: output.elasticsearch: # Array of hosts to connect to. hosts: ["10.0.0.71:9200"] 刪除索引: curl 10.0.0.71:9200/_cat/indices ###查看索引 curl -XDELETE 10.0.0.71:9200/* ###刪除全部索引 特別注意:若是索引被清除,客戶端須要從新啓動filebeat,並訪問一次apache來生成新的索引! 不然添加索引時 沒法選擇索引 刪除網頁數據: 點擊 Management 點擊 kibana下的 Index Patterns 修改完成後 重啓 filebeat: systemctl restart filebeat.service 查看日誌檢查服務是否啓動成功: [root@elk03 ~]# tailf /var/log/messages Mar 21 11:31:34 elk03 systemd: Started Filebeat sends log files to Logstash or directly to Elasticsearch.. Mar 21 11:31:34 elk03 systemd: Starting Filebeat sends log files to Logstash or directly to Elasticsearch.... 正確啓動
kibana配置:
建立索引 在filebeat中 Management --- Kibana --- Create index pattern --- 勾選左邊的 include system indices Step 1 of 2: Define index pattern filebeat-* 【匹配filebeat數據】 Step 2 of 2: Configure settings @timestamp 【使用時間來匹配】 點擊Next step 下一步 點擊 - Create index pattern
第二步:
選擇: I don't want to use the Time Filter
配置完成後 在 Discover中查看是否正確收集了 access.log的日誌
@timestamp:March 21st 2019, 12:11:37.627 beat.name:elk03 beat.hostname:elk03 beat.version:6.6.1 host.name:elk03 host.architecture:x86_64 host.os.platform:centos host.os.version:7 (Core) host.os.family:redhat host.os.name:CentOS Linux host.os.codename:Core host.id:a498e2c9c250499a8d68e8f1a980c3f5 host.containerized:true source:/var/log/httpd/access_log offset:10,246 log.file.path:/var/log/httpd/access_log message:10.0.0.1 - - [21/Mar/2019:12:11:27 +0800] "GET /noindex/css/fonts/Light/OpenSans-Light.woff HTTP/1.1" 404 241 "http://10.0.0.73/noindex/css/open-sans.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36" prospector.type:log input.type:log _id:ZY9ynmkBaEsJa_kWg44K _type:doc _index:filebeat-6.6.1-2019.03.21 _score: - 看到這樣基本能夠證明 日誌被正確收集到了
第三步: 分析access.log
kibana繪圖: 定義字段 製做圖表[定義json] 定義apache日誌格式爲 json格式
LogFormat "{ \ \"@timestamp\": \"%{%Y-%m-%dT%H:%M:%S%z}t\", \ \"@version\": \"1\", \ \"tags\":[\"apache\"], \ \"message\": \"%h %l %u %t \\\"%r\\\" %>s %b\", \ \"clientip\": \"%a\", \ \"duration\": %D, \ \"status\": %>s, \ \"request\": \"%U%q\", \ \"urlpath\": \"%U\", \ \"urlquery\": \"%q\", \ \"bytes\": %B, \ \"method\": \"%m\", \ \"site\": \"%{Host}i\", \ \"referer\": \"%{Referer}i\", \ \"useragent\": \"%{User-agent}i\" \ }" apache_json CustomLog "logs/access_log" apache_json 該代碼段插入到access配置文件/etc/httpd/conf/httpd.conf 中 約 202行 </IfModule> 標籤下方 寫入完成後 清空apache訪問日誌 >/etc/httpd/logs/access_log systemctl start httpd.service systemctl status httpd.service 檢查日誌是否正確[啓動apache後 打開窗口刷新 而後經過tailf 來查看日誌樣式是否改變爲json] tailf /var/log/httpd/access_log [root@elk03 ~]# tailf /var/log/httpd/access_log { "@timestamp": "2019-03-21T13:53:32+0800", "@version": "1", "tags":["apache"], "message": "10.0.0.1 - - [21/Mar/2019:13:53:32 +0800] \"GET / HTTP/1.1\" 403 4897", "clientip": "10.0.0.1", "duration": 2057, "status": 403, "request": "/", "urlpath": "/", "urlquery": "", "bytes": 4897, "method": "GET", "site": "10.0.0.73", "referer": "-", "useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36" } 10.0.0.1 - - [21/Mar/2019:13:53:32 +0800] "GET / HTTP/1.1" 403 4897 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36" 這樣已經就被定義爲了 json格式了
去kibana中檢查數據是否收集成功:
至此 apache 日誌已經收集完成,若是收集有問題 就中止 filebeat 刪除索引 而後從新添加一次索引便可,特別注意:若是索引被清除,客戶端須要從新啓動filebeat,並訪問一次apache來生成新的索引! 不然添加索引時 沒法選擇索引
注意 只有日誌格式更改成了json格式才能夠輸出圖表 不然 圖表時沒法輸出的
kibana頁面中點擊選擇 Visualize – 「Create a visualization」 - 找到餅圖 圖標
選擇下面標識的項目
設置好了後 點擊 開始的圖標
查看效果
配置沒有問題能夠點擊save 保存圖表,若是沒有出現這樣 出現的是 3個圖 那麼 你多訪問幾回 正常頁面和錯誤頁面
而後保存的時候取一個名字:
這樣就配置好了圖表:
注意: 若是發現狀態碼沒法輸出 多是添加索引的時候選擇了 @timestamp , 你應該選擇 i don't want to use the Time Filter 而後點擊 Create index pattern 來建立圖表。 不然就不會有狀態碼顯示 這樣你也沒法做圖
點擊: Dashboard –— 點擊 add 按鈕 –– 選擇剛纔的 apache_status — 點擊頂部的 Save -- 取個名字保存
到這裏 apache日誌日誌收集完成
注意:默認安裝的nginx 首頁文件在: /usr/share/nginx/html/
.
log_format main_json '{"@timestamp":"$time_local",' '"N_client_ip": "$remote_addr",' '"N_request": "$request",' '"N_request_time": "$request_time",' '"N_status": "$status",' '"N_bytes": "$body_bytes_sent",' '"N_user_agent": "$http_user_agent",' '"N_x_forwarded": "$http_x_forwarded_for",' '"N_referer": "$http_referer"' '}'; access_log logs/access.log main_json;
將此格式插入到nginx配置文件中
默認安裝的nginx 配置文件在 /etc/nginx/nginx.conf
vim /etc/nginx/nginx.conf 註釋默認日誌格式: # log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; 改成: #----------------------------------------------- # log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; log_format main_json '{"@timestamp":"$time_local",' '"N_client_ip": "$remote_addr",' '"N_request": "$request",' '"N_request_time": "$request_time",' '"N_status": "$status",' '"N_bytes": "$body_bytes_sent",' '"N_user_agent": "$http_user_agent",' '"N_x_forwarded": "$http_x_forwarded_for",' '"N_referer": "$http_referer"' '}'; access_log /var/log/nginx/access.log main_json; # access_log /var/log/nginx/access.log main; #----------------------------------------------- 改好後清除默認nginx日誌文件內容 >/var/log/nginx/access.log
檢查日誌是否改成json
{"@timestamp":"23/Mar/2019:03:41:34 +0800","N_client_ip": "10.0.0.1","N_request": "GET / HTTP/1.1","N_request_time": "0.000","N_status": "304","N_bytes": "0","N_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36","N_x_forwarded": "-","N_referer": "-"}
默認日誌格式已經改成了 json格式。
vim /etc/filebeat/filebeat.yml
大約在 154 行 從新定義 Elasticsearch output
從新定義索引
output.elasticsearch: 字段上方添加: setup.template.name: "web_chenleilei_com" setup.template.pattern: "web_chenleilei_com_" output.elasticsearch: # Array of hosts to connect to. hosts: ["10.0.0.71:9200"] 字段下方添加: index: "web_chenleilei_com_%{+yyyy.MM.dd}" 修改完成後保存退出 重啓 filebeat systemctl restart filebeat.service 必定要檢查狀態確保啓動正常: systemctl status filebeat.service
刪除filebeat的索引
curl 10.0.0.71:9200/_cat/indices 查看索引 curl -XDELETE 10.0.0.71:9200/filebeat-* 刪除filebeat索引 重啓filebeat 訪問一下網站從新生成索引 ansible all -m shell -a "systemctl restart filebeat"
生成新的索引:
Management -- Kibana --- [新索引名 實驗配置的是 web_chenleilei_com_2019.03.23 ] Step 1 of 2: Define index pattern Index pattern web_chenleilei_com_* ------ 【定義新索引】 點擊 Next step 下一步 而後重啓服務便可。
nginx日誌和apache日誌收集配置
多日誌收集修改配置文件 filebeat.yml
vim /etc/filebeat/filebeat.yml #=========================== Filebeat input ------------------------------ - type: log enabled: true paths: - /var/log/httpd/access_log json.keys_under_root: true json.overwrite_keys: true - type: log enabled: true paths: - /var/log/nginx/access.log json.keys_under_root: true json.overwrite_keys: true #=========================== Filebeat input ------------------------------ 多臺服務器收集,定位主機 配置: #=========================== Filebeat input ------------------------------ vim /etc/filebeat/filebeat.yml setup.template.name: "elk02_web_chenleilei_com" ####這裏自定義能夠用於區別主機 setup.template.pattern: "elk02_web_chenleilei_com_" ####這裏自定義能夠用於區別主機 output.elasticsearch: # Array of hosts to connect to. hosts: ["10.0.0.71:9200"] index: "elk02_web_chenleilei_com_%{+yyyy.MM.dd}" ####這裏自定義能夠用於區別主機 #=========================== Filebeat input ------------------------------ 修改完成後 從新啓動filebeat,再次同步日誌,會發現會有變化 systemctl restart filebeat 服務器上刪除多餘的收集數據 curl -XDELETE 10.0.0.71:9200/web_chenleilei_com_2019.03.23 重建索引,重啓filebeat
這樣日誌就會以索引名命名,這個命名是在添加elk日誌來源的時候匹配的
這樣配置後就能夠收到多臺服務器的不一樣日誌了 在查閱的時候能夠按照主機來查詢日誌。
使用kibana繪圖來繪製餅圖和圖表展現
若是要作這個 須要先收集到這兩個服務的日誌而且 web服務開啓 kibana - vsiualize 添加apache圖表 添加nginx圖表 點擊Dashboard - Add a filter 添加圖表 選擇已經制做好的兩張圖添加保存便可
elk多日誌收集 是指在每臺filebeat中配置不一樣的索引 讓服務器獲取,這樣便可區分服務器 如何區分一臺服務器中多日誌收集中的 apache nginx兩個服務的日誌? apache定義: ----------------------------------- LogFormat "{ \ \"@timestamp\": \"%{%Y-%m-%dT%H:%M:%S%z}t\", \ \"@version\": \"1\", \ \"tags\":[\"apache\"], \ \"message\": \"%h %l %u %t \\\"%r\\\" %>s %b\", \ \"A_clientip\": \"%a\", \ \"duration\": %D, \ \"status\": %>s, \ \"request\": \"%U%q\", \ \"urlpath\": \"%U\", \ \"urlquery\": \"%q\", \ \"bytes\": %B, \ \"method\": \"%m\", \ \"site\": \"%{Host}i\", \ \"referer\": \"%{Referer}i\", \ \"useragent\": \"%{User-agent}i\" \ }" apache_json CustomLog "logs/access_log" apache_json ------------------------------------- 這裏的 A_clientip 就是用於區分服務的 這裏能夠改成 APACHE_clientip nginx 定義時改成: log_format main_json '{"@timestamp":"$time_local",' '"N_client_ip": "$remote_addr",' '"N_request": "$request",' '"N_request_time": "$request_time",' '"N_status": "$status",' '"N_bytes": "$body_bytes_sent",' '"N_user_agent": "$http_user_agent",' '"N_x_forwarded": "$http_x_forwarded_for",' '"N_referer": "$http_referer"' '}'; access_log /var/log/nginx/access.log main_json; 這樣 在日式收集時 A_clientip 爲apache的日誌 N_clientip 爲nginx日誌
filebeat收集日誌傳給logstash 使用logstash 處理mysql slow日誌 處理生成爲json格式 將處理好爲json的日誌發送給elasticsearch kibana經過索引獲取日誌並進行展現
grok案例:
日誌內容: 2016-09-19T18:19:00 [8.8.8.8:prd] DEBUG this is an example log message grok格式: %{TIMETAMP_ISO8601:timestamp} \[%{IPV4:ip};%{WORD:environment}\] %{LOGLEVEL:log_level} %{GREEDYDATA:message} json格式: { "timestamp": "2016-09-19T18:19:00", "ip": "8.8.8.8", "envronment": "prd", "log_level": "DEBUG", "message":"this is an example log message" }
kibana初始化環境
curl 127.0.0.1:9200/cat/indices curl -XDELETE 127.0.0.1:9200/cat/logstash-*
vim /etc/my.cnf --------------------------------------------------------- [mysqld] slow_query_log long_query_time = 2 slow_query_log_file = "/application/mysql/tmp/slow.log" --------------------------------------------------------- 這樣就可已經開了慢日誌,如今須要製造數據,讓他有慢日誌 vim /etc/my.cnf 建立數據: seq 1 19999999 >/tmp/1.sql 查看建立的數據大小: [root@elk02 ~]# ls -lh /tmp/1.sql -rw-r--r-- 1 root root 162M Mar 27 03:23 /tmp/1.sql 進入數據庫建立測試庫和表 create database db1; use db1; create table t1 (id int(10)not null)engine=innodb; 在數據庫中導入數據: LOAD DATA LOCAL INFILE '/tmp/1.sql' INTO TABLE t1; mysql> LOAD DATA LOCAL INFILE '/tmp/1.sql' INTO TABLE t1; Query OK, 19999999 rows affected (29.89 sec) Records: 19999999 Deleted: 0 Skipped: 0 Warnings: 0 從新開啓一個窗口監視慢查詢日誌:tailf /application/mysql/tmp/slow.log 執行查詢: mysql> * from db1.t1 where id=991; 查看日誌: # Time: 190327 3:25:52 # User@Host: root[root] @ localhost [] Id: 3 # Query_time: 6.258646 Lock_time: 0.000067 Rows_sent: 1 Rows_examined: 19999999 SET timestamp=1553628352; SELECT * from db1.t1 where id=931; 看到這些表明慢日誌開啓成功
第一步: 配置filebeat讀取slow日誌到logstash [filebeat配置完成不用啓動,等logstsh配置完成啓動後再啓動]
vim /etc/filebeat/filebeat.yml 1. 找到Filebeat inputs 項 添加: - type: log enabled: true paths: - /application/mysql/tmp/slow.log json.keys_under_root: true json.overwrite_keys: true - type: log enabled: true paths: - /application/mysql/tmp/slow.log multiline.pattern: '^\# Time|^\# User' # multiline.pattern: "^# User@Host:" multiline.negate: true multiline.match: after # tail_files: true 2. 找到 Logstash output 項 #----------------------------- Logstash output -------------------------------- #添加: output.logstash: output.logstash: # The Logstash hosts hosts: ["10.0.0.72:5044"] multiline.pattern: "^# User@Host:" multiline.negate: true multiline.match: after 注意: 這裏是指的 logstash 安裝在哪臺服務器就由哪臺服務器來處理這個日誌,由於我直接安裝在了本機 我本機IP地址是10.0.0.72 因此我這裏就寫了這個地址,若是在其餘機器上應該換成其餘IP地址 3. 注意若是有別的輸出 好比:配置過輸出給filebeat 那麼 你須要關閉後 選擇輸出給logstash才行。不然就會失敗 關閉file beat中其餘的日誌輸出,選擇輸出到logstash,重啓filebeat,重啓失敗則沒有關閉其餘輸出或配置失敗
第二步:安裝logstash【注意必須是JDK1.8 版本,不然報錯,而且配置輸出給logstsh,配置filebeat就失敗】
下載logstash: wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.tar.gz 沒法下載能夠直接去官方下載 https://www.elastic.co/downloads/logstash 或者yum安裝 yum install -y logstash mkdir -p /server/tools/ wget https://artifacts.elastic.co/downloads/logstash/logstash-6.1.1.tar.gz tar xf logstash-6.1.1.tar.gz -C /usr/local/logstash/ cd .. mv logstash-6.1.1/* ./ rm -rf logstash-6.1.1/ cd /usr/local/logstash 注意: /usr/local/logstash/config/jvm.options 文件是用來控制運行時所需內存的,若是沒法運行能夠嘗試下降內存 更改這兩項便可 -Xms1g -Xmx1g 測試logstash [必須測試] 測試命令: /usr/local/logstash/bin/logstash -e 'input { stdin { } } output{ stdout { } }' 注意:運行後若是有ERROR 則證實有問題,須要排查,若是沒有問題會輸出計算機名 測試沒有問題執行啓動:【經過 bg查看後臺程序,經過fg + 序號進入後臺程序】 /usr/local/logstash/bin/logstash -e 'input { stdin { } } output{ stdout { } }' && 正確案例: --------------------------- [root@elk02 local]# /usr/local/logstash/bin/logstash -e 'input { stdin { } } output{ stdout { } }' Sending Logstash's logs to /usr/local/logstash/logs which is now configured via log4j2.properties [2019-03-27T04:31:08,982][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/usr/local/logstash/modules/fb_apache/configuration"} [2019-03-27T04:31:09,006][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/usr/local/logstash/modules/netflow/configuration"} [2019-03-27T04:31:09,675][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified [2019-03-27T04:31:10,657][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.1.1"} [2019-03-27T04:31:11,098][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} [2019-03-27T04:31:13,311][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>125, :thread=>"#<Thread:0x2da61092 run>"} [2019-03-27T04:31:13,406][INFO ][logstash.pipeline ] Pipeline started {"pipeline.id"=>"main"} The stdin plugin is now waiting for input: [2019-03-27T04:31:13,527][INFO ][logstash.agent ] Pipelines running {:count=>1, :pipelines=>["main"]} 2019-03-26T20:31:57.624Z elk02 ####----這裏輸出了計算機名 而且也會有個9600端口開啓信息:Successfully started Logstash API endpoint {:port=>9600} --------------------------- 錯誤案例: --------------------------- [root@elk02 config]# /usr/local/logstash/bin/logstash -e 'input { stdin { } } output{ stdout { } }' 2019-03-27 04:27:10,886 main ERROR Unable to locate appender "${sys:ls.log.format}_console" for logger config "root" 2019-03-27 04:27:10,886 main ERROR Unable to locate appender "${sys:ls.log.format}_rolling" for logger config "root" 2019-03-27 04:27:10,887 main ERROR Unable to locate appender "${sys:ls.log.format}_rolling_slowlog" for logger config "slowlog" 2019-03-27 04:27:10,887 main ERROR Unable to locate appender "${sys:ls.log.format}_console_slowlog" for logger config "slowlog" 2019-03-27 04:27:15,090 main ERROR Unable to locate appender "${sys:ls.log.format}_console" for logger config "root" 2019-03-27 04:27:15,091 main ERROR Unable to locate appender "${sys:ls.log.format}_rolling" for logger config "root" 2019-03-27 04:27:15,091 main ERROR Unable to locate appender "${sys:ls.log.format}_rolling_slowlog" for logger config "slowlog" 2019-03-27 04:27:15,091 main ERROR Unable to locate appender "${sys:ls.log.format}_console_slowlog" for logger config "slowlog" --------------------------- 緣由: 權限沒有配置正確 解決: chown -R root.root logstash 錯誤案例2: ------------------------------------- /usr/local/logstash/bin/logstash -f /usr/local/logstash/config.d/logstash_to_elasticsearch.conf Sending Logstash logs to /usr/local/logstash/logs which is now configured via log4j2.properties [2019-03-28T22:07:36,736][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified [2019-03-28T22:07:36,819][FATAL][logstash.runner ] Logstash could not be started because there is already another instance using the configured data directory. If you wish to run multiple instances, you must change the "path.data" setting. [2019-03-28T22:07:36,874][ERROR][org.logstash.Logstash ] java.lang.IllegalStateException: Logstash stopped processing because of an error: (SystemExit) exit ------------------------------------- 緣由:已經有一個進程啓用,關閉後重啓就好 配置正確後 回車 會出現定義好的json日誌 沒有json日誌說明錯誤: 錯誤案例: 回車 出現計算機名: 2019-03-26T21:03:46.015Z elk02 [logstash-6.1.1.tar 不能出現正確配置] 建議使用:logstash-6.7.0.tar.gz 正確配置: { "host" => "elk02", "message" => "", "@timestamp" => 2019-03-26T22:52:07.374Z, "@version" => "1" }
測試截圖:
第四步: 編寫logstash配置文件:
[root@elk02 logstash]# pwd /usr/local/logstash [root@elk02 logstash]# mkdir config.d [root@elk02 logstash]# cp config/logstash-sample.conf ./config.d/ [root@elk02 logstash]# cd /config.d/ [root@elk02 config.d]# cp logstash-sample.conf logstash_to_elasticsearch.conf 編輯配置文件: [root@elk02 config.d]# vim logstash_to_elasticsearch.conf 修改前: input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } } 修改後: input { beats { port => 5044 } } #=====grok正則========= filter { grok { match => [ "message", "(?m)^# User@Host: %{USER:query_user}\[[^\]]+\] @ (?:(?<query_host>\S*) )?\[(?:%{IP:query_ip})?\]\s+Id:\s+%{NUMBER:id:int}\s# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\s*(?:use %{DATA:database};\s*)?SET timestamp=%{NUMBER:timestamp};\s*(?<query>(?<action>\w+)\s+.*)" ] } grok { match => { "message" => "# Time: " } add_tag => [ "drop" ] tag_on_failure => [] } if "drop" in [tags] { drop {} } date { match => ["mysql.slowlog.timestamp", "UNIX", "YYYY-MM-dd HH:mm:ss"] target => "@timestamp" timezone => "Asia/Shanghai" } ruby { code => "event.set('[@metadata][today]', Time.at(event.get('@timestamp').to_i).localtime.strftime('%Y.%m.%d'))" } mutate { remove_field => [ "message" ] } } #=====grok正則========= output { elasticsearch { hosts => ["http://10.0.0.71:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } stdout { codec => rubydebug } } 解釋: hosts => ["http://localhost:9200"] ## elasticsearch服務器地址 %{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd} : 這裏自定義索引名 配置完成啓動測試: /usr/local/logstash/bin/logstash -f /usr/local/logstash/config.d/logstash_to_elasticsearch.conf 能夠添加一個輸出到屏幕[測試使用,能夠不用]: 編輯 /usr/local/logstash/config.d/logstash_to_elasticsearch.conf 配置文件 刪除尾部一個 } 再尾部添加: stdout { codec => rubydebug } } 最終結果: input { beats { port => 5044 } } #--->> 這裏是 slow日誌正則內容 ================= filter { grok { match => [ "message", "(?m)^# User@Host: %{USER:query_user}\[[^\]]+\] @ (?:(?<query_host>\S*) )?\[(?:%{IP:query_ip})?\]\s+Id:\s+%{NUMBER:id:int}\s# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\s*(?:use %{DATA:database};\s*)?SET timestamp=%{NUMBER:timestamp};\s*(?<query>(?<action>\w+)\s+.*)" ] } grok { match => { "message" => "# Time: " } add_tag => [ "drop" ] tag_on_failure => [] } if "drop" in [tags] { drop {} } date { match => ["mysql.slowlog.timestamp", "UNIX", "YYYY-MM-dd HH:mm:ss"] target => "@timestamp" timezone => "Asia/Shanghai" } ruby { code => "event.set('[@metadata][today]', Time.at(event.get('@timestamp').to_i).localtime.strftime('%Y.%m.%d'))" } mutate { remove_field => [ "message" ] } } #--->> 這裏是 slow日誌正則內容 ================= output { elasticsearch { hosts => ["http://10.0.0.71:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } stdout { codec => rubydebug } } =========================== 添加完成保存退出後從新啓動: /usr/local/logstash/bin/logstash -f /usr/local/logstash/config.d/logstash_to_elasticsearch.conf 啓動成功標識: 【Successfully started Logstash】 [2019-03-27T07:30:12,978][INFO ][org.logstash.beats.Server] Starting server on port: 5044 [2019-03-27T07:30:13,539][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} 這裏會出現問題 也能夠經過日誌進行分析: vim /usr/local/logstash/logs/logstash-plain.log 如今能夠進行slow日誌觸發測試: ------------------- 一條正確配置產生的 slow日誌---------------------------- { "host" => { "architecture" => "x86_64", "name" => "elk02", "id" => "a498e2c9c250499a8d68e8f1a980c3f5", "containerized" => true, "os" => { "family" => "redhat", "name" => "CentOS Linux", "codename" => "Core", "platform" => "centos", "version" => "7 (Core)" } }, "rows_examined" => 19999999, "timestamp" => "1553787824", "input" => { "type" => "log" }, "beat" => { "name" => "elk02", "version" => "6.6.1", "hostname" => "elk02" }, "@timestamp" => 2019-03-28T15:43:52.927Z, "query_host" => "localhost", "action" => "SELECT", "query_user" => "root", "prospector" => { "type" => "log" }, "log" => { "file" => { "path" => "/application/mysql/tmp/slow.log" }, "flags" => [ [0] "multiline" ] }, "id" => 5, "rows_sent" => 1, "query" => "SELECT * from db1.t1 where id=1018;", "tags" => [ [0] "beats_input_codec_plain_applied" ], "offset" => 8271, "lock_time" => 0.000123, "@version" => "1", "query_time" => 13.037563, "source" => "/application/mysql/tmp/slow.log" } ------------------- 一條正確配置產生的 slow日誌----------------------------
索引定義 vim /usr/local/logstash/config.d/logstash_to_elasticsearch.conf
output { elasticsearch { hosts => ["http://10.0.0.71:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } 改成: output { elasticsearch { hosts => ["http://10.0.0.71:9200"] index => "slow_%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } 這樣改完後 作一條查詢後 經過curl 取數據你會發現你定義的日誌 [root@elk01 ~]# curl 10.0.0.71:9200/_cat/indices yellow open filebeat-6.6.1-2019.03.28 QELr3ipjRwuItb9w-T3PNA 3 1 7 0 101kb 101kb green open .kibana_2 t7UGRQ-ORh6zx8MHW2sJvw 1 0 5 1 77.8kb 77.8kb green open .tasks k15Ws9ahSUmy7uDy6cRmfg 1 0 1 0 6.2kb 6.2kb green open .monitoring-kibana-6-2019.03.28 -Hx4Oo8bQTGfpBEslpX6eg 1 0 2136 0 603.5kb 603.5kb green open .kibana_1 wyxOPjgOSVulciZCV_8qeQ 1 0 4 0 12.7kb 12.7kb green open .monitoring-es-6-2019.03.28 AOnWxe0aSB6qa77Wcdd0vQ 1 0 7551 87 4mb 4mb yellow open slow_filebeat-6.6.1-2019.03.28 _-O06Iv4Tr-sEjD4Up131Q 5 1 1 0 20.4kb 20.4kb
slow日誌收集結果:
#### kibana展現SLOW日誌數據:
索引定義 vim /usr/local/logstash/config.d/logstash_to_elasticsearch.conf
output { elasticsearch { hosts => ["http://10.0.0.71:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } 改成: output { elasticsearch { hosts => ["http://10.0.0.71:9200"] index => "slow_%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } 這樣改完後 作一條查詢後 經過curl 取數據你會發現你定義的日誌 [root@elk01 ~]# curl 10.0.0.71:9200/_cat/indices yellow open filebeat-6.6.1-2019.03.28 QELr3ipjRwuItb9w-T3PNA 3 1 7 0 101kb 101kb green open .kibana_2 t7UGRQ-ORh6zx8MHW2sJvw 1 0 5 1 77.8kb 77.8kb green open .tasks k15Ws9ahSUmy7uDy6cRmfg 1 0 1 0 6.2kb 6.2kb green open .monitoring-kibana-6-2019.03.28 -Hx4Oo8bQTGfpBEslpX6eg 1 0 2136 0 603.5kb 603.5kb green open .kibana_1 wyxOPjgOSVulciZCV_8qeQ 1 0 4 0 12.7kb 12.7kb green open .monitoring-es-6-2019.03.28 AOnWxe0aSB6qa77Wcdd0vQ 1 0 7551 87 4mb 4mb yellow open slow_filebeat-6.6.1-2019.03.28 _-O06Iv4Tr-sEjD4Up131Q 5 1 1 0 20.4kb 20.4kb
定義完成就能夠去kibana中添加數據:
選擇: Management — Kibana -—- Create index pattern
Step 1 of 2: Define index pattern
Index pattern: slow_* 匹配到 定義好的日誌 點擊:Next step
Step 2 of 2: Configure settings
Time Filter field name 下拉框中選擇 I don't want to use the Time Filter
而後點擊 Create index pattern
定義好了後 去查看:
Discover 頁面 切換到 slow_*
查看日誌:
測試生成一條慢日誌後在查詢:
數據庫中查詢一條數據:
頁面中查看:
選擇:Visualize - New - Choose search source
點擊
開始顯示數據:
確認沒有問題,保存
取名:
添加到儀表盤:
點擊左邊菜單: Dashboard 用於添加儀表盤
這樣就成功收集了數據,並完成儀表盤製做
至此,slow日誌收集完成
待續...