前言
前面我們搭建好了ELFK架構(gòu),也對(duì)配置稍復(fù)雜的logstash進(jìn)行了一些簡(jiǎn)單的實(shí)踐,現(xiàn)在來(lái)嘗試收集一下nginx日志吧
準(zhǔn)備前工作
我們首先在nginx中定義一個(gè)自己想要的格式,如:
log_format access_ty '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'$http_user_agent $http_x_forwarded_for $request_time $upstream_addr $upstream_status $upstream_response_time';
在conf中定義訪問(wèn)日志時(shí)來(lái)引用access_ty這個(gè)自定義名字即可
access_log /var/log/nginx/access_test.log access_ty;
訪問(wèn)一下,得出日志數(shù)據(jù)如下,這個(gè)就作為我們的測(cè)試數(shù)據(jù)了:
100.100.201.135 - - [20/Mar/2023:17:40:12 +0800] "GET / HTTP/1.1" 404 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 - 0.001 192.168.1.132:8005 404 0.000
思路
- Filebeat定義nginx日志路徑,可固定也可通配符。將收集到的內(nèi)容 發(fā)送給logstash進(jìn)行過(guò)濾處理
- Logstash接收到filebeat發(fā)來(lái)的日志,進(jìn)入到過(guò)濾階段 通過(guò)grok正則將字段進(jìn)行分解,可自定義某些冗余字段對(duì)其刪除
- 處理后將message發(fā)給es,es中創(chuàng)建對(duì)應(yīng)的索引
- kibana創(chuàng)建與es索引對(duì)應(yīng)的
index patterns在界面可進(jìn)行查看
步驟
將測(cè)試數(shù)據(jù)寫(xiě)入/opt/nginx.log中
echo '100.100.201.135 - - [20/Mar/2023:17:40:12 +0800] "GET / HTTP/1.1" 404 0 "-" Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 - 0.001 192.168.1.132:8005 502 0.000'>>/opt/nginx.log
一.Filebeat配置
vim /opt/filebeat/filebeat.yaml
filebeat.inputs:
- type: log
input_type: log
paths:
- /opt/*.log
tags: ["nginx", "access"]
fields:
logIndex: nginx
docType: nginx_access
fields_under_root: true
tail_files: false
output.logstash:
enabled: true
hosts: ["192.168.2.113:5044"]
二.Logstash配置
注意:這個(gè)grok正則配置要根據(jù)自己的格式來(lái),這里用的都是內(nèi)置封裝好的正則。調(diào)試的方法可以去kibana或者grok在線網(wǎng)站去將 測(cè)試數(shù)據(jù)和grok規(guī)則 調(diào)試匹配好再寫(xiě)到配置文件中 ,節(jié)省時(shí)間。
%{IPV4:client_ip} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:request_method} %{DATA:request_path} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:response_size} \"%{DATA:http_referer}\" %{DATA:user_agent} - %{NUMBER:request_time:float} %{IPV4:upstream_ip}:%{NUMBER:upstream_port:int} %{NUMBER:upstream_response_code:int} %{NUMBER:upstream_response_time:float}
vim /opt/logstash/config/logstash.conf
input {
beats {
port => 5044
client_inactivity_timeout => 36000 #filebeat連接logstash超時(shí)時(shí)間
}
}
filter {
# if [type] == "nginx_access"{
grok {
match => { "message" => "%{IPV4:client_ip} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:request_method} %{DATA:request_path} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:response_size} \"%{DATA:http_referer}\" %{DATA:user_agent} - %{NUMBER:request_time:float} %{IPV4:upstream_ip}:%{NUMBER:upstream_port:int} %{NUMBER:upstream_response_code:int} %{NUMBER:upstream_response_time:float}" }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp" #將匹配到的timestamp寫(xiě)入到@timestap
remove_field => [ "timestamp" ] #匹配到結(jié)果以后去除timestamp字段
}
# }
}
output {
elasticsearch {
hosts => ["http://192.168.2.114:9200","http://192.168.2.115:9200","http://192.168.2.116:9200"]
index => "nginx-logs-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
user => "logstash_server"
password => "123456"
}
# stdout { codec => rubydebug } #在輸出控制臺(tái)調(diào)試
}
啟動(dòng)logstash
cd /opt/logstash/config && ../bin/logstash -f logstash.conf
整個(gè)過(guò)程可以都打開(kāi)Filebeat和logstash日志來(lái)實(shí)時(shí)查看。
三.Kibana配置并查看
如果上面日志都無(wú)報(bào)錯(cuò),kibana上查看es索引應(yīng)該是有了的。在對(duì)應(yīng)es的索引創(chuàng)建kibana的index pattern


在寫(xiě)入一次測(cè)試數(shù)據(jù)。再次查看,成功收集到了

遇到的問(wèn)題
Q1:
保證正則沒(méi)問(wèn)題的情況下,寫(xiě)入測(cè)試數(shù)據(jù)后,filebeat收集到日志了,但是es上并沒(méi)有創(chuàng)建nginx-logs-03-20這個(gè)日期的索引,因?yàn)槲以趌ogstash配置里定義es塊的時(shí)候?qū)懨髁耸钱?dāng)天日期作為標(biāo)識(shí),結(jié)果并沒(méi)有。
原因與解決:
寫(xiě)入測(cè)試數(shù)據(jù)的時(shí)候,其中的日志時(shí)間并不是當(dāng)天,而是[17/Mar/2023:17:40:12 +0800],17號(hào),所以將這個(gè)日志信息寫(xiě)入到了nginx-logs-03-17這個(gè)索引中,因?yàn)闇y(cè)試階段都是固定的數(shù)據(jù),所以把日志改成當(dāng)天的來(lái)模擬就好了,正式用的時(shí)候都自動(dòng)收集實(shí)時(shí)信息,不會(huì)出現(xiàn)這個(gè)問(wèn)題的。
Q2:
日志消息寫(xiě)入到了es,但是kibana查看不到?
原因與解決:
通過(guò)查es索引得知已寫(xiě)入到了es中,那問(wèn)題可能就在kibana上,解決辦法是將kibana儀表盤(pán)右上角時(shí)間先設(shè)定為this year即可看到。
原因?yàn)槭占娜罩緮?shù)據(jù)中如,[20/Mar/2023:17:40:12 +0800]為@timestamp ,kibana是根據(jù)這個(gè)來(lái)顯示日志的,所以我們要讓收集時(shí)間和@timestamp相同。所以logstash中配置以下內(nèi)容:
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp" #將匹配到的timestamp寫(xiě)入到@timestap
remove_field => [ "timestamp" ] #匹配到結(jié)果以后去除timestamp字段
}
重啟Logstash配置后刪除es中索引和kibana對(duì)應(yīng)的index pattern再次查看
總結(jié)
了解elfk的工作流,出現(xiàn)問(wèn)題,一步步排查,通過(guò)日志,每個(gè)階段每個(gè)階段的來(lái)查看日志是否能寫(xiě)進(jìn)這一階段。
查看是否能寫(xiě)到es中,在看是否能過(guò)濾成功。調(diào)試filebeat---logstash時(shí)多通過(guò)控制輸入/輸出臺(tái)來(lái)調(diào)試 可大幅提升效率
控制臺(tái)輸出調(diào)試:stdout { codec => rubydebug }