1. 程式人生 > >elk+filebeat的安裝 並 分析nginx日誌(推薦)

elk+filebeat的安裝 並 分析nginx日誌(推薦)

關於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訪問日誌各個可用引數變量表

nginx訪問日誌變數