LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志

  • LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第1张图片
  • LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第2张图片
  • LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第3张图片Logstash+ElasticSearch+Kibana处理nginx访问日志
    • 1. nginx日志 -> logstash shipper -> redis
    • 2. redis -> logstash indexer -> elasticsearch
    • 3. elasticsearch -> kibana
    • 后续
    • 其他
      • 1. 关于logformat和对应grok的配置
      • 2. elasticsearch插件
      • 3. supervisor
      • 4. logstash坑

ELK似乎是当前最为流行的日志收集-存储-分析的全套解决方案.

去年年初, 公司里已经在用, 当时自己还山寨了一个统计系统(postgresql-echarts, 日志无结构化, json形式存储到postgresql, 构建统一前端配置生成, 调用统一查询接口, 具体细节), 已经过了一年有余.

一年刚好, 发生了很多事, 那套系统不知现在如何了.

在新的公司, 一切都得从0到1, 近期开始关注日志/数据上报/统计, 以及后续的数据挖掘等.


搭建, 测试并上线了一套简单的系统, 初期将所有服务器的nginx日志, 以及搜索日志进行处理.

elk

下面主要介绍对nginx日志进行处理的过程, 不是针对elk的介绍, 所有涉及ip的地方都改成127.0.0.1了, 根据自己环境进行修改

1. OSS日志 -> logstash shipper -> redis

数据接入和获取


Elastic栈使用Logstash和Beats来进行数据的消化和获取。


Logstash用jruby实现,有点像一个数据管道,把输入的数据进行处理,变形,过滤,然后输出到其它地方。Logstash 设计了自己的 DSL,包括有区域,注释,数据类型(布尔值,字符串,数值,数组,哈希),条件判断,字段引用等。


Logstash的数据管道包含三个步骤,Input,Filter和Output,每一步都可以通过plugin来扩展。另外Input和Output还支持配置Codecs,完成对输入输出数据的编解码工作。


LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第4张图片


Logstash支持的常见的Input包含File,syslog,beats等。Filter中主要完成数据的变形处理,可以增删改字段,加标签,等等。作为一个开源软件,Output不仅仅支持ElasticSearch,还可以和许多其它软件集成和目标,Output可以是文件,graphite,数据库,Nagios,S3,Hadoop等。


LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第5张图片


在实际运用中,logstash 进程会被分为两个不同的角色。运行在应用服务器上的,尽量减轻运行压力,只做读取和转发,这个角色叫做 shipper;运行在独立服务器上,完成数据解析处理,负责写入 Elasticsearch 的角色,叫 indexer。


logstash 作为无状态的软件,配合消息队列系统,可以很轻松地做到线性扩展。


Beats是 Elastic 从 packetbeat 发展出来的数据收集器系统。beat 收集器可以直接写入 Elasticsearch,也可以传输给 Logstash。其中抽象出来的 libbeat,提供了统一的数据发送方法,输入配置解析,日志记录框架等功能。


LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第6张图片


开源社区已经贡献了许多的beats种类。


因为Beats是使用Golang编写的,效率上很不错。



OSS  log通过logstash shipper读取, 转json, 发送到redis, 由后续的logstash indexer进行处理

步骤

1.在日志所在机器部署logstash

2.在logstash安装目录下的patterns中加入一个文件nginx

内容(与上面的log_format相对应)

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NOTSPACE:http_x_forwarded_for}

3.增加一个logstash配置文件: logstash-project-access-log.conf

注意, input的file, filter的grok, output的redis-key

    input {
    file {
        path => [ "/data/logs/nginx/xxxx_access.log" ]
        start_position => "beginning"
    }
    }

    filter {
    mutate { replace => { "type" => "nginx_access" } }
    grok {
        match => { "message" => "%{NGINXACCESS}" }
    }
    date {
        match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
    }
    geoip {
        source => "clientip"
    }
    }


    output {
    redis { host => "127.0.0.1" data_type => "list" key => "logstash:xxxx:access_log" }
    }

4.使用supervisor启动shipper.

    [program:logstash_xxxx_shipper]
    command=/var/shell/logstash/bin/logstash -f /var/shell/logstash/configs/nginx-xxxx-shipper.conf
    numprocs=1
    autostart=true
    autorestart=true
    log_stdout=true
    log_stderr=true
    logfile=/data/logs/logstash/logstash_xxxx_access.log

2. redis -> logstash indexer -> elasticsearch

注意, input的redis为上一步redis配置, key要对应, output的elasticsearch配置, index指定了最终es中存储对应的index, 加日期, 方便对日志进行定期删除

input {
redis {
    host => "127.0.0.1"
    port => "6379"
    key => "logstash:xxxx:access_log"
    data_type => "list"
    codec  => "json"
    type => "logstash-arthas-access"
    tags => ["arthas"]
}
}

output {
elasticsearch {
    host => "127.0.0.1"
    index => "logstash-arthas-access-%{+YYYY.MM.dd}"
}
}

分布集群和扩展性


ElasticSearch


LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第7张图片


