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


具体的网络拓扑图如下:

ELK系统分析nginx日志_第1张图片


具体配置如下:

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)为统一格式:

[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,配置如下:

[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:

[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,测试下脚步是否成功并启动该服务,服务启动后会一直刷日志。

[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=>#, :data=>"175.155.181.151 - - [12/Jan/2017:01:28:05 +0800] \"GET /resources/p_w_picpaths/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=>#, :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=>#, :data=>"223.67.223.215 - - [12/Jan/2017:01:28:05 +0800] \"GET /resources/p_w_picpaths/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

ELK系统分析nginx日志_第2张图片



(三)kibana配置

 (1)登录192.168.180.3:5601登录kibana

ELK系统分析nginx日志_第3张图片


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

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

ELK系统分析nginx日志_第4张图片

(3)点击discover既可以看到我们所导入的日志数据了,

ELK系统分析nginx日志_第5张图片