ELK系统分析nginx日志

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

   ELK系统在安装完成后需要处理相关的日志文件,本文主要对nginx日志文件进行处理并进行可视化操作,来满足日常的业务需求,长话短说,接下来介绍我的环境


具体的网络拓扑图如下:

wKioL1keUdTAAta-AAApSxd15-M320.png


具体配置如下:

server OS Version IP 备注
logstash  CentOS release 6.4 (Final) logstash 2.2.2 192.168.180.2 logstash客户端用来收集日志
elasticsearch CentOS release 6.4 (Final) elasticsearch  2.2.1 192.168.180.3
kibana CentOS release 6.4 (Final) kibana 4.4.2 192.168.180.3

   

具体步骤如下:

(一)配置nginx服务器日志的格式( log_format)为统一格式:

1
2
3
4
5
6
7
8
9
10
[root@ittestserver1  local ] # vim /usr/local/nginx2/conf/nginx.conf
http {
     include       mime.types;
     default_type  application /octet-stream ;
     #include       proxy.conf;
     log_format  main   '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"' ;
     access_log  logs /access .log  main;
     access_log on;


(二)安装配置logstash:


1, 安装步骤省略具体参考上篇文章

2,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@ittestserver1  local ] # vim /usr/local/logstash/etc/nginx-access0518.conf 
input {
         file  {
                 path =>  "/usr/local/nginx2/logs/access.log"
                 type  =>  "nginx-access"
                 start_position =>  "beginning"
                 sincedb_path =>  "/usr/local/logstash/sincedb"
                 codec =>  "json"
         }
}
filter {
         if  [ type ] ==  "nginx-access"  {
                 geoip {
                         source  =>  "clientip"
                         target =>  "geoip"
                         database =>  "/usr/local/logstash/etc/GeoLiteCity.dat"
                         add_field => [  "[geoip][coordinates]" "%{[geoip][longitude]}"  ]
                         add_field => [  "[geoip][coordinates]" "%{[geoip][latitude]}"   ]
                 }
                 mutate {
                         convert => [  "[geoip][coordinates]" "float" ]
                 }
         }
}
output {
         if  [ type ] ==  "nginx-access"  {
                 elasticsearch {
                         hosts => [ "192.168.180.3:9200" ]
                         manage_template =>  true
                         index =>  "logstash-nginx-access-%{+YYYY-MM}"
                 }
         }
}

具体解释如下:

Logstash 分为 Input、Output、Filter、Codec 等多种plugins。
Input:数据的输入源也支持多种插件,如elk官网的beats、file、graphite、http、kafka、redis、exec等等等、、、
Output:数据的输出目的也支持多种插件,如本文的elasticsearch,当然这可能也是最常用的一种输出。以及exec、stdout终端、graphite、http、zabbix、nagios、redmine等等、、、
Filter:使用过滤器根据日志事件的特征,对数据事件进行处理过滤后,在输出。支持grok、date、geoip、mutate、ruby、json、kv、csv、checksum、dns、drop、xml等等、、
Codec:编码插件,改变事件数据的表示方式,它可以作为对输入或输出运行该过滤。和其它产品结合,如rubydebug、graphite、fluent、nmap等等。
具体以上插件的细节可以去官网,介绍的挺详细的。下面说下该篇中的配置文件的含义:

input段:
  file:使用file 作为输入源
path: 日志的路径,支持/var/log*.log,及[ "/var/log/messages", "/var/log/*.log" ] 格式
start_position: 从文件的开始读取事件。另外还有end参数