ElasticSearch是为分布式设计的,有很好的扩展性,在一个典型的分布式配置中,每一个节点(node)可以配制成不同的角色,如上图所示:


  • Client Node,负责API和数据的访问的节点,不存储/处理数据;

  • Data Node,负责数据的存储和索引;

  • Master Node, 管理节点,负责Cluster中的节点的协调,不存储数据。


每一种角色可以通过ElasticSearch的配置文件或者环境变量来配置。每一种角色都可以很方便的Scale,因为Elastic采用了对等性的设计,也就是所有的角色是平等的,(Master Node会进行Leader Election,其中有一个是领导者)这样的设计使得在集群环境的伸缩性非常好,尤其是在容器环境,例如Docker Swarm或者Kubernetes中使用。


参考:


  • https://elk-docker.readthedocs.io/#elasticsearch-cluster

  • https://github.com/pires/kubernetes-elasticsearch-cluster

产品线


Elastic


LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第8张图片


Elastic的产品线除了大家熟悉的ELK(ElasticSearch,Logstash,Kikana),主要包含:


  • Beats Beats是一个开源组件,提供一个代理,把本地抓到的数据传送到ElasticSearch;

  • Elastic Cloud, Elasti提供的云服务;

  • X-Pack, Elastic的扩展组件,提供安全,告警,监控,机器学习和图处理能力。主要功能需要付费使用


3. elasticsearch -> kibana

剩下的其实没什么了, 启动kibana后, 配置好指向的es, 就可以在kibana中查看到实时的日志数据

demo环境截图

kibana-nginx

kibana中, 支持各种统计, 着实让人惊艳了一把.

除了基本的nginx日志, 还需要在各类url入口, 加入平台, 渠道等信息, 这样通过nginx访问日志, 可以统计到更多的信息

当然, 如果需要一些更为精确/特殊的统计, 需要自行进行数据上报的工作.


后续

  1. 更多的类型的日志聚合, 包括各类访问日志, 统计上报日志等, 日志落地成文件, 永久留存, 转入es中, 只留存三个月
  2. 如何对各类数据进行拆分/汇总
  3. ELK整体部署/运维/扩容等, 包括数据清理
  4. 基于ES日志的业务自定义统计后台(kibana无法满足一些具体业务的统计需求)
  5. 为什么不使用logstash forwarder, 因为目前日志组成等较为简单, 简单处理 , 后续需要用到时再考虑

其他

1. 关于logformat和对应grok的配置

groklogstash的一个插件, 文档

Grok is currently the best way in logstash to parse crappy unstructured log data into something structured and queryable

所以, 我们在处理nginx日志时, 需要根据具体logformat定义对应的grok表达式

除了上面例子中用的那套, 另一份

logformat

  log_format logstash '$http_host '
                      '$remote_addr [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent" '
                      '$request_time '
                      '$upstream_response_time';

patterns/nginx

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:http_host} %{IPORHOST:clientip} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NUMBER:request_time:float} %{NUMBER:upstream_time:float}

如果想自行定义, 可以使用 grokdebug, 将要解析的日志和配置的正则放入, 可以查看最终得到的结构化数据

2. elasticsearch插件

初期只安装了一个 kopf, web界面查看

3. supervisor

建议使用supervisorelk进行管理,(ps. 不要用yum自带的, 版本太旧好多坑, 浪费1小时......使用pip install安装最新版本即可)

配置示例elk.conf

[program:elasticsearch]
command=/var/shell/elk/elasticsearch/bin/elasticsearch
numprocs=1
autostart=true
autorestart=true

[program:kibana]
command=/var/shell/elk/kibana/bin/kibana
numprocs=1
autostart=true
autorestart=true

[program:logstash_arthas]
command=/var/shell/elk/logstash/bin/logstash -f /var/shell/elk/logstash/config/xxxx_access.conf
numprocs=1
autostart=true
autorestart=true
log_stdout=true
log_stderr=true
logfile=/data/logs/elk/logstash/logstash_arthas_access.log

4. logstash坑

start_position => "beginning"

logstash, 会记录一份文件读到的位置, 在$HOME/.sincedb_xxxxx 如果要让logstash重新读取文件, 删除之即可, 重启shipper.

但是你可能发现es中重复记录了, 这是因为, 在output中, 没有定义存储到es时使用的document_id, es全部当成新纪录存入, 导致数据重复



应团队ELK使用需要,特写了一篇Kibana 介绍 使用相关文章。

以下演示基于官方Kibana演示页面:http://demo.elastic.co/packetbeat/#/discover

一、Kibana界面说明

    1.Discover页面

    这个面板主要提供了给用户基于记录做快速检索,查询框中输入的查询表达式为luence的query syntax. 在本文后面会分享一些常用的luence语法使用 LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第9张图片
    1.1 时间区间选择
          在查询面板中,一般默认是显示最近15分钟的数据。如果我们想查最近30分钟、一周、一年或者从2010-01-01到2010-02-01等区间就可以用到这个功能。 LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第10张图片
    1.2 自动刷新
