iT邦幫忙

1

關於 ELK 之 Logstash Script 撰寫和 Elasticsearch 欄位問題 (感謝 raytracy 協助解決)

問題是這樣的,小弟參考「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傳輸過去的資訊
https://ithelp.ithome.com.tw/upload/images/20190619/20114520DDlxv3iAmG.png


「問題一」

關於Elasticsearch 左下角欄位的部分,內容是透過Logstash腳本撰寫的內容新增進去的嗎?


「問題二」

因為小弟需要這個「request」欄位資訊,腳本上也有寫道,但在Elasticsearch中卻沒有這個欄位出現,下圖是小弟很久以前學長留下來的資料,剛好拿來參考,但是沒人可以詢問,所以只好自行摸索
https://ithelp.ithome.com.tw/upload/images/20190619/20114520PjFF91AC7F.png

也有參考了學長的代碼

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端依然無法出現該欄位

1 個回答

1
raytracy
iT邦大神 1 級 ‧ 2019-06-19 18:19:40
最佳解答

請分別在你的主機, 和學長的主機上跑:

nginx -T

再比較看看兩者的輸出有甚麼不同?

此外, 你產出的 access.log 格式, 和學長產出的, 兩者有沒有不同? 可以分別各貼個範例出來看看嗎?

(難得遇到可以把問題和環境盡量講得很清楚的樓主....)
(一定要 Tag 這麼硬的題目嗎...有沒有簡單一點的...)
/images/emoticon/emoticon06.gif

看更多先前的回應...收起先前的回應...
froce iT邦大師 1 級 ‧ 2019-06-19 19:46:15 檢舉

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)
https://ithelp.ithome.com.tw/upload/images/20190620/20114520tboyz7BlvY.png
https://ithelp.ithome.com.tw/upload/images/20190620/20114520Nw1iYYG3fX.png


access.log訊息,大略說明:
紅框處是我要擷取的request欄位訊息,在腳本(學長腳本)上也有寫到
https://ithelp.ithome.com.tw/upload/images/20190620/20114520PvVk0osZd6.png
一樣的腳本傳輸到一樣的Elasticsearch Server,用一樣的傳輸方式
在Elasticsearch得到的結果:
https://ithelp.ithome.com.tw/upload/images/20190620/20114520qM0behSJ0g.png

由此圖可知,Elasticsearch都有收到我和學長這兩台傳輸過去的request欄位訊息(紅框處),但是學長傳過去的資料,會獨立出一個request欄位,而我傳輸過去的資料卻沒有該欄位

raytracy iT邦大神 1 級 ‧ 2019-06-20 09:11:37 檢舉

等等....我上面是寫 -T 不是 -t....

通常遇到一些問題,我都會先Google找解決方案,真的試過無果後才在這邊求助,然後邊等求助資訊邊繼續在「知乎」或查看一些國外資訊並繼續嘗試,這還算是我第一次,兩手攤攤、束手無策的一次了/images/emoticon/emoticon17.gif

nginx -T

蠻多東西的,不知道怎麼擷取

有用Notepad的Compare功能進行比對
/etc/nginx/nginx.conf 是一模一樣的

我分別給您/etc/nginx/conf.d 底下的配置內容,
效果會和 nginx -T 一樣嗎

我的 nginx.conf 和 學長的 nginx.conf內容

raytracy iT邦大神 1 級 ‧ 2019-06-20 10:32:29 檢舉

光看 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 慢慢看啊...

raytracy iT邦大神 1 級 ‧ 2019-06-20 10:39:48 檢舉

我猜:

access_log /var/log/nginx/scott-api-access.log;

後面沒有加 main 參數?...
看起來你們兩人吐出來的 log format 似乎不相同?....

學長的在 agent 後面還多了一長串疑似 payload 的資料, 但是你的到了 agent 就停掉了...資料長度不同, 可能會影響 logstash 的欄位拆解...

好 ...,我往這方面研究看看,整理一下nginx -T 的資訊,謝謝你給我一點方向,我怕太久沒回您,哈哈

raytracy
終於!!!!悲憤啊!!/images/emoticon/emoticon02.gif

多虧有您,資料終於正確跑出來了

您說的沒錯,沒有「加入main 參數」是因素之一,但是最主要的還是

我nginx配置的request部分,本來是寫在 80port底下,後來改到443port底下就出來了,雖然不太清楚為什麼

但我接下的任務就是

  1. 釐清楚為什麼
  2. 學會學長的ELK設計方式

謝謝您 (鞠躬 /images/emoticon/emoticon41.gif

我要發表回答

立即登入回答