關於收集日志的方式,最簡單性能最好的應該是修改nginx的日志存儲格式為json,然后直接采集就可以了。
但是實際上會有一個問題,就是如果你之前有很多舊的日志需要全部導入elk上查看,這時就有兩個問題,一是原始日志不是json格式,二是原始日志的時間戳不能識別,如果時間不處理,導入之后所有日志的時間戳將全部是導入時間。
下面說一下用grok的方式導入原始日志,當然你也可以直接使用這種方式收集nginx日志,這種方式可以保留nginx的原始日志格式。
1、在官網下載rpm包或者按照guide設置官方repo,安裝logstash
# yum install -y logstash-5.4.1.rpm
2、導出環境變量
# vim /etc/bashrc
export PATH=$PATH:/usr/share/logstash/bin
3、安裝 logstash-filter-date 插件,這個date插件用來讀取原始日志的時間,並存到ES的@timestamp
字段
# logstash-plugin install logstash-filter-date
4、添加一個nginx的pattern
# rpm -ql logstash | grep patterns
# cd /usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.1.0/patterns/
# ll
-rw-rw-r-- 1 logstash logstash 1831 May 30 00:41 aws
-rw-rw-r-- 1 logstash logstash 4831 May 30 00:41 bacula
-rw-rw-r-- 1 logstash logstash 260 May 30 00:41 bind
-rw-rw-r-- 1 logstash logstash 2154 May 30 00:41 bro
-rw-rw-r-- 1 logstash logstash 879 May 30 00:41 exim
-rw-rw-r-- 1 logstash logstash 10095 May 30 00:41 firewalls
-rw-rw-r-- 1 logstash logstash 5335 May 30 00:41 grok-patterns
-rw-rw-r-- 1 logstash logstash 3251 May 30 00:41 haproxy
-rw-rw-r-- 1 logstash logstash 980 May 30 00:41 httpd
-rw-rw-r-- 1 logstash logstash 1265 May 30 00:41 java
-rw-rw-r-- 1 logstash logstash 1087 May 30 00:41 junos
-rw-rw-r-- 1 logstash logstash 1037 May 30 00:41 linux-syslog
-rw-rw-r-- 1 logstash logstash 74 May 30 00:41 maven
-rw-rw-r-- 1 logstash logstash 49 May 30 00:41 mcollective
-rw-rw-r-- 1 logstash logstash 190 May 30 00:41 mcollective-patterns
-rw-rw-r-- 1 logstash logstash 614 May 30 00:41 mongodb
-rw-rw-r-- 1 logstash logstash 9597 May 30 00:41 nagios
-rw-r--r-- 1 logstash logstash 312 Jun 23 17:47 nginx
-rw-rw-r-- 1 logstash logstash 142 May 30 00:41 postgresql
-rw-rw-r-- 1 logstash logstash 845 May 30 00:41 rails
-rw-rw-r-- 1 logstash logstash 224 May 30 00:41 redis
-rw-rw-r-- 1 logstash logstash 188 May 30 00:41 ruby
-rw-rw-r-- 1 logstash logstash 404 May 30 00:41 squid
logstash安裝包自帶了一些應用的pattern示例,但是沒有nginx的,上面那個是我加上去的。
這是我針對我自己的線上日志格式調試好的grok表達式:
NGINXACCESS %{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" "%{DATA:request_body}" %{INT:status} %{INT:body_bytes_sent} "%{DATA:referer}" "%{DATA:agent}" %{DATA:xforwardedfor} %{NUMBER:request_time} %{NUMBER:upstream_response_time}
這里有一個調試網站:https://grokdebug.herokuapp.com/
5、添加一個logstash配置
# vim /etc/logstash/conf.d/nginx_access.conf
input {
file {
path => ["/var/log/nginx/www.opgirl.cn.access.log"]
start_position => "beginning"
ignore_older => 0
}
}
filter {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
date {
match => [ "timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
mutate {
remove_field => "timestamp"
}
}
output {
elasticsearch {
hosts => ["192.168.3.56:9200","192.168.3.49:9200","192.168.3.57:9200"]
index => "logstash-nginx-access-%{+YYYY.MM.dd}"
}
#stdout {codec => rubydebug}
}
6、啟動logstash
# nohup logstash -f /etc/logstash/conf.d/nginx_acces.conf &
7、添加到kibana查看,這時看到的就是日志本身的生成時間,而不是導入ES的時間