
一,EKL介紹
1.1 需求背景
一般我們需要進行日志分析場景:直接在日志文件中 grep、awk 就可以獲得自己想要的信息。但在規模較大的場景中,此方法效率低下,面臨問題包括日志量太大如何歸檔、文本搜索太慢怎么辦、如何多維度查詢。需要集中化的日志管理,所有服務器上的日志收集匯總。常見解決思路是建立集中式日志收集系統,將所有節點上的日志統一收集,管理,訪問。
一般大型系統是一個分布式部署的架構,不同的服務模塊部署在不同的服務器上,問題出現時,大部分情況需要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日志系統,可以提高定位問題的效率。
一個完整的集中式日志系統,需要包含以下幾個主要特點:
收集-能夠采集多種來源的日志數據
傳輸-能夠穩定的把日志數據傳輸到中央系統
存儲-如何存儲日志數據
分析-可以支持 UI 分析
警告-能夠提供錯誤報告,監控機制ELK提供了一整套解決方案,並且都是開源軟件,之間互相配合使用,完美銜接,高效的滿足了很多場合的應用。目前主流的一種日志系統。
1.2 ELKStack介紹

Logstash : 開源的服務器端數據處理管道,能夠同時從多個來源采集數據,轉換數據,然后將數據存儲到數據庫中。
Elasticsearch:搜索,分析和存儲數據,分布式數據庫。
Kibana:數據可視化。
Beats:輕量型采集器的平台,從邊緣機器向Logstash和Elasticsearch發送數據。
Filebeat:輕量型日志采集器。
1.3 ELK Stack架構

Input:輸入,輸出數據可以是Stdin,File,TCP,Redis,Syslog等
Filter:過濾,將日志格式化。有豐富的過濾插件:Grok正則捕獲,Date時間處理,Json編碼解碼,Mutate數據修改等
Output:輸出,輸出目標可以是Stdout,File,TCP,Redis,ES等
二,環境部署
| 主機名 | IP | 備注 |
|---|---|---|
| elkstack | 192.168.200.70 | 內存3G |
ELK所有包
鏈接:https://pan.baidu.com/s/1PTUOKy5MNXYIhSUkkbb-DA
提取碼:fa6n
2.1 環境要求
cat /etc/redhat-release
uname -r
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

2.2 安裝jdk環境
ls
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_60 /usr/local/jdk

2.3 配置java環境變量
vim /etc/profile
tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk/export PATH=$PATH:$JAVA_HOME/binexport CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
source /etc/profile
java -version

三,kibana的安裝和啟動
3.1 kibana下載地址
kibana主要用來展現數據,它本身不存儲數據
https://artifacts.elastic.co/downloads/kibana/kibana-6.2.3-linux-x86_64.tar.gz
3.2 編譯部署kibana
useradd -s /sbin/nologin -M elk
ls
tar xf kibana-6.2.3-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/kibana-6.2.3-linux-x86_64 /usr/local/kibana

3.3 kibana配置文件修改
修改以下配置文件
cat -n /usr/local/kibana/config/kibana.yml | sed -n '2p;7p;21p;39p;40p'
2 #server.port: 56017 #server.host: "localhost"21 #elasticsearch.url: "http://localhost:9200"39 #elasticsearch.username: "user"40 #elasticsearch.password: "pass"

修改成如下配置文件
vim /usr/local/kibana/config/kibana.yml
cat -n /usr/local/kibana/config/kibana.yml | sed -n '2p;7p;21p;39p;40p'
2 server.port: 5601 #暫時就先修改這兩行7 server.host: "0.0.0.0" #暫時就先修改這兩行21 #elasticsearch.url: "http://localhost:9200"39 #elasticsearch.username: "user"40 #elasticsearch.password: "pass"

3.4 把kibana目錄改為elk用戶
chown -R elk:elk /usr/local/kibana/

3.5 新增啟動腳本vim /usr/local/kibana/bin/start.sh
vim /usr/local/kibana/bin/start.sh
cat /usr/local/kibana/bin/start.sh
nohup /usr/local/kibana/bin/kibana >> /tmp/kibana.log 2>> /tmp/kibana.log &
chmod a+x /usr/local/kibana/bin/start.sh

3.6 用普通用戶啟動kibana
su -s /bin/bash elk '/usr/local/kibana/bin/start.sh'
ps -ef | grep elk | grep -v grep
如果有防火牆需要開放tcp5601端口

