阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用ELK+Redis搭建Nginx日志分析平台

155次阅读
没有评论

共计 2616 个字符,预计需要花费 7 分钟才能阅读完成。

使用 ELK+Redis 搭建 Nginx 日志分析平台

logstash,elasticsearch,kibana 怎么进行 nginx 的日志分析呢?首先,架构方面,nginx 是有日志文件的,它的每个请求的状态等都有日志文件进行记录。其次,需要有个队列,redis 的 list 结构正好可以作为队列使用。然后分析使用 elasticsearch 就可以进行分析和查询了。

我们需要的是一个分布式的,日志收集和分析系统。logstash 有 agent 和 indexer 两个角色。对于 agent 角色,放在单独的 web 机器上面,然后这个 agent 不断地读取 nginx 的日志文件,每当它读到新的日志信息以后,就将日志传送到网络上的一台 redis 队列上。对于队列上的这些未处理的日志,有不同的几台 logstash indexer 进行接收和分析。分析之后存储到 elasticsearch 进行搜索分析。再由统一的 kibana 进行日志 web 界面的展示。

下面我计划在一台机器上实现这些角色。

准备工作

  • 安装了 redis, 开启在 6379 端口
  • 安装了 elasticsearch, 开启在 9200 端口
  • 安装了 kibana, 开启了监控 web
  • logstash 安装在 /usr/local/logstash
  • nginx 开启了日志,目录为:/usr/share/nginx/logs/test.access.log

设置 nginx 日志格式

在 nginx.conf 中设置日志格式:logstash

log_format logstash '$http_host $server_addr $remote_addr [$time_local]"$request" '
                    '$request_body $status $body_bytes_sent"$http_referer""$http_user_agent" '
                    '$request_time $upstream_response_time';

在 vhost/test.conf 中设置 access 日志:

access_log  /usr/share/nginx/logs/test.access.log  logstash;

开启 logstash agent

注:这里也可以不用 logstash,直接使用 rsyslog

创建 logstash agent 配置文件

vim /usr/local/logstash/etc/logstash_agent.conf

代码如下:

input {
        file {type => "nginx_access"
                path => ["/usr/share/nginx/logs/test.access.log"]
        }
}
output {
        redis {host => "localhost"
                data_type => "list"
                key => "logstash:redis"
        }
}

启动 logstash agent

/usr/local/logstash/bin/logstash -f /usr/local/logstash/etc/logstash_agent.conf

这个时候,它就会把 test.access.log 中的数据传送到 redis 中,相当于 tail -f。

开启 logstash indexer

创建 logstash indexer 配置文件

vim /usr/local/logstash/etc/logstash_indexer.conf

代码如下:

input {
        redis {host => "localhost"
                data_type => "list"
                key => "logstash:redis"
                type => "redis-input"
        }
}
filter {
    grok {
        match => ["message", "%{WORD:http_host} %{URIHOST:api_domain} %{IP:inner_ip} %{IP:lvs_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} %{URIPATH:baseurl}(?:\?%{NOTSPACE:request}|) HTTP/%{NUMBER:http_version}\"(?:-|%{NOTSPACE:request}) %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} (?:%{NUMBER:time_backend_response:float}|-)"
        ]
    }
    kv {prefix => "request."
        field_split => "&"
        source => "request"
    }
    urldecode {all_fields => true
    }
    date {type => "log-date"
        match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
    }
}
output {
        elasticsearch {embedded => false
                protocol => "http"
                host => "localhost"
                port => "9200"
                index => "access-%{+YYYY.MM.dd}"
        }
}

这份配置是将 nginx_access 结构化以后塞入 elasticsearch 中。

对这个配置进行下说明:

  • grok 中的 match 正好匹配和不论是 GET,还是 POST 的请求。
  • kv 是将 request 中的 A =B&C= D 的 key,value 扩展开来,并且利用 es 的无 schema 的特性,保证了如果你增加了一个参数,可以立即生效
  • urldecode 是为了保证参数中有中文的话进行 urldecode
  • date 是为了让 es 中保存的文档的时间为日志的时间,否则是插入 es 的时间

好了,现在的结构就完成了,你可以访问一次 test.dev 之后就在 kibana 的控制台看到这个访问的日志了。而且还是结构化好的了,非常方便查找。

使用 kibana 进行查看

依次开启 es,logstash,kibana 之后,可以使用 es 的 head 插件确认下 es 中有 access-xx.xx.xx 索引的数据,然后打开 kibana 的页面,第一次进入的时候会让你选择 mapping,索引名字填写 access-*,则 kibana 自动会创建 mapping

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-09/135095.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计2616字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中