ELK 日志分析

本文主要讲解如何使用网易云提供的 Elasticsearch 服务配合 Logstash 和 Kibana 完成 Nginx 日志的实时分析和展示。

准备工作

1.登陆「控制台」,选择「云服务器」创建一台可用区 B 的云服务器,详见云服务器创建教程,这里操作系统选择 Centos 7。并分配一个公网 IP 地址。
2.登陆「控制台」,选择「Elasticsearch」,创建一个 Elasticsearch 集群,参考如何创建 Elasticsearch 文档

3.确认可以正常通过公网 SSH 访问和操作云服务器。
4.确认 VPC 中 云服务器和 Elasticsearch 在同一安全组。
5.确认 VPC 安全组开放了 9200 端口对同安全组放行,并暴露 80、443端口和 SSH 端口对公网访问:

配置基础环境

由于 Logstash 依赖 Java,因此需要先安装和配置 Java 环境,这里使用 Oracle 的jdk,请自行下载,这里使用 jdk 1.8:

tar zxvf jdk-8u161-linux-x64.tar.gz
mv jdk1.8.0_161/ /usr/local/
vim /etc/profile

配置 Java 环境变量,将以下内容复制粘贴到 /etc/profile 最末端

export JAVA_HOME=/usr/local/jdk1.8.0_161/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

然后执行

source /etc/profile

查看 Java 版本

java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

安装 Logstash 和 Kibana

网易云线上提供的 Elasticsearch 是 5.6 的版本,因此需要配合相同版本的 Logastash 和 Kibana 使用,点击这里下载对应版本的软件包,这里使用的是 RPM 包安装,因为本文只是演示如何使用,在实际的生产环境中,可能并不是都安装在同一台服务器上,可以根据自己的实际需求来分别安装在不同设备。

rpm -ivh https://artifacts.elastic.co/downloads/kibana/kibana-5.6.5-x86_64.rpm

rpm -ivh https://artifacts.elastic.co/downloads/logstash/logstash-5.6.5.rpm

设置为开机自动启动可以运行如下命令

systemctl enable kibana
systemctl enable logstash    

配置 logstash

Logstash 的配置通过 RPM 的方式安装,其配置文件在 /etc/logstash 下,可以参考官网文档进行配置。

在本案例中,我们需要通过 Logstash 将 Nginx 的日志写入到 Elasticsearch 中,有两种方式:

第一种,调整 nginx 的日志格式为 json 格式,这种做法比较简单方便;

第二种,使用 Logstash 的 grok 模块获取日志内容,Logstash 也自带了很多默认的配置,比如支持 Apache 的标准日志格式,可以点击这里查看一些官方的演示配置示例

本文使用第一种方式演示,具体步骤如下:

1.修改nginx 的配置文件中 log_format 内容,类似如下,可以根据您自己的需求进行配置,具体日志格式,参考 nginx 官方文档说明配置

log_format main   '{"@timestamp":"$time_iso8601",'
                        '"@source":"$server_addr",'
                        '"hostname":"$hostname",'
                        '"ip":"$http_x_forwarded_for",'
                        '"client":"$remote_addr",'
                        '"request_method":"$request_method",'
                        '"scheme":"$scheme",'
                        '"domain":"$server_name",'
                        '"referer":"$http_referer",'
                        '"request":"$request_uri",'
                        '"args":"$args",'
                        '"size":$body_bytes_sent,'
                        '"status": $status,'
                        '"responsetime":$request_time,'
                        '"upstreamtime":"$upstream_response_time",'
                        '"upstreamaddr":"$upstream_addr",'
                        '"http_user_agent":"$http_user_agent",'
                        '"https":"$https"'
                        '}';

其输出的日志内容类似

{"@timestamp":"2017-12-18T18:54:21+08:00","@source":"192.168.10.38","hostname":"centos.novalocal","ip":"-","client":"123.58.160.155","request_method":"GET","scheme":"https","domain":"elk.v5linux.com","referer":"https://elk.v5linux.com/status","request":"/plugins/kibana/assets/dashboard.svg","args":"-","size":0,"status": 304,"responsetime":0.003,"upstreamtime":"0.003","upstreamaddr":"127.0.0.1:5601","http_user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36","https":"on"}