在日志量比较大的时候,我们查看日志时一般会自己手动点击刷新来查看最新的数据。 那么能不能偷下懒,让Kibana来帮我们完成这个动作,也就是自动刷新呢? 当前可以,请看下面:
     LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第11张图片

    2.Visualize页面

可视化页面可以基于查询条件组合生成很多类型的图表,例如:区域图、数据表、折线图、拼图、竖向图和能基于IP在地图展示的拼贴图等待,如下图所示:
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第12张图片
    2.1 饼图演示(基于访问IP分析)
    下面基于访问IP,统计了在15分钟内访问TOP 50的客户端分布。其他的图表可以自己尝试去玩玩看,都大同小异。
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第13张图片

3.Dashboard页面

这个页面上可以将多个已保存的图表创建为一个Dashboard,用作大屏展示。还提供了ifame的方式能将指定Dashboard嵌入到其他你想显示的页面里面。
多个图表支持鼠标拖动位置,同时还能选定指定区间数据进行细化查看。都是挺好用的功能。
下面我们来从官方提供的Dashboard挑选两个看看,对其他的感兴趣的可以自行去: http://demo.elastic.co/packetbeat/#/dashboard?_g=() 查看。
3.1 HTTP
这里显示总请求数、HTTP code分布数、按照时间序列柱状图展示、HTTP error分布、TOP N 请求等常用图表展示,如下图:
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第14张图片
3.2 MySQL performance
提供了查询错误分布、CRUD以及ROLLBACK分布、MySQL读写、慢查询SQL语句、TOP N 语句等常用图表。
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第15张图片

二、查询语法

    1.全文检索

         例子:在搜索框中检索和http相关的记录
          LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第16张图片

    2.字段查询

        2.1 精确匹配
              字符串的话用英文双引号括起来,例如:查询server为app.server2的表达式为–>:server:”app.server2″
     LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第17张图片
       
    2.2 整形查询
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第18张图片
其他的类似,只不过特殊字符需要转义。
  2.3 限定字段全文搜索
    例如只在path中检索console存在的记录,取消双引号就好了。
     LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第19张图片
 

 3.范围检索(数字、时间)

        3.1 查询输出字节数100~200之间的:bytes_out:[100 TO 200],可以用*代表无边界。
          LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第20张图片
    3.2 查询时间区间
         这里一般会存在时区的问题,相差8个小时,但是我们不影响我们查询,查询的时候也少8个小时就好了。
        3.2.1 从指定时间到现在/或者查询指定时间前数据 
        表达式如下:
         dataField:{startTime TO endTime}  // 指定区间范围
          dataField:{* TO endTime}               // 指定结束时间
          dataField:{startTime TO *}              // 指定开始时间
 
         比如查询2016-06-30T09:20:41.943之后的数据,可以用:–>@timestamp:{2016-06-30T09:20:41.943Z TO *} , 上面是09:20:41事实上是17:20:41,8个小时差。
          LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第21张图片
    4.正则
查询所有host非pub打头的记录,表达式为: –>  !host:/pub*/,前面的英文感叹号用作取反。
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第22张图片
下面来个复杂点的,多个条件组合查询。表达式为:
!host:”tjwq01-cp-net-neutron002204.tjwq01.ksyun.com” AND !host:”tjwq01-cp-control002193.tjwq01.ksyun.com” AND !host:”tjwq01*” AND !host:/pub*/
可用用AND和OR来做逻辑与、逻辑或,和RDBMS查询意思一样。
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第23张图片
    5.逻辑操作
基于AND 和 OR做条件连接即可,
语法为:
condition1 AND condition2 OR condition3
比如:
age:20 AND address:”beijing” OR address:”shanghai”
    6.存在/不存在
一条语句解释两个关键字: _exists_:host AND _missing_:bill , 表达的意思是查询存在host并且没有bill字段的记录。
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第24张图片
    7.特殊转义字符
+ – && || ! () {} [] ^” ~ * ? : \
以上字符当作值搜索的时候需要用\转义

8.模糊搜索

~:在一个单词后面加上~启用模糊搜索
first~ 也能匹配到 frist
还可以指定需要多少相似度cromm~0.3 会匹配到 from 和 chrome
数值范围0.0 ~ 1.0,默认0.5,越大越接近搜索的原始值
 
LOGSTASH+ELASTICSEARCH+KIBANA处理OSS访问日志_第25张图片
 

9.近似搜索

    在短语后面加上~
    “select where”~3 表示 select 和 where 中间隔着3个单词以内
    拓展阅读:
    0.《Elasticsearch 权威指南(中文版)》 http://es.xiaoleilu.com/index.html
    参考资料:
    0.《ELK:kibana使用的lucene查询语法》 https://segmentfault.com/a/1190000002972420
    1.《ELK kibana查询与过滤(17th)》 http://www.ttlsa.com/elk/elk-kibana-query-and-filter/
    2.《Kibana示例》 http://demo.elastic.co/packetbeat/

你可能感兴趣的:(运维)