filter段:
grok:数据结构化转换工具
match:匹配条件格式,将nginx日志作为message变量,并应用grok条件NGINXACCESS进行转换
geoip:该过滤器从geoip中匹配ip字段,显示该ip的地理位置
source:ip来源字段,这里我们选择的是日志文件中的最后一个字段,如果你的是默认的nginx日志,选择第一个字段即可
target:指定插入的logstash字断目标存储为geoip
database:geoip数据库的存放路径
add_field: 增加的字段,坐标经度
add_field: 增加的字段,坐标纬度
mutate: 数据的修改、删除、型转换
convert: 将坐标转为float类型
convert: http的响应代码字段转换成 int
convert: http的传输字节转换成int
replace: 替换一个字段
remove_field: 移除message 的内容,因为数据已经过滤了一份,这里不必在用到该字段了。不然会相当于存两份
date: 时间处理,该插件很实用,主要是用你日志文件中事件的事件来对timestamp进行转换,导入老的数据必备!在这里曾让我困惑了很久哦。别再掉坑了
match:匹配到timestamp字段后,修改格式为dd/MMM/yyyy:HH:mm:ss Z
mutate:数据修改
remove_field: 移除timestamp字段。

output段:
elasticsearch:输出到es中
host: es的主机ip+端口或者es 的FQDN+端口
index: 为日志创建索引logstash-nginx-access-*,这里也就是kibana那里添加索引时的名称


3,创建logstash配置文件之后,我们还要去建立grok使用的表达式,因为logstash 的配置文件里定义的使用转换格式语法,先去logstash的安装目录,默认安装位置:/usr/local/logstash/下,在该位置创建一个目录patterns:

1
2
3
4
[root@ittestserver1  local ] # mkdir -pv /usr/local/logstash/patterns
NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:remote_addr} - - \[%{HTTPDATE:time_local}\]  "%{WORD:method} %{URIPATHPARAM:request} HTTP/% {NUMBER:httpversion}"  %{INT:status} %{INT:body_bytes_sent} %{QS:http_referer} %{QS:http_user_agent


4,测试下脚步是否成功并启动该服务,服务启动后会一直刷日志。

1
2
3
4
5
6
7
8
9
10
11
[root@ittestserver1 log] # /usr/local/logstash/bin/logstash -t -f /usr/local/logstash/etc/nginx-access0518.conf 
Configuration OK
[root@ittestserver1 log] # /usr/local/logstash/bin/logstash  -f /usr/local/logstash/etc/nginx-access0518.conf 
 
nux; Android 5.1.1; R7Plusm Build /LMY47V ) AppleWebKit /537 .36 (KHTML, like Gecko) Version /4 .0 Chrome /37 .0.0.0 Mobile MQQBrowser /6 .9 TBS /036906  Safari /537 .36 hsp\ " \"-\"" , :level=>:error}
JSON parse failure. Falling back to plain-text {:error=> #<LogStash::Json::ParserError: Unexpected character ('.' (code 46)): Expected space separating root-level values
  at [Source: [B@2b2cea68; line: 1, column: 9]>, :data=> "175.155.181.151 - - [12/Jan/2017:01:28:05 +0800] \"GET /resources/images/m/landing/landingm20161221/header.png HTTP/1.1\" 200 233816 \"https://m.guojinbao.com/landingm.html?s=NDg4MDU2\" \"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13B143\" \"-\"" , :level=>:error}
JSON parse failure. Falling back to plain-text {:error=> #<LogStash::Json::ParserError: Unexpected character ('.' (code 46)): Expected space separating root-level values
  at [Source: [B@7788367a; line: 1, column: 8]>, :data=> "223.67.223.215 - - [12/Jan/2017:01:28:05 +0800] \"GET /resources/js/Crypto.js HTTP/1.1\" 200 8703 \"https://m.guojinbao.com/landingm.html?s=MzIxODQ=\" \"Mozilla/5.0 (Linux; Android 5.1.1; R7Plusm Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.9 TBS/036906 Safari/537.36 hsp\" \"-\"" , :level=>:error}
JSON parse failure. Falling back to plain-text {:error=> #<LogStash::Json::ParserError: Unexpected character ('.' (code 46)): Expected space separating root-level values
  at [Source: [B@6297d46d; line: 1, column: 8]>, :data=>"223.67.223.215 - - [12 /Jan/2017 :01:28:05 +0800] \"GET  /resources/images/m/landing/landingm20161221/btn1 .png HTTP /1 .1\" 200 10194 \"https: //m .guojinbao.com /resources/css/landingm20161221 .css\" \"Mozilla /5 .0 (Linux; Android 5.1.1; R7Plusm Build /LMY47V ) AppleWebKit /537 .36 (KHTML, like Gecko) Version /4 .0 Chrome /37 .0.0.0 Mobile MQQBrowser /6 .9 TBS /036906

wKiom1keW2LwCSNBAAExkb_5n90367.png



(三)kibana配置

 (1)登录192.168.180.3:5601登录kibana

wKiom1keiKDxkY8CAAGCWRSx8ok843.png


(2),添加一个索引,这个索引的名字就是之前导入的ES中的那个,本文中是logstash-nginx-access-*。

查看索引,目前有三个,设置为加星,即是discover默认突出显示的。

本文转自 lqbyz 51CTO博客,原文链接:http://blog.51cto.com/liqingbiao/1927520




相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3天前
|
机器学习/深度学习 前端开发 数据挖掘
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断(下)
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
74 11
|
8天前
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断2
工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
15 0
|
9天前
|
机器学习/深度学习 前端开发 数据挖掘
R语言计量经济学:工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
R语言计量经济学:工具变量法(两阶段最小二乘法2SLS)线性模型分析人均食品消费时间序列数据和回归诊断
39 0
|
15天前
|
消息中间件 存储 运维
更优性能与性价比,从自建 ELK 迁移到 SLS 开始
本文介绍了 SLS 基本能力,并和开源自建 ELK 做了对比,可以看到 SLS 相比开源 ELK 有较大优势。
54759 132
|
17天前
|
网络协议 应用服务中间件 Linux
centos7 Nginx Log日志统计分析 常用命令
centos7 Nginx Log日志统计分析 常用命令
33 2
|
18天前
|
运维 监控 应用服务中间件
LNMP详解(十四)——Nginx日志详解
LNMP详解(十四)——Nginx日志详解
16 2
|
20天前
|
SQL 存储 监控
日志问题精要:分析与总结
该文档讲述了应用系统日志记录的重要性和规则。主要目的是记录操作轨迹、监控系统状态和回溯故障。日志记录点包括系统入口、调用其他模块、调用结束、出口和出错时。内容应遵循UTF-8编码,避免敏感信息,按INFO级别记录,及时、完整且安全。日志输出要控制频率和长度,不影响系统性能,并按策略备份和清理。日志等级分为DEBUG、INFO、WARN、ERROR和FATAL。日志文件应有明确目录结构,大小有限制,并定期清理。注意事项包括输出异常堆栈、避免打印对象实例的hashCode、选择合适的日志框架和格式,并支持动态修改日志级别。还要实现链路追踪,确保在多线程环境中正确记录日志。
20 0
|
25天前
|
存储 监控 数据可视化
Nginx+Promtail+Loki+Grafana Nginx日志展示
通过这些步骤,你可以将Nginx的日志收集、存储、查询和可视化整合在一起。这样,你就可以在Grafana中轻松地创建和展示Nginx日志的图表和面板。
31 3
|
2月前
|
存储 监控 数据可视化
日志分析对决:揭示 ELK 与 GrayLog 的优势和差异
日志分析对决:揭示 ELK 与 GrayLog 的优势和差异
241 0
|
3月前
|
存储 Prometheus 监控
Prometheus vs. ELK Stack:容器监控与日志管理工具的较量
随着容器化技术的广泛应用,容器监控与日志管理成为了关键任务。本文将对两种常用工具进行比较与选择,分别是Prometheus和ELK Stack。Prometheus是一款开源的监控系统,专注于时序数据的收集和告警。而ELK Stack则是一套完整的日志管理解决方案,由Elasticsearch、Logstash和Kibana三个组件组成。通过比较它们的特点、优势和适用场景,读者可以更好地了解如何选择适合自己需求的工具。