前言
由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器。而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一。如何有效便捷的采集nginx的日志进行有效的分析成为大家关注的问题。本篇通过几个实例来介绍如何通过filebeat、logstash、rsyslog采集nginx的访问日志和错误日志。
背景
众所周知,ELK技术栈是采集、分析日志的利器。所以这里介绍的是从nginx采集日志到ES,当然至于日志采集以后存到看大家的需要。通过logstash可以方便的配置日志输出存储的方式。
一般来说nginx默认安装后,日志文件在 /usr/local/nginx/logs 目录下。分别有 access.log和error.log 访问日志和错误日志。
1、直接通过filebeat采集日志到ES
在filebeat的安装目录找到filebeat.yml 配置获取日志文件的路径及输出到ES的配置。
具体:
1)filebeat配置
cd /usr/local/src/filebeat-7.10.0
cat filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/log/secure
- /var/log/maillog
- /var/log/cron
- /var/log/messages
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/*.log
tags: ["nginx_log"] #nginx日志打标签
#----------------------------- Elasticsearch template setting ---------------------------
# ElasticStack从2019年1月29日的6.6.0版本的开始,引入了索引生命周期管理的功能,新版本的Filebeat则默认的配置开启了ILM,导致索引的命名规则被ILM策略控制。所以需要加上一下配置就好了:
setup.ilm.enabled: false # 关闭 ILM 即可解决Index Pattern不生效的问题
setup.template.name: "nginx_log" #设置索引名的前缀
setup.template.pattern: "nginx_log-*" #设置索引模式
setup.template.settings:
index.number_of_shards: 1 # 索引分片数量
index.number_of_replicas: 0 # 副本数
index.codec: best_compression # 是否压缩
# ---------------------------- Elasticsearch Output -------------------------------------
output.elasticsearch:
hosts: ["192.168.155.1:9200"]
username: "elastic"
password: "elastic"
index: "nginx_log-%{+YYYY.MM.dd}" #索引名称
# -------------------------------------- kibana -----------------------------------------
setup.kibana:
host: "192.168.155.1:5601" #可选项。如果需要在kibana中友好显示的化,可进行kibana配置
2)命令行调试
./filebeat -e -c filebeat.yml -d "publish"
命令行调试启动没问题的话,直接以systemd的方式启动filebeat服务即可。
3)head查看索引
可以看到nginx中的access.log和error.log的日志都已经有了。
4)kibana展示
这种直接通过filebeat直接对接ES采日志的方式简单直接,但是无法对采集的日志进行预处理和其他一些操作,也不够灵活。
可以在filebeat 和 ES之间加一层Logstash,可以将filebeat于ES解耦,通过Logstash可以做一些预处理,也可以通过Logstash采集到除ES以外的其他数据存储上。
2、通过filebeat采集日志到logstash再送到ES
1)配置logstash
1> 定义正则规则
mkdir /u01/isi/application/index/logstash-7.10.0/patterns
cat /u01/isi/application/index/logstash-7.10.0/patterns/nginx #参考前面logstash之grok插件自定义规则学习
NGINXACCESS %{
IPV4:remote_ip} \- \- \[%{
HTTPDATE:timestamp}\] \"%{
WORD:method} %{
URIPATHPARAM:request} HTTP/%{
NUMBER:httpversion}\" %{
NUMBER:status} %{
NUMBER:bytes} \"%{
NOTSPACE:domain}\" \"%{
GREEDYDATA:access_url}\" \"%{
GREEDYDATA:real_ip}\"
2> 修改logstash配置文件
cd /u01/isi/application/index/logstash-7.10.0
cat config/logstash.conf
input {
beats {
port => 5044
}
}
filter {
if "nginx_log" in [tags] {
grok {
patterns_dir => "/u01/isi/application/index/logstash-7.10.0/patterns"
match => {
"message" => "%{NGINXACCESS}" }
remove_field => ["message"]
}
geoip {
source => "remote_ip"
target => "geoip" # 要发送的字段,默认为此
add_field => ["[geoip][coordinates]","%{[geoip][longitude]}"] # 获取经度
add_field => ["[geoip][coordinates]","%{[geoip][latitude]}"] # 获取纬度
}
mutate {
convert => ["[geoip][coordinates]","float"] # 修改经纬度为浮点数
}
}
}
output {
if "nginx_log" in [tags] {
elasticsearch {
hosts => ["http://192.168.155.1:9200"]
index => "logstash-nginx-log-%{+YYYY.MM.dd}"
user => "elastic"
password => "elastic"
}
}
2)配置filebeat
cat /usr/local/src/filebeat-7.10.0/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/*.log
tags: ["nginx_log"]
output.logstash:
hosts: ["192.168.155.1:5044"]
重启logstash和filebeat服务即可
3)head查看索引
4)kibana展示
都到这儿了,更多文章,详见个人微信公众号ALL In Linux,来扫一扫吧!