ELK日志分析系统初体验

96
NIA_CUMT
0.4 2017.02.14 22:13* 字数 1900

1 ELK技术栈

1.0 官方文档

ELK

logstash

elasticsearch

kibana

ELK技术栈要点总结

1.1 Logstash技术

1.1.1 What is Logstash

Logstash is an open source data collection engine with real-time pipelining capabilities. Logstash can dynamically unify data from disparate sources and normalize the data into destinations of your choice. Cleanse and democratize all your data for diverse advanced downstream analytics and visualization use cases.

1.1.2 Logstash的工作原理

1.1.3 Logstash安装与使用

1.1.3.1 安装教程

官方文档之安装教程

Mac第三方工具安装

$ brew install logstash

1.1.3.2 使用教程

********启动命令********

$ bin/logstash -f logstash-example.conf

Logstash根据logstash-example.conf配置文件对数据源进行数据读取和清洗,并将清洗结果写入指定的目标文件。

logstash命令除了可以使用“-f”指定配置文件外,还可以指定其他参数,具体说明可以参见官方文档之Command Flags

Logstash除了通过命令行参数进行配置外,还可以在logstash.yml等setting文件中进行设置,具体说明参见官方文档之Setting files

配置文件

input { 
 ...      #Input Plugin处理数据输入
}
filter {
 ...      #Filter Plugin对数据进行清洗,为完成清洗目标,有时需要多个filter
}
output {
  ...       #Output Plugin将格式化数据输出到指定目标文件
}

配置文件结构清晰,但所涉及的插件种类繁多,而且在插件使用过程中还涉及环境变量使用条件语句使用等内容。用户可根据需要选择适当的插件和语法实现数据收集和清洗的目标。

1.1.4 Logstash的技术要点

##1.2 Elasticsearch****技术

1.2.1 What is Elasticsearch

Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you to store, search, and analyze big volumes of data quickly and in near real time. It is generally used as the underlying engine/technology that powers applications that have complex search features and requirements.

1.2.2 核心概念

****Cluster****与****Node****

****Index****、****Type****与****Document****

****Shards****与****Replicas****

1.2.3 配置与使用

********启动命令********

$ bin/elasticsearch 前端方式启动
$ bin/elasticsearch -d 守护进程方式启动
elasticsearch启动比较简单,也额外创建配置文件,它将收集的数据重新编排存储,以支持数据的全文检索。检索是Elasticsearch最为重要的功能,也是最为复杂的语法。

********需要注意的是:********elasticsearch不支持在root用户下启动,因此,在启动前,用户需要创建非root用户,并为该用户赋予elasticsearch目录的操作权限,详情参见https://my.oschina.net/topeagle/blog/591451?fromerr=mzOr2qzZ

********配置管理********
Elasticsearch一般不需额外配置,但是为了提高Elasticsearch性能可以通过elasticsearch.yml文件修改配置参数。当然,也可以根据用户系统配置降低配置参数,如jvm.heapsize。Elasticsearch默认占用2G内存,对于系统配置较低的服务器,很可能带来负载过大的问题,因此需要适当减少jvm.heapsize。

1.2.4 数据检索

Elasticsearch提供大量的API支持检索服务,用户甚至可以根据需要定制化分析器映射器.

1.2.5 Elasticsearch技术要点

##1.3 Kibana****技术

1.3.1 What is Kibana

Kibana is an open source analytics and visualization platform designed to work with Elasticsearch. You use Kibana to search, view, and interact with data stored in Elasticsearch indices. You can easily perform advanced data analysis and visualize your data in a variety of charts, tables, and maps.
Kibana makes it easy to understand large volumes of data. Its simple, browser-based interface enables you to quickly create and share dynamic dashboards that display changes to Elasticsearch queries in real time.

1.3.2 安装与配置

********安装********
参见官方教程,值得注意的是Kibana与Elasticsearch版本要保持一致。

********启动********

$ bin/kibana      //前台(foreground)启动方式
$ bin/kibana&     //守护进程启动方式

********配置********
Kibana配置可以通过命令行参数或配置文件kibana.yml。Kibana应用的默认地址为localhost,无法从远程访问Kibana,因此,用户需要修改配置文件的server.host属性。

1.3.3 使用教程

********数据检索********


(1)时间筛选:限定检索的时间范围



(2)index pattern:限定检索的数据范围
(3)字段筛选:限定特殊字段以及特殊字段值
(4)搜索框:采用Elasticsearch检索语法查询


********数据分析********
数据分析是Elasticsearch与Kibana的核心模块,Elasticsearch提供分析功能,kibana提供图形渲染功能。

数据分析需要涉及Elasticsearch的AggregationMappingAnalysis和Kibana的VisualizeDashboard等模块,内容相对比较复杂,用户可根据实际需要适当选择。

Kibana的Visualize是基于Elasticsearch聚合结果进行图形化展示,支持AreaChart、DataTable、PieChart等图表结构。Dashboard则是将多个visualize综合展示,并配注markdown记录,形成完整的数据分析报告。


1.3.4 Kibana技术要点

