ELK第一天
第一章: ELK簡介
E: elasticsearch java 復制存儲收集過來的日志
L: logstash java
K: kibana java 負責過濾,分析,繪圖展示日志數據
F: filebeat go 負責收集日志
第二章: 傳統(tǒng)日志分析需求
1.統(tǒng)計排名前10的IP地址
2.統(tǒng)計排名前10的URL
3.查詢上午11點-14點之間的排名情況
5.對比今天11點-12點和昨天相同時間段的訪問差別
6.找出各個廣告渠道今天分別訪問了多少次
7.找出各個爬蟲來的次數,爬的最多的頁面
8.找出偽造的爬蟲IP并查封
9.找出具體的某個URL的訪問次數
10.找出訪問最慢的前十個頁面,對比昨天也這么慢嗎
11.5分鐘之內告訴我結果
12.一天不定時的會有這些需求
第三章: 日志收集分類
代理層: nginx haproxy
web層: nginx tomcat java php
db層: mysql mongo redis es
系統(tǒng)層: message secure
第四章: ELK安裝部署
ES
kibana
es-head
0.更新系統(tǒng)時間
ntpdate time1.aliyun.com
1.安裝nginx
[root@db-01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
yum makecache fast
yum install nginx -y
systemctl start nginx
2.安裝filebeat
rpm -ivh filebeat-6.6.0-x86_64.rpm
rpm -qc filebeat
3.配置filebeat
[root@db-01 /data/soft]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
output.elasticsearch:
hosts: ["10.0.0.51:9200"]
4.啟動并檢查
systemctl start filebeat
tail -f /var/log/filebeat/filebeat
5.查看日志結果
es-head查看
第五章: filebeat收集nginx的json格式日志
1.上面方案不完善的地方
日志都在一個字段的valuse里,不能拆分單獨顯示
2.理想中的情況
將日志里每一個選項的內容都拆分出來
拆分成key-valuse形式,json格式
理想中存在ES里的數據格式
{
$remote_addr : 192.168.12.254
- : -
$remote_user : -
[$time_local]: [10/Sep/2019:10:52:08 +0800]
$request: GET /jhdgsjfgjhshj HTTP/1.0
$status : 404
$body_bytes_sent : 153
$http_referer : -
$http_user_agent :ApacheBench/2.3
$http_x_forwarded_for:-
}
3.目標如何使nginx日志格式轉換成我們想要的json格式
修改nginx配置文件使日志轉換成json
log_format json '{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr", '
'"referer": "$http_referer", '
'"request": "$request", '
'"status": $status, '
'"bytes": $body_bytes_sent, '
'"agent": "$http_user_agent", '
'"x_forwarded": "$http_x_forwarded_for", '
'"up_addr": "$upstream_addr",'
'"up_host": "$upstream_http_host",'
'"upstream_time": "$upstream_response_time",'
'"request_time": "$request_time"'
' }';
access_log /var/log/nginx/access.log json;
4.nginx轉換成json之后仍然不完善的地方
通過查看發(fā)現,雖然nginx日志變成了json,但是es里還是存儲在message里仍然不能拆分
目標: 如何在ES里展示的是json格式
5.修改filebeat配置文件
[root@db-01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
output.elasticsearch:
hosts: ["10.0.0.51:9200"]
重啟filebeat
systemctl restart filebeat
6.清空nginx日志
>/var/log/nginx/access.log
nginx -t
systemctl restart nginx
問題總結:
1.不知道es-head怎么查看數據
2.filebeat直接復制粘貼,沒有修改IP地址
3.以前的索引沒有刪除,nginx日志沒有清空
4.沒有訪問Nginx產生日志
第六章: 沒日志生成問題總結
11:00 收集的普通日志
es-head filebeat
kibana filebeat
nginx log
11:30 nginx轉換成json
nginx.conf json
nginx -t
nginx -s reload nginx
curl 127.0.0.1
cat /var/log/nginx/access.log 普通的和json的都有
> /var/log/nginx/access.log
systemctl restart filebeat
es-head 刪除
kibana 刪除
es里沒有索引生成
結論:
1.filebeat如果沒有新日志產生,就不會發(fā)送給ES
2.做實驗執(zhí)行的順序也會影響實驗結果
3.如果修改了日志格式,做如下3步操作:
- 清空以前的日志
- 刪除以前存在的ES索引
- 刪除以前添加的kiaban的索引
4.kibana自己不能創(chuàng)建索引,他只能添加ES里已經存在的索引
第七章: filebeat工作模式
1.如果沒日志filebeat就不會發(fā)送給ES數據
2.重啟filebeat不會從頭開始讀日志
3.類似于tial -f
4.當filebeat停止的時候,會記錄停止那一刻記錄的行數,下次啟動的時候,從上次記錄的下一行開始讀數據
5.filebeat對于已經發(fā)送給ES的數據不關心
12:05 讀取nginx日志
nginx 100
停止了filebeat 100
es 100
es 刪除了
12:06 寫入了新的日志
nginx 120 20 100-最后一行
啟動filebeat
es 20
第八章: 自定義索引名稱并按月生成
理想中的情況:
nginx_access-xxxxx-年-月
1.配置filebeat實現自定義索引名稱
[root@db-01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
output.elasticsearch:
hosts: ["10.0.0.51:9200"]
index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true
2.重新filebeat后查看是否生成對應的索引
nginx_access-6.6.0-2019.09
第九章: 按日志分類存儲
理想中的情況:
nginx_access-6.6.0-2019.09
nginx_error-6.6.0-2019.09
1.配置filebeat實現根據不同條件存儲到不同的索引
[root@db-01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
json.keys_under_root: true
json.overwrite_keys: true
tags: ["access"]
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
tags: ["error"]
output.elasticsearch:
hosts: ["10.0.0.51:9200"]
indices:
- index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
tags: "access"
- index: "nginx_error-%{[beat.version]}-%{+yyyy.MM}"
when.contains:
tags: "error"
setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true
2.刪除以前的舊索引并重啟filebeat
systemctl restart filebeat
第十章: 收集tomcat的json日志
1.安裝tomcat
yum install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp tomcat-javadoc -y
2.配置tomcat日志格式為json
[root@db-01 /etc/tomcat]# sed -n '139p' server.xml
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
3.啟動tomcat
systemctl start tomcat
4.配置filebeat
[root@db-01 /etc/tomcat]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/tomcat/localhost_access_log.*.txt
json.keys_under_root: true
json.overwrite_keys: true
tags: ["tomcat"]
output.elasticsearch:
hosts: ["10.0.0.51:9200"]
index: "tomcat_access-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "tomcat"
setup.template.pattern: "tomcat_*"
setup.template.enabled: false
setup.template.overwrite: true
5.重啟filebeat
systemctl restart filebeat
6.訪問tomcat查看是否有數據生成
第十一章: 收集JAVA日志
java日志的特點:
1.報錯信息巨多
2.報錯信息巨多還是一個事件.不能分開看
一段java報錯日志如下:
[2019-09-10T16:15:41,630][ERROR][o.e.b.Bootstrap ] [CcJTI28] Exception
java.lang.IllegalArgumentException: unknown setting [nnode.name] did you mean [node.name]?
at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:482) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettgs.java:427) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:398) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:369) ~[elasticsearch-6.6.0.jar:6.6.0]
at org.elasticsearch.common.settings.SettingsModule.<init>(SettingsModule.java:148) ~[elasticsearch-6.6.0.jar:6.6.0]
[2019-09-10T16:18:16,742][INFO ][o.e.c.m.MetaDataIndexTemplateService] [node-1] adding template [kibana_index_template:.kibana] for index patterns [.kibana]
[2019-09-10T16:18:17,981][INFO ][o.e.c.m.MetaDataIndexTemplateService] [node-1] adding template [kibana_index_template:.kibana] for index patterns [.kibana]
[2019-09-10T16:18:33,417][INFO ][o.e.c.m.MetaDataIndexTemplateService] [node-1] adding template [kibana_index_template:.kibana] for index patterns [.kibana]
匹配思路:
1.java報錯日志特點
正常日志是以[日期]開頭的
報錯日志行數多,但是不是以[
2.匹配以[開頭的行,一直到下一個以[開頭的行,中間所有的數據屬于一個事件,放在一起發(fā)給ES
filebeat配置多行匹配模式:
[root@db-01 ~]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/elasticsearch/elasticsearch.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
output.elasticsearch:
hosts: ["10.0.0.51:9200"]
index: "es-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "es"
setup.template.pattern: "es_*"
setup.template.enabled: false
setup.template.overwrite: true
自定義圖形
條形圖
扇形圖
根據生產需要吧需要的數據做成圖形痹扇,然后全部排版到一起