首頁 > 軟體

ELK與Grafana聯合打造視覺化監控來分析nginx紀錄檔

2022-03-22 13:01:52

打造一個帥氣的監控需要什麼:

  • Grafana 前端資料分析平臺
  • Elasticsearch 全文檢索引擎
  • Logstash 紀錄檔收集處理框架
  • dashboard 監控面板出處

前提是elk叢集和Grafana安裝完畢,google上請自行搜尋安裝,這裡不寫了。

修改nginx列印紀錄檔格式

log_format  main  '{"@timestamp":"$time_iso8601",'
                  '"@source":"$server_addr",'
                  '"hostname":"$hostname",'
                  '"ip":"$remote_addr",'
                  '"client":"$remote_addr",'
                  '"request_method":"$request_method",'
                  '"scheme":"$scheme",'
                  '"domain":"$server_name",'
                  '"referer":"$http_referer",'
                  '"request":"$request_uri",'
                  '"args":"$args",'
                  '"size":$body_bytes_sent,'
                  '"status": $status,'
                  '"responsetime":$request_time,'
                  '"upstreamtime":"$upstream_response_time",'
                  '"upstreamaddr":"$upstream_addr",'
                  '"http_user_agent":"$http_user_agent",'
                  '"https":"$https"'
                  '}';

安裝logstash後,修改組態檔

[xxx@localhost ~]# cat  /etc/logstash/conf.d/nginx_access.conf 
input {
    file {
        ## 修改你環境nginx紀錄檔路徑
        path => "/var/logs/xxx/access/*.log"
        ignore_older => 0 
    codec => json
    }
}

filter {
    mutate {
      convert => [ "status","integer" ]
      convert => [ "size","integer" ]
      convert => [ "upstreatime","float" ]
      convert => ["[geoip][coordinates]", "float"]
      remove_field => "message"
    }
#    grok {
#        patterns_dir => [ "/etc/logstash/patterns.d" ]
#        match => { "message" => "%{NGINXACCESS}"}
#    }
    date {
        match => [ "timestamp" ,"dd/MMM/YYYY:HH:mm:ss Z" ]
    }
    geoip {
      source => "client"  ##紀錄檔格式裡的ip來源,這裡是client這個欄位(client":"$remote_addr")
      target => "geoip"
      database =>"/usr/share/GeoIP/GeoLite2-City.mmdb"   ##### 下載GeoIP庫
      add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
      add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
    }
    mutate {
      remove_field => "timestamp"
    }
    if "_geoip_lookup_failure" in [tags] { drop { } } ### 如果解析的地址是內網IP geoip解析將會失敗,會生成_geoip_lookup_failure欄位,這段話的意思是如果內網地址 drop掉這個欄位。
}

output {
        elasticsearch {
        hosts => ["xxx:9200","xxxx:9200","xxxx:9200"]
        index => "logstash-nginx-test-xxxx_%{+YYYY-MM}"
        user => xxxx
        password => xxxx
        }
        stdout { codec => rubydebug }
}

設定解析:

Logstash 分為 Input、Output、Filter、Codec 等多種plugins。

Input:資料的輸入源也支援多種外掛,如elk官網的beats、file、graphite、http、kafka、redis、exec等等等、、、

Output:資料的輸出目的也支援多種外掛,如本文的elasticsearch,當然這可能也是最常用的一種輸出。以及exec、stdout終端、graphite、http、zabbix、nagios、redmine等等、、、

Filter:使用過濾器根據紀錄檔事件的特徵,對資料事件進行處理過濾後,在輸出。支援grok、date、geoip、mutate、ruby、json、kv、csv、checksum、dns、drop、xml等等、、

Codec:編碼外掛,改變事件資料的表示方式,它可以作為對輸入或輸出執行該過濾。和其它產品結合,如rubydebug、graphite、fluent、nmap等等。
具體以上外掛的細節可以去官網,介紹的挺詳細的。下面說下該篇中的組態檔的含義:

input段:

file:使用file 作為輸入源

path: 紀錄檔的路徑,支援/var/log*.log,及[ “/var/log/messages”, “/var/log/*.log” ] 格式 

start_position: 從檔案的開始讀取事件。另外還有end引數 

ignore_older : 忽略早於24小時(預設值86400)的紀錄檔,設為0,即關閉該功能,以防止檔案中的事件由於是早期的被logstash所忽略。

filter段:

grok:資料結構化轉換工具

match:匹配條件格式,將nginx紀錄檔作為message變數,並應用grok條件NGINXACCESS進行轉換 

geoip:該過濾器從geoip中匹配ip欄位,顯示該ip的地理位置  

source:ip來源欄位,這裡我們選擇的是紀錄檔檔案中的最後一個欄位,如果你的是預設的nginx紀錄檔,選擇第一個欄位即可(注:這裡寫的欄位是/opt/logstash/patterns/nginx 裡面定義轉換後的)  

target:指定插入的logstash字斷目標儲存為geoip 

database:geoip資料庫的存放路徑  

add_field: 增加的欄位,座標經度  

add_field: 增加的欄位,座標緯度 

mutate: 資料的修改、刪除、型別轉換  

convert: 將座標轉為float型別  

convert: http的響應程式碼欄位轉換成 int  

convert: http的傳輸位元組轉換成int  

replace: 替換一個欄位

remove_field: 移除message 的內容,因為資料已經過濾了一份,這裡不必在用到該欄位了。不然會相當於存兩份

date: 時間處理,該外掛很實用,主要是用你紀錄檔檔案中事件的事件來對timestamp進行轉換,匯入老的資料必備!在這裡曾讓我困惑了很久哦。別再掉坑了  

match:匹配到timestamp欄位後,修改格式為dd/MMM/yyyy:HH:mm:ss Z

mutate:資料修改 

remove_field: 移除timestamp欄位。

output段:

elasticsearch:輸出到es中  

host: es的主機ip+埠或者es 的FQDN+埠  

index: 為紀錄檔建立索引logstash-nginx-access-*,這裡也就是kibana那裡新增索引時的名稱

GeoIP過濾器的版本4.0.0和更高版本使用MaxMind GeoLite2資料庫並支援IPv4和IPv6查詢。 4.0.0之前的版本使用傳統的MaxMind GeoLite資料庫,僅支援IPv4查詢。

安裝GeoIP:

cd /usr/local/src/
wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
[root@localhost src]# cat /etc/yum.repos.d/epel.repo 
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

yum makecache
yum repolist
yum install geoipupdate
 vim  /etc/GeoIP.conf
ProductIds GeoLite2-City
mkdir /usr/share/GeoIP
geoipupdate 
ll /usr/share/GeoIP

啟動logstash

nohup  /usr/share/logstash/bin/logstash -f  /etc/logstash/conf.d/nginx_access.conf  &

安裝Grafana

設定Grafana資料來源

1.進grafana面板,type選擇elasticsearch

2.url填寫http://127.0.0.1:9200, access選proxy

3.index-name寫上之前組態檔裡的索引名稱

4.version選5.x

設定Grafana 畫圖模版

匯入模版 搜尋模版 

等一會就會出來文章開頭的第一個圖了 ~~

以上就是ELK Grafana打造視覺化監控來分析nginx紀錄檔 的詳細內容,更多關於ELK Grafana打造視覺化監控來分析nginx紀錄檔 的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com