#2 ****日志分析系统
##2.1 ****基于阿里云****NAS****的日志分析系统架构设计

********日志生成:********对于Java和Node应用,分别采用Logback与winston日志框架生成日志,注意,日志采用json格式单行存储(一行json对应一条日志)

********日志存储:********分布式应用的日志采用NAS统一存储,减少因日志分散保存而带来数据收集的高复杂度。

********日志收集与清洗:********基于Logback的Pipeline功能,从NAS读取日志数据,并通过 filter插件进行日志的格式化清洗,并将清洗结果传送到Elasticsearch。

********日志重排与存储:********Elasticsearch将收集的数据进行重排,以支持符合elasticsearch检索语法。并将重排数据予以保存,同事可以通过集群、分片(Shards、Replicas)等进行冗余存储。

********日志分析与检索:********通过Elasticsearch Search API即可检索与分析数据,但基于命令行的分析可视化不够,借助Kibana可以将日志分析与检索采用图形化、列表化的方式予以展现,提高数据的可读性。

##2.2 ****日志收集

2.2.1 Logstash配置文件

input { 
  file {
    path => "/mnt/test/lease/be-lease-core/logs/sys*.log"
    start_position => "beginning"
    type => "demo_core"
  }
  file {
    path => "/mnt/test/lease/be-platform-admin/logs/sys*.log"
    start_position => "beginning"
    type => "boss"
  }
  file {
    path => "/mnt/test/lease/be-sso-config-hub/logs/sys*.log"
    start_position => "beginning"
    type => "sso"
  }
}

filter { 
  json {
    source => "message"
  }
  mutate {
    rename => { "message" => "log_message" }
  }
  json {
    source => "log_message"
  }
  geoip {
    source => "remoteIP"
  }
}

output {
 elasticsearch { 
    hosts => ["localhost:9200"] 
    index => "lease-on-cloud"
 } 
}

2.2.2 Logstash配置文件分析

********(****1****)**** Input****部分********

file {
    path => "/mnt/test/lease/be-lease-core/logs/sys*.log"
    start_position => "beginning"
    type => "demo_core"
}

采用file插件收集NAS日志收据,path指定日志存放地址,采用通配符指定多个文件。

为了便于日志的Archive,以及标识产生日志的应用容器,日志文件采用“log+hostname”方式命名,因此,同一类日志可能会存在多个日志文件。

start_position指定从日志文件Start位置开始收集,file插件默认从End位置收集,只会收集Logstash启动后生成的日志。

type标识日志类型,对于微服务应用,我们借助type区分应用类型,以方便日后检索与问题定位。

********(****2****)**** Filter****部分********

filter { 
  json {
    source => "message"
  }
  mutate {
    rename => { "message" => "log_message" }
  }
  json {
    source => "log_message"
  }
  geoip {
    source => "remoteIP"
  }
}

filter的配置需要根据日志格式和清洗目标按需定制,在我们的项目中,日志采用json格式,其中message key对应的value又是json对象的字符串,因此在提取json key-value时需要做两次json过滤。

{
    "@timestamp": "2017-01-11T21:23:31.266+08:00",
    "@version": 1,
    "message": "{\"messageType\":\"HTTP_REQUEST\",\"method\":\"POST\",\"remoteIP\":\"172.19.0.6\",\"remotePort\":37404,\"requestContentType\":\"multipart/form-data; boundary=----WebKitFormBoundaryPERZDPTHqXa44MD6\",\"requestUrl\":\"/boss/Api/StandardService/findAllService\",\"timestamp\":1484141011266,\"userId\":0}",
    "logger_name": "com.amarsoft.platform.common.filter.SystemLoggingFilter",
    "thread_name": "qtp1641808846-17",
    "level": "DEBUG",
    "level_value": 10000,
    "HOSTNAME": "8753bfd90a1e-be-platform-admin-default-be-platform-admin-1",
    "SYS_ERROR": "sys-error",
    "SYS_INFO": "sys-info",
    "SYS_HIBERNATE": "sys-hibernate",
    "SYS_MYBATIS": "sys-mybatis",
    "SYS_FILTER": "sys-filter",
    "RemoteIP": "83.149.9.216"
}

Logstash默认每条日志为message key的value,因此第一个json是对一条完整日志进行筛选,将json转换为一个个键值对。转换后,并不能将日志message字段对应的json对象拆分提取,因此需要再使用json插件过滤。由于完整日志对应的message key与日志内message key,二次使用json时Logstash会认为对完整日志进行过滤,为此需要对 message进行重命名,这时采用mutate插件完成。

********注意:********filter插件比较多,也比较复杂,用户可以根据自己需要按需选择。
##2.3 ****日志分析(检索)

2.3.1 确定分析目标

(1)时间范围:按照日、周、月、年度分别统计分析
(2)应用比较:各类应用的使用频繁程度比较,结合监控数据判断每类应用耗用资源情况等
(3)API分析:各类请求接口的使用情况分析,哪类API使用频繁,各API的响应时间如何

2.3.2 数据分析

日记本