使用 ELK 分析和展示日志

ELK 能干什么

ELK 是 elasticsearch + logstash + kibana 的 简写,互联网行业高速发展的今天,当企业的业务发展到一定的规模后,各种服务每天所产生的日志达到一定的量级后,一旦出现故障或问题,我们很难通过简单的过滤和分析日志,因此我们需要一个强大的工具来汇总、搜索和查询以及展现日志来实现复杂的业务所产生的日志,快速的定位和分析问题。ELK 就可以做到这些。

通过 logstash 我们可以把各种日志进行转换后存储到 elasticsearch 中,通过 elasticsearch 可以非常灵活的存储和索引日志,并且elasticsearch 提供了丰富的 HTTP REST API 接口来对数据进行增删查等操作;通过 kibana 我们可以对存储在 elasticsearch 中的日志以图形化的形式进行展现,并且提供非常丰富的过滤接口,让用户能够通过过滤快速定位问题。

下载软件

本文档所使用的都是官方最新的5.x版本,操作系统版本 centos 7 ,不过在我写该改文档之后,我发现还是6.x 的好用些。

wget -c https://artifacts.elastic.co/downloads/logstash/logstash-5.6.5.rpm
wget -c https://artifacts.elastic.co/downloads/kibana/kibana-6.6.5-x86_64.rpm
wget -c https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.5.rpm

安装 Java

本例使用 openjdk

# yum -y install java-1.8.0

配置 Java 环境变量

将以下内容复制粘贴到 /etc/profile 最末端

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-1.b14.el7_2.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

然后执行

source /etc/profile

查看 Java 版本

[root@node-1 ~]# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

安装软件

本例下载的全部都是 rpm 包,直接执行

rpm -ivh *.rpm

启动 elasticsearch

[root@node-1 ~]#  sudo systemctl daemon-reload
[root@node-1 ~]#  sudo systemctl enable elasticsearch.service
[root@node-1 ~]#  sudo systemctl start elasticsearch.service

启动 logstash

[root@node-1 ~]# systemctl enable logstash
[root@node-1 ~]# systemctl start logstash

如果提示没有 JAVA_HOME,运行

export JAVACMD=`which java`

后重装

启动 kibana

[root@node-1 ~]# systemctl enable kibana
[root@node-1 ~]# systemctl start kibana

安装 nginx

yum -y install epel-release
yum -y install nginx

使用 nginx 反向代理 kibana

我这里还配置个证书

    [root@centos logstash]# cat /usr/local/nginx/conf/vhost/elk.v5linux.com.conf
server
{
  listen 443;
  server_name elk.v5linux.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;
  ssl_session_cache          shared:SSL:50m;
  ssl_session_timeout        1d;
  ssl_session_tickets        on;
  resolver                   114.114.114.114 valid=300s;
  resolver_timeout           10s;
  add_header  Strict-Transport-Security  "max-age=31536000; includeSubDomains; preload";
  add_header  X-Frame-Options  deny;
  add_header  X-Content-Type-Options  nosniff;
  add_header  Accept-Ranges bytes;
  add_header  X-Forwarded-For $remote_addr;
  add_header  X-Real-IP  $remote_addr;

  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;

  }
  if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
           set $year $1;
           set $month $2;
           set $day $3;
        }
  access_log  /home/wwwlogs/elk.v5linux.com-$year-$month-$day-access.log main;
}

访问URL 出现如图所示则表示反向代理 kibana 成功。

访问http://xxxx/status 查看状态

配置 logstash

我们需要配置 logstash 来获取 nginx 的日志并写入到 elasticsearch 中

在 nginx 的 http 段加入

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"'
                        '}';

替换默认的日志格式,该格式会默认就输出 json 格式的日志,如:

{"@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"}

然后将需要监控的虚拟主机的access_log 定义成如下格式:

access_log  /home/wwwlogs/elk.v5linux.com-xxx main;

最后定义 logstash

[root@centos logstash]# cd /etc/logstash/conf.d/
[root@centos conf.d]# cat nginx.conf
input {
  file {
    type => "nginx"
    start_position => "beginning"
    path => [ "/home/wwwlogs/elk.v5linux.com-*.log" ]
    codec => "json"
  }
}

output {
    elasticsearch {
        hosts => ["192.168.10.37:9200"]
        index => "elk.v5linux.com-%{+YYYY.MM.dd}"
        workers => 1
        flush_size => 1
        idle_flush_time => 1
        template_overwrite => true
    }
    stdout{codec => rubydebug}
}

一个 logstash 必须包含 input 和 output,因为这里默认就把 nginx 的日志定义成了 json,所以少了很多事情,如果你是需要用 grok 的方式定义格式,则需要定义一个 filter,不过 nginx 的 filter 可以直接在 Apache 的grok 的基础上修改。

定义完成后 重启 logstash 。然后打开 kibana,点击dev_tools 执行默认的

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

出现类似如图所示的内容即表示成功把 nginx 的日志导入了elasticsearch 中。

接下来,我们就是来配置 kibana 展现日志了!

配置 kibana

1.点击如图所示的地方,导入一个Index Patterns

配置 index patterns

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

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

可以根据条件过滤日志

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

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

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

其实还是觉得6.1的 kibana 功能丰富点,但是3.x 的界面黑色的很好看。

Vertical Bar

点击 dashboards 创建一个 dashboards

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

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

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

本案例所有软件都安装在一台服务器上,在实际的生产环境中必然不会这么干,因此部署 elasticsearch 集群等请参考 《elasticsearch 权威指南》

参考

elasticsearch 官网文档

elasticseach 权威指南