問題是這樣的,小弟參考「Logstash收集Nginx日志」撰寫了 Logstash的腳本
腳本代碼:
input {
file {
path => "/var/log/nginx/access.log"
start_position => "beginning"
type => "nginx"
}
}
filter {
grok {
match => { "message" => "%{IPORHOST:http_host} %{IPORHOST:clientip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:http_verb} %{NOTSPACE:http_request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{NUMBER:request_time:float}"}
}
geoip {
source => "clientip"
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["172.16.16.64:9200"]
index => "nginx-text-%{+YYYY.MM.dd}"
}
}
然後透過 Elasticsearch 查詢,可以查看到access.log傳輸過去的資訊
「問題一」
關於Elasticsearch 左下角欄位的部分,內容是透過Logstash腳本撰寫的內容新增進去的嗎?
「問題二」
因為小弟需要這個「request」欄位資訊,腳本上也有寫道,但在Elasticsearch中卻沒有這個欄位出現,下圖是小弟很久以前學長留下來的資料,剛好拿來參考,但是沒人可以詢問,所以只好自行摸索
也有參考了學長的代碼
filter {
if [type] == "syslog" {
grok {
match => [ "message" , "%{HOSTNAME:http_host} %{COMBINEDAPACHELOG} %{DATA:rawrequest} \"(?<x_forwarded_for>%{IP:true_clientip},*.*)\""]
overwrite => [ "message" ]
}
mutate {
convert => ["response", "integer"]
convert => ["bytes", "integer"]
convert => ["responsetime", "float"]
rename => { "clientip" => "reverse-ip" }
rename => { "rawrequest" => "request_body" }
split => { "x_forwarded_for" => ", " }
}
geoip {
source => "true_clientip"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
timezone => "Etc/GMT-8"
remove_field => [ "timestamp" ]
}
useragent {
source => "agent"
}
}
}
因為也有直接把學長的代碼照搬,但該欄位仍然沒有出現,nginx.conf配置是一樣的,所以想詢問,是否為Elasticsearch Server端有什麼部分的不同
「狀態一」
小弟ELK的設計方式是,一台 Elasticsearch Server 加 一台 nginx-API
因此是在 nginx-API 裝 Logstash 在/opt/logstash/bin
底下寫腳本
透過path => "/var/log/nginx/access.log"
方式蒐集Log,
在傳輸到Elasticsearch Server端
學長的ELK設計方式是,一台 Elasticsearch Server 加 一台 nginx-API
是在nginx.conf 中透過host => "Elasticsearch Server ip"
使用 Host的方式將Log傳輸到Elasticsearch+Logstash Server做蒐集,
然後再傳輸給本機自己的Elasticsearch:9200存放
但是學長腳本是寫在/etc/logstash/conf.d
底下
因為我的執行方式是/opt/logstash/bin/./logstash -f logstash.conf
關於/etc/logstash/conf.d
底下的執行方式,我也有去Google過了,因為覺得兩種執行方式對上述兩個問題影響應該不大,所以暫時沒有處理的時間
主要是上述兩個問題,已經消耗了一天半的時間,可能是自己觀念上的問題,造成Google後也無法明確的解決問題,因為在IT邦看過 raytracy 大大 回答過關於ELK的問題,所以這邊擅自邀請您了,希望您不會介意
6/19 17:50 補充進度
目前用我的機器和學長的機器進行交叉比對
已經撇除Elasticsearch Server端的問題了,然後腳本的部分使用學長的代碼,也撇除掉了
使用學長的腳本,不管是丟資料到我的Elasticsearch Server還是學長的Elasticsearch Server,都是能正確顯示欄位的
因此判斷是nginx.conf的問題,已經將我的機器的nginx配置和學長的一樣了,我的機器傳輸Log至Elasticsearch Server端依然無法出現該欄位
請分別在你的主機, 和學長的主機上跑:
nginx -T
再比較看看兩者的輸出有甚麼不同?
此外, 你產出的 access.log 格式, 和學長產出的, 兩者有沒有不同? 可以分別各貼個範例出來看看嗎?
(難得遇到可以把問題和環境盡量講得很清楚的樓主....)
(一定要 Tag 這麼硬的題目嗎...有沒有簡單一點的...)
tag雷神當然只有硬題目。XD
我是最近沒啥心情玩,要不然就建個lab來試試ELK了。
我的機器與學長的機器 nginx -t 結果都是正常的,訊息一樣
#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
access.log訊息 (圖1為學長機器、圖2為我的機器;上1下2)
access.log訊息,大略說明:
紅框處是我要擷取的request欄位訊息,在腳本(學長腳本)上也有寫到
一樣的腳本傳輸到一樣的Elasticsearch Server,用一樣的傳輸方式
在Elasticsearch得到的結果:
由此圖可知,Elasticsearch都有收到我和學長這兩台傳輸過去的request欄位訊息(紅框處),但是學長傳過去的資料,會獨立出一個request欄位,而我傳輸過去的資料卻沒有該欄位
等等....我上面是寫 -T 不是 -t....
通常遇到一些問題,我都會先Google找解決方案,真的試過無果後才在這邊求助,然後邊等求助資訊邊繼續在「知乎」或查看一些國外資訊並繼續嘗試,這還算是我第一次,兩手攤攤、束手無策的一次了
nginx -T
蠻多東西的,不知道怎麼擷取
有用Notepad的Compare功能進行比對
/etc/nginx/nginx.conf 是一模一樣的
我分別給您/etc/nginx/conf.d 底下的配置內容,
效果會和 nginx -T 一樣嗎
我的 nginx.conf 和 學長的 nginx.conf內容
光看 nginx.conf 不準, 因為我不知道你的 nginx 是否會跑去別的地方, 讀了某個隱藏的 config 進來套用?
像我的 nginx 就藏了這麼多個 config, 而且不是放在同一個目錄內, 如果外人來看的話, 他只看一個 nginx.conf 會漏掉很多:
./plesk.conf.d/vhosts/dqbz-ivory.mori.cloud.conf
./plesk.conf.d/vhosts/doqubiz.com.conf
./plesk.conf.d/server.conf
./conf.d/phusion-passenger.conf
./conf.d/ssl.conf
./conf.d/zz010_psa_nginx.conf
./fastcgi.conf
./modules.conf.d/phusion-passenger.conf
./nginx.conf
nginx -T 就是叫他把目前執行中的所有 config 參數都吐出來, 這樣可以確保我們看到 nginx 真正拿去使用的 config 有哪些? 而不是只靠 nginx.conf 去猜....
nginx -T > config.log
這樣就可以存下來, 用 less 慢慢看啊...
我猜:
access_log /var/log/nginx/scott-api-access.log;
後面沒有加 main 參數?...
看起來你們兩人吐出來的 log format 似乎不相同?....
學長的在 agent 後面還多了一長串疑似 payload 的資料, 但是你的到了 agent 就停掉了...資料長度不同, 可能會影響 logstash 的欄位拆解...
好 ...,我往這方面研究看看,整理一下nginx -T 的資訊,謝謝你給我一點方向,我怕太久沒回您,哈哈
raytracy
終於!!!!悲憤啊!!
多虧有您,資料終於正確跑出來了
您說的沒錯,沒有「加入main 參數」是因素之一,但是最主要的還是
我nginx配置的request部分,本來是寫在 80port底下,後來改到443port底下就出來了,雖然不太清楚為什麼
但我接下的任務就是
謝謝您 (鞠躬