作為一個內容類應用,看新聞讀資訊一直是頭條用戶的核心需求,頁面的打開速度直接關係到用戶使用頭條的核心
傳統查看日誌的形式都是通過連接伺服器查看伺服器日誌完成,這種方式會有以下弊端:
效率太慢,需要不停的連接伺服器
日誌文件本身對條件篩選並不友好
需要查看日誌的人員對linux系統有些許熟悉
如果涉及分布式服務系統,需要同時查看多個服務的日誌才能找到對應一條請求的整體日誌
日誌無法做整體的統計
日誌收集系統介紹(Elasticsearch+Filebeat+Kibana)ElasticSearch(https://www.elastic.co/cn/elasticsearch/) 是一個基於Lucene的開源分布式搜索伺服器。它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。它提供了一個分布式多用戶能力的全文搜尋引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放源碼發布,是第二流行的企業搜尋引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
Filebeat(https://www.elastic.co/cn/beats/) 是一個完全開源的工具,屬於Beats中的一種,具體介紹可以從官網中查看,它可以對你的日誌進行收集、分析,支持大量的數據獲取方法,並將其存儲供以後使用(如搜索),server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去,Filebeat對比Logstash更為輕量,但是如果要實現過濾等功能需要用到ES中pipeline技術。
Kibana(https://www.elastic.co/cn/kibana) 是一個基於瀏覽器頁面的Elasticsearch前端展示工具,也是一個開源和免費的工具,Kibana可以為 Filebeat 和 ElasticSearch 提供的日誌分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數據日誌。
單節點EFK搭建使用版本:Elasticsearch6.3.2,Filebeat6.3.2,Kibana6.3.2
因為官網下載速度太慢,可以使用以下連結下載:
Elasticsearch6.3.2: https://pan.baidu.com/s/1i-dbRzQshpro8RQqM9cqeQ 提取碼:1234
Filebeat6.3.2: https://pan.baidu.com/s/1xiQtZe6IVtaPBnjcJTALnA 提取碼:1234
Kibana6.3.2: https://pan.baidu.com/s/1JC8WeMqLsxtIELI4wx_MDw 提取碼:1234
Elasticsearch#將下載的文件上傳到伺服器
#解壓文件
tar -zxvf elasticsearch-6.3.2.tar.gz -C /usr/local/elk/
#更改解壓後文件夾名稱
mv /usr/local/elk/elasticsearch-6.3.2 /usr/local/elk/es
es不能用root用戶啟動,因為es可以接收用戶輸入的腳本並且執行,為了系統安全考慮,需要重新創建用戶。
useradd es_user
切換root用戶將剛剛解壓的es文件夾設置為所有人可讀可寫
su root
chmod -R 777 /usr/local/elk/es/
因為es對當前用戶的內存和可打開的文件數有最小限制,我們需要修改普通用戶的最大內存和最大可打開文件數,如果伺服器本身沒有這麼多內存,可以修改es啟動變量來減少使用的內存大小,具體操作自行查詢
#內存修改
vi /etc/sysctl.conf
#添加以下配置:
vm.max_map_count=262144 #具體大小可以查看es最小內存配置
#執行以下命令生效
sysctl -p
#最大可打開的文件數
vi /etc/security/limits.conf
#添加以下配置
es_user soft nofile 65535
es_user hard nofile 65535
設置配置文件elasticsearch.yml,這裡我只用了部分配置,具體配置詳解:https://www.elastic.co/guide/en/elasticsearch/reference/6.3/modules.html
vi /usr/local/elk/es/config/elasticsearch.yml
#配置內容
cluster.name: es
node.name: node-1
node.master: true
node.data: true
path.data: /usr/local/elk/es/data
path.logs: /usr/local/elk/es/logs
network.host: 0.0.0.0
http.port: 9200
啟動es,並且查看
#切換用戶
su es_user
cd /usr/local/elk/es/
#後臺啟動es,不輸出日誌
nohup bin/elasticsearch >/dev/null 2>&1 &
#後臺啟動es,輸出日誌es_nohup.log
nohup bin/elasticsearch >es_nohup.log 2>&1 &
驗證啟動是否成功
http://ip:9200/
停止es
netstat -tunlp | grep 9200
kill -9 PID
#將下載的文件上傳到伺服器
#解壓文件
tar -zxvf kibana.tar -C /usr/local/elk/
修改配置文件kibana.yml
vi /usr/local/elk/kibana/config/kibana.yml
#配置內容
server.port: 5601
server.host: "0.0.0.0"
#ip 是elasticsearch所在伺服器的IP
elasticsearch.url: "http://ip:9200"
啟動kibana
cd /usr/local/elk/kibana
#後臺啟動kibana,不輸出日誌
nohup config/kibana >/dev/null 2>&1 &
#後臺啟動kibana,輸出日誌 kibana_nohup.log
nohup config/kibana >kibana_nohup.log 2>&1 &
停止kibana
netstat -tunlp | grep 5601
kill -9 PID
#將下載的文件上傳到伺服器
#解壓文件
tar xzvf filebeat-6.3.2-linux-x86_64.tar.gz -C /usr/local/elk/
#更改解壓後文件夾名稱
mv /usr/local/elk/filebeat-6.3.2-linux-x86_64 /usr/local/elk/filebeat
修改配置文件filebeat.yml,可以配置多個配置文件,在啟動時選擇,filebeat配置詳細: https://www.elastic.co/guide/en/beats/filebeat/6.3/filebeat-configuration.html
filebeat.inputs:
- type: log
#啟用
enabled: true
#掃描路徑
paths:
- /home/levi/project_1/logs/log_error.log
- /home/levi/project_1/logs/log_warn.log
- /home/levi/project_1/logs/log_info.log
include_lines: ['INFO', 'WARN', 'ERROR']
#忽略12個小時之前更新的文件
ignore_older: 12h
#自定義欄位
fields:
log_source: project_1
#多行日誌配置
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
#每隔 scan_frequency 時間讀取一次文件內容。對於關閉的文件,如果後續有更新,則經過 scan_frequency 時間後,Filebeat 將重新打開該文件,讀取新增加的內容
scan_frequency: 10s
#生命周期持續時間
close_inactive: 2h
- type: log
enabled: true
paths:
- /home/levi/project_2/logs/log_error.log
- /home/levi/project_2/logs/log_warn.log
include_lines: ['INFO', 'WARN', 'ERROR']
ignore_older: 12h
fields:
log_source: project_2
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
scan_frequency: 10s
close_inactive: 2h
- type: log
enabled: true
paths:
- /home/levi/project_3/logs/*.log
include_lines: ['INFO', 'WARN', 'ERROR']
ignore_older: 12h
fields:
log_source: project_3
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
scan_frequency: 10s
close_inactive: 2h
- type: log
enabled: true
paths:
- /home/levi/project_4/logs/*.log
include_lines: ['INFO', 'WARN', 'ERROR']
ignore_older: 12h
fields:
log_source: project_4
multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}'
multiline.negate: true
multiline.match: after
scan_frequency: 10s
close_inactive: 2h
#==================== Elasticsearch template setting ==========================
setup.template.settings:
#索引分片數量配置
index.number_of_shards: 5
#- Elasticsearch output
output.elasticsearch:
#es 對應伺服器ip
hosts: ["ip:9200"]
#自定義索引名稱
index: "levi-%{[fields.log_source]}"
#es中實現的過濾pipeline綁定
pipeline: "levi-elk-pipeline"
setup:
#es的filebeat模板,用來設置在Elasticsearch中的映射,如果模板加載是啟用的(默認的),Filebeat在成功連接到Elasticsearch後自動加載索引模板
template:
enabled: true
name: "levi"
pattern: "levi-*"
overwrite: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
啟動filebeat之前需要初始化es中的pipeline ,pipeline詳解: https://www.elastic.co/guide/en/elasticsearch/reference/6.3/pipeline.html
PUT _ingest/pipeline/levi-elk-pipeline
{
"description": "levi elk pipeline",
"processors": [
{
"grok": {
"field": "message",
"patterns": [
"""(?<timestamp>(?:%{YEAR}-%{MONTHNUM}-%{MONTHDAY})%{SPACE}(?:%{HOUR}:%{MINUTE}:%{SECOND}.\d{3}))(?<thread>(?:%{SPACE}\[.*?\]%{SPACE}))%{LOGLEVEL:level}(?<class>(?:%{SPACE}(\w+(\.)+)+\w*%{SPACE}))"""
]
}
},
{
"gsub": {
"field": "thread",
"pattern": """\s\[""",
"replacement": ""
}
},
{
"gsub": {
"field": "thread",
"pattern": """\]\s""",
"replacement": ""
}
},
{
"gsub": {
"field": "class",
"pattern": "\\s",
"replacement": ""
}
},
{
"date": {
"field": "timestamp",
"formats": [
"yyyy-MM-dd HH:mm:ss.SSS"
],
"timezone": "Asia/Shanghai"
},
"remove": {
"field": "timestamp"
}
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
啟動filebeat
cd /usr/local/elk/filebeat
#後臺啟動filebeat 且不輸出啟動日誌
nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
#後臺啟動filebeat 輸出啟動日誌 filebeat_nohup.log
nohup ./filebeat -e -c filebeat.yml >filebeat_nohup.log 2>&1 &
停止filebeat
ps -ef|grep filebeat
kill -9 PID