ELK对nginx日志进行流量监控
ELK对nginx日志进行流量监控
一、前言
线上有一套ELK单机版,版本为5.2.1。现在想把nginx访问日志接入到elk里,进行各个域名使用流量带宽的统计分析。要把nginx日志传输到elk上,可以在存有nginx日志的服务器上使用logstash或者filebeat。但是因为logstash是jvm跑的,资源消耗比较大,启动一个logstash就需要消耗500M左右的内存(这就是为什么logstash启动特别慢的原因),而filebeat只需要10来M内存资源,所以最终决定使用filebeat。
filebeat是轻量级日志采集器,能输送至 Elasticsearch 或 Logstash,在 Kibana 中实现可视化,架构图如下:

二、具体部署过程
1、设置nginx日志输出为json格式
ps:如果不先把nginx日志设为json格式,而是沿用默认的日志输出格式,则需要利用logstash grok插件对日志字段进行正则匹配。grok表达式的语法来源于Ruby正则,它的主要作用是将文本格式的字符串,转换为具体的结构化数据,配合正则表达式使用。但是grok是非常耗费CPU资源的,所以最终还是按简单方式来,把nginx日志设置为json输出(表示不懂Ruby正则 = =)
在nginx主配置文件中加入:
log_format json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":$upstream_response_time,'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
2、日志采集客户端安装filebeat
(1)下载filebeat-5.2.2的rpm包并安装
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-x86_64.rpm
sudo rpm -vi filebeat-5.2.2-x86_64.rpm
官方安装文档:https://www.elastic.co/guide/en/beats/filebeat/5.2/filebeat-installation.html
(2)修改配置文件
vim /etc/filebeat/filebeat.yml
(a)指定paths列表,配置要读取的nginx日志路径
注释默认的paths列表:“- /var/log/*.log”,默认的/var/log/*.log表示将会抓取/var/log子目录目录下所有.log文件
添加要读取的日志路径

(b) 配置filebeat输出到logstash,
注释输出到elasticsearch的配置:

打开logstash的输出,其中hosts设置为logstash服务器的ip,端口要确保logstash服务器是没有被占用的

(3)启动filebeat
nohup sh /usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml >> /tmp/startfilebeat.log 2>/tmp/startServerError.log &
3、配置日志收集引擎logstash
注意:确保已经安装以下插件(查看:bin/logstash-plugin list)
(1)logstash-input-beats:Beats插件用于建立监听服务,接收Filebeat或者其他beat发送的Events
(2)logstash-filter-mutate:允许在字段上执行常规突变,包括重命名,删除,替换和修改事件中的字段
(3)logstash-filter-json:JSON解析过滤器,它接受一个包含JSON的现有字段,并将其扩展为Logstash事件中的实际数据结构。
(4)logstash-filter-geoip:转换ip为详细地址(经纬度,具体所属地区等)
(1)编辑logstash配置文件
vim /home/elk/elk5.2/logstash-5.2.1/config/logstash-nginx.conf
input {
beats {
port =>
client_inactivity_timeout => #600秒之后关闭空闲的连接
}
}
filter {
mutate {
gsub => ["message", "\\x", "\\\x"]
gsub => ["message", ":-,", ":0,"]
}
json {
source => "message"
remove_field => "message"
remove_field => "[beat][hostname]"
remove_field => "[beat][name]"
remove_field => "[beat][version]"
remove_field => "@version"
remove_field => "offset"
remove_field => "input_type"
remove_field => "tags"
remove_field => "type"
remove_field => "host"
}
mutate {
convert => ["status", "integer"]
convert => ["size","integer"]
convert => ["upstreamtime", "float"]
convert => ["responsetime", "float"]
}
geoip {
source => "clientip"
database => "/home/elk/elk5.2/logstash-5.2.1/config/GeoLite2-City.mmdb"
fields => ["city_name", "country_code2", "country_name", "latitude", "longitude", "region_name"]
add_field => [ "[geoip][location]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][location]", "%{[geoip][latitude]}" ]
target => "geoip"
}
mutate {
convert => [ "[geoip][location]", "float" ]
}
if "_geoip_lookup_failure" in [tags] { drop { } }
}
output {
elasticsearch {
hosts => ["127.0.0.1:9500"]
index => "logstash-nginx-xtw"
}
}
说明:
(a)gsub => ["message", "\\x", "\\\x"]
用于兼容中文路径,数据替换
(b)gsub => ["message", ":-,", ":0,"]
Nginx日志有些字段输出为空时用“-”表示,json会解析不到,所以转换为0
(c)source => "message"
从filebeat数据中取出message
(d)remove_field
删除kibana页面展示的多余字段
(e)mutate convert
用于转换数据类型,方便后续数据统计
(f)geoip
需要下载全球IP库:GeoLite2-City.mmdb,它可以解决通过IP对城市级别的定位问题。
(g)output输出设置
logstash 使用 Elasticsearch 输出插件,把数据发送到 Elasticsearch 进行存储和搜索
(2)启动logstash
/home/elk/elk5.2/logstash-5.2.1/bin/logstash -f /home/elk/elk5.2/logstash-5.2.1/config/logstash-nginx.conf
三、最终效果图及流量统计


热力图:

针对具体域名进行流量统计
思路:主要是对nginx日志字段 $body_bytes_sent (kibana显示为size字段)进行流量统计的
注意:因为nginx字段中 $body_bytes_sent ,单位是 byte 传输的字节,但是在画图统计后,显示的不太直观,所以需要转换成KB/MB/GB
1、格式化size字段类型
选中左边菜单栏的“Management”,找到对应的索引,修改size字段,Format改成“Bytes”类型,保存即可,这样数据显示都是经过单位换算的,如B/KB/MB/GB等

2、绘制线条图查看流量使用情况
找到左边菜单栏的“Visualize”,选择线条图Line chart

切换到Data窗口
(1)metrics
Aggregation选择“Sum”,代表求和;
Field选择“size”,代表针对size字段
(2)buckets
Aggregation选择“Date Histogram”,代表按照日期自动划分
Field选择“timestamp”,代表时间戳

比如统计某个域名在过去一个小时里使用的流量,可以在搜索框输入域名

四、注意及总结
1、logstash配置文件中的output输出的索引要以“logstash”作为前缀命名,经纬度写入到[geoip][location]上,否则Tile map成不了图,除非自定义索引模板,logstash* 有系统自带的索引模板,默认类型是geo_point,能被地图识别
2、一开始使用nginx日志中的$http_x_forwarded_for作为客户端的ip,发现它有好几种值:空值(用“-”表示),1个或多个。
可能是下载的全球IP库解析不出部分ip地址,因为$http_x_forwarded_fo很多时候是代理ip地址,内网ip等是解析不出具体方位的。
最终换成$remote_addr作为客户端真实访问ip,没有出现ip解析错误的问题

ELK对nginx日志进行流量监控的更多相关文章
- 使用Docker快速部署ELK分析Nginx日志实践(二)
Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...
- 使用Docker快速部署ELK分析Nginx日志实践
原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...
- 利用 ELK系统分析Nginx日志并对数据进行可视化展示
一.写在前面 结合之前写的一篇文章:Centos7 之安装Logstash ELK stack 日志管理系统,上篇文章主要讲了监控软件的作用以及部署方法.而这篇文章介绍的是单独监控nginx 日志分析 ...
- 利用ELK分析Nginx日志生产实战(高清多图)
本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...
- 利用ELK分析Nginx日志
本文以api.mingongge.com.cn域名为测试对象进行统计,日志为crm.mingongge.com.cn和risk.mingongge.com.cn请求之和(此二者域名不具生产换环境统计意 ...
- ELK系统分析Nginx日志并对数据进行可视化展示
结合之前写的一篇文章:ELK日志分析平台搭建全过程,上篇文章主要讲了部署方法.而这篇文章介绍的是单独监控nginx 日志分析再进行可视化图形展示. 本文环境与上一篇环境一样,前提 elasticsea ...
- Docker 部署 ELK 收集 Nginx 日志
一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...
- 统计nginx日志里流量
用awk可以,比如,我想统计nginx日志里,今天下午3点0分,这一分钟内,访问的流量(文件的大小) grep "07/Nov/2013:15:00:" *.log|awk '{ ...
- 【原创】大叔经验分享(28)ELK分析nginx日志
提前安装好elk(elasticsearch.logstach.kibana) 一 启动logstash $LOGSTASH_HOME默认位于/usr/share/logstash或/opt/logs ...
随机推荐
- mysql安装报vcruntime140.dll缺失
mysql安装报:vcruntime140.dll缺失 安装:Visual C++ Redistributable for Visual Studio 2015 可以解决此问题
- Java泛型(1):概述
通常而言,我们使用一种容器来存储一种类型的对象.而泛型的主要目的之一就是用来指定这个容器要持有什么类型的对象.因此,与其使用Object,我们可以暂时不指定类型. 看下面3个例子: (1) 我们有时候 ...
- Vue 使用eventBus 实现兄弟组件间的通信
实现方式: 主要是在相互通信的兄弟组件之中,都引入一个新的vue实例,然后通过分别调用这个实例的事件触发事件广播 和监听来实现通信和参数传递. 需求: a页面tree的增删改后,数据还是之前的老数据 ...
- CSRF类型
按照请求类型来区分.分为:GET类型和POST类型 按照攻击类型分类,CSRF可分为:HTML CSRF攻击,JSOM HiJacking攻击和FIash CSRF攻击 HTML CSRF攻击 HTM ...
- 解析Health端点数据获取异常数据
问题: 由于健康节点响应类型是Health类,并且由于需要执行的健康状态类不固定,返回的类型数据的字段不是固定的,所以使用了@JsonAngGetter 注解,照成了解析这个JSON 结构非常不方便. ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---DXVA
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...
- 插入排序的Python代码实现
是打扑克的时候了 那种按大小排序的扑克游戏 def insert_sort(arr): for i in range(1,len(arr)): for j in range(i,0,-1): #与左边 ...
- 【转帖】.NET的一点历史故事:Novell的崩溃和Xamarin的重生
.NET的一点历史故事:Novell的崩溃和Xamarin的重生 https://blog.csdn.net/sD7O95O/article/details/78096502 学习安装 mono 时了 ...
- github与pycharm
再也不要使用命令行了 OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
- python列表与字符串、元组的区别以及列表引用的方式
一.字符串 字符串也可以用下标取值.切片.for循环.len()取长度以及 in 和 not in 来进行操作. 但字符串是不可变的,不能被更改.只能构造一个“新的”字符串来存取你想要修改后的数据. ...