elk+filebeat的安裝 並 分析nginx日誌(推薦)
阿新 • • 發佈:2018-11-22
關於elk及其相關元件的介紹,參看此文https://boke.wsfnk.com/archives/67.html
系統規劃
服務型別 OS版本 IP地址 主機名
elk端 centos7.4 192.168.1.26 elk-server
log端 centos7.4 192.168.1.40 boke-host
在elk端安裝三大元件
#新增官方的源 vi /etc/yum.repos.d/elk6.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 #安裝基礎元件(清除/重建)(升級系統)(安裝elk端相關元件) yum install tree wget bash-c* epel* -y yum clean ; yum makecache yum update -y ; init 6 yum install java-1.8.0-openjdk kibana logstash elasticsearch -y
配置elasticsearch
#修改配置檔案 vi /etc/elasticsearch/elasticsearch.yml cluster.name: my-application #配置叢集名稱,無論是否計劃建立叢集,建議配置一個名稱 #node.name: node-1 #該elasticsearch節點的名稱,如果需要建立叢集,該節點名稱不可重複!!! network.host: localhost #只允許本機訪問 node.name: elk-server #本節點叫什麼名字(若是叢集才能體現價值) path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch #啟動 systemctl start elasticsearch.service systemctl enable elasticsearch.service #檢查 [
[email protected] ~]# curl http://localhost:9200 { "name" : "elk-server", "cluster_name" : "my-application", "cluster_uuid" : "KiYwI_OsS5mvqxMyeqTKoQ", "version" : { "number" : "6.1.3", "build_hash" : "af51318", "build_date" : "2018-01-26T18:22:55.523Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
配置kibana
#修改配置檔案
vi /etc/kibana/kibana.yml
server.host: "localhost" #僅本地可訪問
elasticsearch.url: "http://localhost:9200"
#啟動
systemctl start kibana.service
systemctl enable kibana.service
#防火牆配置
systemctl stop firewalld
#驗證,瀏覽器訪問
http://192.168.1.26:5601
配置logstash
#logstash的配置檔案完全不需要修改:
vi /etc/logstash/logstash.yml
path.data: /var/lib/logstash #logstash資料儲存路徑,保持預設即可
path.config: /etc/logstash/conf.d/*.conf #logstash動態載入的配置檔案,所有自定義的輸入、輸出和過濾配置都放置在這個目錄中並以.conf結尾
path.logs: /var/log/logstash #logstash日誌檔案路徑,保持預設即可
#檢視logstash的主配置檔案
ll -alh /etc/logstash/
#檢視logstash可執行檔案路徑
ll -alh /usr/share/logstash/
logstash輸入配置/過濾配置/輸出配置(下面是關於nginx的訪問日誌的,輸入,過濾,輸出的規則)
#在啟動之前需要先編寫輸入、過濾、輸出的相關配置檔案,以下是我常用的一些配置檔案,不同型別的配置檔案可加上數字字首,以便區分:
[[email protected] conf.d]# ll /etc/logstash/conf.d/
總用量 20
-rw-r--r--. 1 root root 2280 2月 4 00:46 00-filter-wsfnk-nginx-access-5044.conf
-rw-r--r--. 1 root root 59 2月 3 06:55 00-input-5044.conf
-rw-r--r--. 1 root root 157 2月 4 00:49 90-output-wsfnk-nginx-access-5044.conf
[[email protected] conf.d]# cat 00-input-5044.conf
input {
beats {
port => 5044
#codec => json #由於可能多種日誌格式不一樣,所以不在此處進行格式過濾
}
}
[[email protected] conf.d]# cat 00-filter-wsfnk-nginx-access-5044.conf
filter {
if [type] == "wsfnk-nginx-access" {
###-----由於我的部落格nginx的日誌格式是設定為json的---所以需要先用json外掛處理
json {
#log端filebeat傳送的資料主體資訊,標識為"message"
source => "message"
#處理完成後可以刪除"message"欄位,因為已經交給下面的其他步驟進一步處理了
remove_field => ["message"]
}
###----#下面是處理日誌中upstreamtime的資訊,由於mutate外掛中split與convert存在預設的先後執行順序
#所以要分開寫,迫使先執行分割"split",在轉換"convert"
mutate {
split => [ "upstreamtime", "," ]
}
mutate {
convert => [ "upstreamtime", "float" ]
}
###-----------分析經過CDN後,記錄到的真實客戶端IP歸屬資訊-----###
geoip {
source => "http_x_forwarded_for"
#geoip,輸出引數較多,用fields保留需要的欄位, "latitude", "longitude"(location能代替前面兩個)
fields => ["ip", "country_name", "region_name", "city_name", "timezone", "country_code2", "continent_code", "location"]
}
###----------------分析客戶端資訊----------------###
#使用logstash-filter-useragent外掛來分析日誌中nginx日誌中的"http_user_agent"欄位的客戶端資訊,系統類別,版本,瀏覽器等等
#先判斷[user_agent] 是不為空的,才執行下面的過濾,[user_agent]這個欄位不能改動,是外掛內設定的,下面的source才是你nginx關於客戶端的記錄變數名
if [user_agent] != "-" {
useragent {
#為http_user_agent分析後的資訊,打上(browser)瀏覽器的標記
target => "browser"
source => "http_user_agent"
#刪除一些不太準確的欄位,注意,下面是表示刪除browser下面的"minor, build, os, os_minor"欄位
#剩下的name: 瀏覽器的類別, major: 瀏覽器版本, os_name: 裝置類別(什麼系統), os_major: 系統版本
remove_field => ["[browser][minor]", "[browser][build]", "[browser][os]", "[browser][os_minor]"]
#這個客戶端瀏覽器標識已經使用完了,可以刪除,也可以不刪除,我這裡就刪除了
remove_field => ["http_user_agent"]
}
}
mutate {
#刪除filebeat自動新增的欄位(有"tags", "beat"等,其中beat欄位下又有"version","name","hostname"等欄位,
#某些版本的filebeat還會附帶"prospector"欄位)
#"host"欄位也是beat自動新增的,避免重複資料,將"[host]"刪除,保留"[beat][hostname]"
remove_field => ["tags", "[beat][name]", "[host]"]
}
}
}
[[email protected] conf.d]# cat 90-output-wsfnk-nginx-access-5044.conf
output {
#先進行判斷,是為了在有多個輸入時,不讓其出現重複資料
if [type] == "wsfnk-nginx-access" {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "wsfnk-nginx-access-%{+YYYY.MM.dd}"
}
}
}
#啟動logstash
systemctl start logstash
#過一會兒,檢視(5044埠有起來沒)
ss -tnl |grep 5044
log端配置nginx日誌格式配置
由於我的部落格前端用來CDN,所以我將nginx日誌格式調整為如下
log_format json '{ "@timestamp": "$time_iso8601", '
#'"server_host":"$server_addr",'
#直接將伺服器的ip寫在這兒,防止用變量出去linux核心
'"server_addr":"192.168.1.40",'
'"http_host":"$http_host",'
'"nginx_version":"$nginx_version",'
'"cdn_ip":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"request_method":"$request_method",'
'"http_user_agent":"$http_user_agent",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"url":"$uri",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"scheme":"$scheme",'
'"server_protocol":"$server_protocol",'
'"status":"$status"}';
access_log /var/log/nginx/access.log json;
#log端配置filebeat配置
#filebeat安裝
配置yum源(選擇版本號為5的,因為版本6的document_type欄位好像不能使用了)
vi /etc/yum.repos.d/filebeat.repo
[elastic-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
yum install filebeat -y
vi /etc/filebeat/filebeat.yml
filebeat.prospectors:
- input_type: log
paths:
- /var/log/nginx/access.log
document_type: wsfnk-nginx-access
#------------ Logstash output -----------------
output.logstash:
# The Logstash hosts
hosts: ["223.84.153.80:5044"]
#啟動
systemctl start filebeat
systemctl enable filebeat
附:nginx access訪問日誌各個可用引數變量表