3.7 查看錯誤日志
cat /tmp/kibana.log | grep warning | head -5
這里有個警告,意思是連接不上elasticsearch,忽略,因為我們還沒有裝它。
{"type":"log","@timestamp":"2019-01-03T14:12:30Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"Unable to revive connection: http://localhost:9200/"}{"type":"log","@timestamp":"2019-01-03T14:12:30Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"No living connections"}{"type":"log","@timestamp":"2019-01-03T14:12:32Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"Unable to revive connection: http://localhost:9200/"}{"type":"log","@timestamp":"2019-01-03T14:12:32Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"No living connections"}{"type":"log","@timestamp":"2019-01-03T14:12:35Z","tags":["warning","elasticsearch","admin"],"pid":1451,"message":"Unable to revive connection: http://localhost:9200/"}

3.7 訪問kibana

四,使用nginx來限制訪問kibana
4.1 使用nginx轉發kibana
由於kibana沒有權限控制,可以借助nginx來部署認證和進行ip控制
修改kibana的配置文件,改為監聽127.0.0.1
vim /usr/local/kibana/config/kibana.yml
sed -n '7p' /usr/local/kibana/config/kibana.yml

殺掉kibana,重啟動kibana
ps -ef | grep elk
kill -9 1451
ps -ef | grep elk
su -s /bin/bash elk '/usr/local/kibana/bin/start.sh'
ps -ef | grep elk | grep -v grep

4.2 借助nginx來限制訪問,控制源IP的訪問
編譯安裝nginx
yum -y install pcre-devel openssl-devel
tar xf nginx-1.10.2.tar.gz -C /usr/src/
cd /usr/src/nginx-1.10.2/
useradd -s /sbin/nologin -M nginx
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
nginx -V



編輯nginx配置文件,進行訪問控制,並啟動nginx
cd /usr/local/nginx/
cp conf/nginx.conf{,.bak}
egrep -v "#|^$" conf/nginx.conf.bak > conf/nginx.conf
vim conf/nginx.conf
cat conf/nginx.conf
worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request"''$status $body_bytes_sent "$http_referer"''"$http_user_agent""$http_x_forwarded_for"';sendfile on;keepalive_timeout 65;server {listen 5609;access_log /usr/local/nginx/logs/kibana_access.log main;error_log /usr/local/nginx/logs/kibana_error.log error;location / {allow 192.168.200.1;deny all;proxy_pass http://127.0.0.1:5601;}}}
nginx -t
nginx
netstat -antup | grep nginx

4.3 訪問nginx監聽端口5609

4.4 如果訪問IP經常改變,授權就會很麻煩。可以利用nginx的訪問驗證功能來認證訪問
location / {auth_basic "elk auth";auth_basic_user_file /usr/local/nginx/conf/htpasswd;proxy_pass http://127.0.0.1:5601;}
五,elasticsearch的安裝和啟動
elasticsearch未安裝之前,kibana網頁上報錯,提示找不到elasticsearch。
5.1 elasticsearch的下載地址
elastic search主要用來存儲數據,供kibana調取並進行展現
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.tar.gz
5.2 解壓部署elasticsearch
ls
tar xf elasticsearch-6.2.3.tar.gz -C /usr/local/
mv /usr/local/elasticsearch-6.2.3 /usr/local/elasticsearch

5.3 elasticsearch配置
修改以下配置文件中的代碼
cp /usr/local/elasticsearch/config/elasticsearch.yml{,.bak}
cat -n /usr/local/elasticsearch/config/elasticsearch.yml | sed -n '33p;37p;55p;59p'
33 #path.data: /path/to/data37 #path.logs: /path/to/logs55 #network.host: 192.168.0.159 #http.port: 9200

修改成如下配置文件中的代碼
vim /usr/local/elasticsearch/config/elasticsearch.yml
cat -n /usr/local/elasticsearch/config/elasticsearch.yml | sed -n '33p;37p;55p;59p'
33 path.data: /usr/local/elasticsearch/data37 path.logs: /usr/local/elasticsearch/logs55 network.host: 127.0.0.159 http.port: 9200

5.4 把elasticsearch目錄的用戶和屬主都更新為elk
chown -R elk:elk /usr/local/elasticsearch

5.5 更改jvm的內存限制(看個人配置,這里沒做修改)
因為我們實驗環境是虛擬機,1g內存一會兒就會被跑滿,就會很慢。所以,我們要調整內存占用的限制。
cat -n /usr/local/elasticsearch/config/jvm.options | sed -n '22p;23p'
22 -Xms1g23 -Xmx1g

vim /usr/local/elasticsearch/config/jvm.options --->這里沒做修改
cat -n /usr/local/elasticsearch/config/jvm.options | sed -n '22p;23p'
22 -Xms100M23 -Xmx100M
5.6 編輯elasticsearch啟動腳本,使用-d進行后台啟動。
vim /usr/local/elasticsearch/bin/start.sh
cat /usr/local/elasticsearch/bin/start.sh
/usr/local/elasticsearch/bin/elasticsearch -d >> /tmp/elasticsearch.log 2>> /tmp/elasticsearch.log
chmod a+x /usr/local/elasticsearch/bin/start.sh

5.7 啟動elasticsearch
su -s /bin/bash elk '/usr/local/elasticsearch/bin/start.sh'
ps -ef | grep elk | grep -v grep

5.8 觀察日志,看看kibana日志還會不會報elasticsearch錯誤
> /tmp/kibana.logtail -f /tmp/kibana.log
重新刷新url:http://192.168.200.70:5609
觀察日志,看看還有沒有報錯。


備注說明
假如elasticsearch如果監聽在非127.0.0.1,那么需要修改內核參數等,在這里就不多說了。
六,logstash的安裝和啟動
6.1 logstash的下載地址
用來讀取日志,正則分析日志,發送給elasticsearch數據庫
https://artifacts.elastic.co/downloads/logstash/logstash-6.2.3.tar.gz
6.2 解壓部署logstash
ls
tar xf logstash-6.2.3.tar.gz -C /usr/local/
mv /usr/local/logstash-6.2.3 /usr/local/logstash

6.3 更改logstash jvm配置,加入內存限制(看個人配置,這里沒有修改)
修改如下配置
cat -n /usr/local/logstash/config/jvm.options | sed -n '6p;7p;'
6 -Xms1g7 -Xmx1g

修改成如下配置(沒做修改)
cat -n /usr/local/logstash/config/jvm.options | sed -n '6p;7p;'
6 -Xms150M7 -Xmx150M
6.4 修改logstash配置文件
配置文件沒有,需要新建
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {file {path => "/usr/local/nginx/logs/kibana_access.log" #讀取日志路徑}}output {elasticsearch {hosts => ["http://127.0.0.1:9200"] #保存日志url}}

6.5 logstash的啟動腳本
vim /usr/local/logstash/bin/start.sh
cat /usr/local/logstash/bin/start.sh
nohup /usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf >> /tmp/logstash.log 2>> /tmp/logstash.log &
chmod a+x /usr/local/logstash/bin/start.sh

6.6 啟動logstash
logstash並沒有監聽端口,因此不需要用elk用戶來啟動
/usr/local/logstash/bin/start.sh
ps -ef | grep logstash

特別提示
logstash啟動的比較慢,需要多等一會兒。
如果在kibana的Discover里能看到添加索引就說明logstash啟動好了

6.7 在kibana上配置索引,展現獲取的kibana日志數據



圖片說明

進行數據展現字段的篩選


對nginx的kibana_access.log進行數據追蹤,對比分析
tail -f /usr/local/nginx/logs/kibana_access.log


七,logstash使用詳解
執行下邊的命令
ps -ef | grep logstash
kill -9 17120
/usr/local/logstash/bin/logstash -e ""
welcome --->輸入的內容
{"@version" => "1","@timestamp" => 2018-08-16T13:18:13.383Z,"message" => "welcome","type" => "stdin","host" => "elkstack"}
可以看到logstash結尾自動添加了幾個字段,時間戳@timestamp,版本@version,輸入的類型type,以及主機名host

7.1 logstash工作原理
Logstash使用管道方式進行日志的搜集處理和輸出。有點類似於管道命令xxx|ccc|ddd,xxx執行完了會執行ccc,然后執行ddd。
在logstash中,包括了三個階段:
輸入input ---> 處理filter(不是必須的) ---> 輸出output

每個階段都有很多的插件配合工作,比如file,elasticsearch,redis等
每個階段也可以指定多種方式,比如輸出既可以輸出到elasticsearch中,也可以指定到stdout在控制台打印。
由於這種插件式的組織方式,使得logstash變得易於擴展和定制
7.2 命令行中常用的命令
-f:通過這個命令可以指定Logstash的配置文件,根據配置文件配置logstash
-e:后面跟着字符串,該字符串可以被當作logstash的配置(如果是""則默認使用stdin作為默認輸入,stdout作為默認輸出)
-l:日志輸出的地址(默認就是stdout直接在控制台中輸出)
-t:測試配置文件是否正確,然后退出。
7.3 配置文件說明
前面介紹過logstash基本上由三部分組成,input,output以及用戶需要才添加的filter,因此標准的配置文件格式如下:
input {...}filter {...}output {...}

在每個部分中,也可以指定多個訪問方式,例如我想要指定兩個日志來源文件,則可以這樣寫:
input {file { path => "/var/log/messages" type => "syslog" }file { path => "/var/log/apache/access.log" type => "apache" }}
類似的,如果在filter中添加了多種處理規則,則按照它的順序----處理,但是有一些插件並不是線程安全的。
比如在filter中指定了兩個一樣的插件,這兩個任務並不能保證准確的按順序執行,因此官方也推薦避免在filter中重復使用插件。
八,利用logstash的正則進行日志信息的抓取測試
我們更改一下logstash的配置文件進行正則抓取數據的測試。
logstash提取數據段配置文件模板詳解
cd /usr/local/logstash/config/
vim logstash.conf
cat logstash.conf
input {stdin{} #從標准輸入讀取數據}filter {grok {match => {"message" => '(?<字段名>正則表達式).*'}}}output {elasticsearch { #如果要輸入到elasticsearch里,那么需要注釋掉stdout{}hosts => ["http://127.0.0.1:9200"]}stdout { #只將信息輸出到屏幕上codec => rubydebug #用於正則提取測試,將正則抓取結果輸出到屏幕上}}
殺掉后台的logstash進程
ps -ef | grep logstash --->查詢PID號
kill -9 PID號

為了測試方便,我們暫時交互式啟動logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf
8.1 測試性抓取日志字段
用於進行測試輸入的日志內容
Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.
修改logstash配置文件
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {stdin{}}filter {grok {match => {"message" => '(?<mydate>[a-zA-Z]+ [0-9]+ [0-9:]+) (?<hostname>[a-zA-Z]+).*'}}}output {elasticsearch {hosts => ["http://127.0.0.1:9200"]}stdout {codec => rubydebug}}

交互式啟動logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf

輸出結果如下
Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.
{"hostname" => "ELK", #這就是抓取的字段"mydate" => "Aug 16 18:29:49", #這就是抓取的字段"@timestamp" => 2018-08-16T12:47:46.904Z,"message" => "Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.","host" => "elkstack","@version" => "1"}

請通過配置文件進行反復測試驗證,熟悉logstash正則表達的使用方法
8.2 將抓取的字段信息輸入到elasticsearch並顯示在kibana上
logstash配置文件如下
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {stdin{}}filter {grok {match => {"message" => '(?<mydate>[a-zA-Z]+ [0-9]+ [0-9:]+) (?<hostname>[a-zA-Z]+).*'}}}output {elasticsearch {hosts => ["http://127.0.0.1:9200"]}# stdout {# codec => rubydebug# }}

用於進行測試輸入的日志內容
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf
Aug 16 18:29:49 ELK systemd: Startup finished in 789ms (kernel) + 1.465s (initrd) + 18.959s (userspace) = 21.214s.


九,elk技術全量分析nginx日志
logstash如果直接把一整行日志直接發送給elasticsearch,kibana顯示出來就沒有什么意義,我們需要提取自己想要的字段。假如說我們想要提取響應碼,用戶訪問url,響應時間等,就得依靠正則來提取。
logstash提取數據段配置文件模板詳解
input { #日志輸入來源函數file {path => "/usr/local/nginx/logs/kibana_access.log"}}filter { #字段數據提取函數grok {match => {"message" => '(?<字段名>正則表達式).*'}}}output { #數據輸出目的地函數elasticsearch {hosts => ["http://127.0.0.1:9200"]}}
9.1 利用正則從message中提取kibana訪問日志的IP地址

vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {file {path => "/usr/local/nginx/logs/kibana_access.log"}}filter {grok {match => {"message" => '(?<IP>[0-9.]+) .*'}}}output {elasticsearch {hosts => ["http://127.0.0.1:9200"]}}

交互式啟動logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf

檢查測試結果


9.2 從message中提取kibana訪問日志的time,url,返回碼,字節大小
vim /usr/local/logstash/config/logstash.conf
cat /usr/local/logstash/config/logstash.conf
input {file {path => "/usr/local/nginx/logs/kibana_access.log"}}filter {grok {match => {"message" => '(?<IP>[0-9.]+) .*HTTP/[0-9.]+"(?<mark>[0-9]+) (?<size>[0-9]+)[ "]+(?<url>[a-zA-Z]+://[0-9.]+:[0-9]+/[a-zA-Z/]+)".*'}}}output {elasticsearch {hosts => ["http://127.0.0.1:9200"]}}

交互式啟動logstash
/usr/local/logstash/bin/logstash -f /usr/local/logstash/config/logstash.conf

檢查測試結果