将需要导入的虚拟主机的配置修改为如下,其中 main 就是 上面定义的日志名称。

access_log  <log_path> main;

创建一个 Logstash 配置文件 nginx.conf,配置文件目录在 /etc/logstash/conf.d/ 下,如下:

input {
  file {
    type => "nginx" #   文件类型,可自定义
    start_position => "beginning" # 表示从文件的最开始处读取
    path => [ "/home/wwwlogs/elk.v5linux.com-*.log" ] # 日志文件的位置,可以使用通配符匹配
    codec => "json" # 设置其格式为json 
  }
}

output {
    elasticsearch {
        hosts => ["192.168.10.37:9200"] # elasticsearch 的主机地址和端口
        index => "elk.v5linux.com-%{+YYYY.MM.dd}" #索引格式
        workers => 1 
        flush_size => 1 
        idle_flush_time => 1
        template_overwrite => true
    }
    stdout{codec => rubydebug} # 输出debug 信息
}

关于 Logstash 的配置,可以参考官方文档说明,简单说明下该配置文件的作用:

input 段用来定义一个 file 包含了输入的文件类型以及从何处开始读取文件和文件的路径以及文件的格式。

output 段会将读取的文件内容发送给 Elasticsearch,具体参考,请参考:Logstash 文档

其中,Elasticsearch 的 Host 字段值可以在控制台选择 Elasticsearch 对应的实例,点击集群信息查看,如图所示:

配置完成后,启动 Logstash

systemctl start logstash

配置 Kibana

1.kibana 需要配置下 Elasticsearch 的地址,修改其配置文件:

vim /etc/kibana/kibana.yml

找到

#elasticsearch.url: "http://localhost:9200"

修改为 Elasticsearch 的地址和端口,修改启动 Kibana

systemctl start kibana

配置 Nginx 反向代理 Kibana

该部分配置可以参考如下,出于安全考虑,可以配置SSL模式:

server {
  listen 443;
  server_name kibana.com;
  ssl on;
  ssl_certificate /etc/nginx/ssl/elk.cer;
  ssl_certificate_key /etc/nginx/ssl/elk.key;
  ssl_ciphers                EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_prefer_server_ciphers  on;
  ssl_protocols              TLSv1.2;
  


  error_log   /var/log/nginx/kibana.error.log;
  access_log  /var/log/nginx/kibana.access.log;



  location / {
    rewrite ^/(.*) /$1 break;
    proxy_ignore_client_abort on;
    proxy_pass http://localhost:5601;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
   
  }
}

替换server_name 对值为你对应对域名,访问你的域名,会出现如图所示的界面,切换到 Dev Tools, 在console 中可以执行 Elasticsearch 语法用来查询、删除、增加数据和索引,我们使用如下语句确认 logstash 是否将 nginx 数据导入进来 :

GET _search
{
  "query": {
    "match_all": {}
  }
}

配置 Kibana 展示日志

配置 Kibana

1.点击 Management 如图所示,导入一个Index Patterns

配置 index patterns, 可以看到刚才导入的 nginx 日志的索引,支持通过通配符 * 匹配,然后需要选择 Times Fileter field name

创建完成后会出现如图所示的界面

2.切换到discover 会看到很多日志条目以及一个漂亮的柱形图,他显示对应时间点的日志信息

到目前为止,已经可以根据条件过滤日志了。

配置图形化的监控

1.切换到 visualize,我们来创建几个监控图。

首先,创建一个 Pie,用来统计某个时间段的 HTTP 请求方法,比如 GET POST PUT DELETE 等等的占比。

选择 Pie,选择 index patterns,根据如图所示配置

配置完成后保存起来,类似的还开业创建更多的图表,例如 Vertical Bar,Line 等等。

点击 Dashboards 创建一个 Dashboards

添加刚才创建的 visualize ,如图所示,然后保存

可以选择时间或在图形框中拖动鼠标选择时间线查看对应时间点的请求

你可以继续添加 visualize 监控其他指标,比如请求状态码、请求做多的 IP 或 URL 等等,最终配置如图所示:

监控 Elasticsearch

在网易云的控制台找到对应的集群实例,你可以根据性能监控的数据观察是否需要扩容实例,扩容也是非常简单的,只需要更改规格即可,具体参考监控报警