一:ELK名字解释

ELK是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash和Kibana。

Logstash:负责数据的收集,处理和储存

Elasticsearch:负责数据的检索和分析

Kibana:负责可视化

体系结构

基本流程是 logstash 负责从各种数据源里采集数据,然后再写入 Elasticsearch,Elasticsearch 对这些数据创建索引,然后由 Kibana 对其进行各种分析并以图表的形式展示。


    ELK就是ElasticSearch + LogStash + Kibana,这三样搭配起来确实非常不错,先画张图给大家看一下。

elk下载地址 elkitap下载_html

 

1. LogStash

     它可以流放到各自的服务器上收集Log日志,通过内置的ElasticSearch插件解析后输出到ES中。

文档:https://www.elastic.co/guide/en/logstash/current/index.html

参考中文文档:https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/index.html

 

2.ElasticSearch

   这是一个基于Lucene的分布式全文搜索框架,可以对logs进行分布式存储,有点像hdfs哈。。。

官方文档:https://www.elastic.co/cn/

 

3. Kibana

   所有的log日志都到ElasticSearch之后,我们需要给他展示出来,对吧? 这个时候Kibana就出手了,它可以多维度的展示es中的数据。这也解决了

用mysql存储带来了难以可视化的问题。

文档:https://www.elastic.co/guide/en/kibana/current/index.html

相关文档 http://cwiki.apachecn.org/pages/viewpage.action?pageId=8159377


下载

官方下载 :https://www.elastic.co/cn/products,在下面这张图上,我们找到对应的三个产品,进行下载就好了。


WIN下载安装参考文档

http://www.360doc.com/content/17/0608/16/17572791_661113000.shtml


linux参考


安装,启动。

1、elasticsearch

下载后直接解压即可。

然后进入它的bin目录   通过命令启动elasticsearch就好。

启动后可直接访问http://localhost:9200   如果你能看到以下的返回  说明你的elasticsearch已经启动好了


{          
                      "name"            :            "Tom Foster"           ,          
                      "cluster_name"            :            "elasticsearch"           ,          
                      "version"            : {          
                      "number"            :            "2.1.0"           ,          
                      "build_hash"            :            "72cd1f1a3eee09505e036106146dc1949dc5dc87"           ,          
                      "build_timestamp"            :            "2015-11-18T22:40:03Z"           ,          
                      "build_snapshot"            :            false           ,          
                      "lucene_version"            :            "5.3.1"          
                      },          
                      "tagline"            :            "You Know, for Search"          
           }


在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化。此时,head可以完美的帮助你快速学习和使用Elasticsearch。

安装 elasticsearch-head
  1. 修改 elasticsearch/config/elasticsearch.yml
  2. 添加
http.cors.enabled: true
http.cors.allow-origin: "*"
  1. 下载 elasticsearch-head 或者 git clone 到随便一个文件夹
  2. 安装nodejs

cd /path/to/elasticsearch-headnpm install -g grunt-clinpm installgrunt server最后请求http://localhost:9100/

  1. 当你看到以下界面说明插件已启动

2、LogStash



他的工作方式大致如下图



所以解压完之后,我们到它的config目录中新建一个logstash.conf配置。


做好input ,filter,output三大块,可参考上图。 其中input是吸取127.0.0.1的9250的日志输入,filter是一个过滤函数,这里不用配置,

output配置了导入到hosts为127.0.0.1:9200的elasticsearch中的applog索引。


# For detail structure of            this            file           
           # Set: https:           //www.elastic.co/guide/en/logstash/current/configuration-file-structure.html           
           input {           
                      # For detail config            for            log4j as input,            
                      # See: https:           //www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html           
                      tcp {           
                      mode =>            "server"           
                      host =>            "127.0.0.1"           
                      port =>            9250           
                      }           
           }           
           filter {           
                      #Only matched data are send to output.           
           }           
           output {           
                      # For detail config            for            elasticsearch as output,            
                      # See: https:           //www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html           
                      elasticsearch {           
                      action =>            "index"                     #The operation on ES           
                      hosts  =>            "127.0.0.1:9200"              #ElasticSearch host, can be array.           
                      index  =>            "applog"                    #The index to write data to.           
                      }           
           }



配置完了之后,我们就可以到bin目录下启动logstash了,执行命令logstash -f ../config/logstash.conf 就可以看到他启动了,默认开启的是9600端口。

这时 我们去访问http://localhost:9600/    可以看到返回说明启动成功了。

注意

LogStash启动时若报错【错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_131\lib\dt.jar;C:\Program】

则需要在bin目录下的logstash.bat文件 

将%JAVA% %JAVA_OPTS% -cp %CLASSPATH% org.logstash.Logstash %* 

修改为%JAVA% %JAVA_OPTS% -cp "%CLASSPATH%" org.logstash.Logstash %*

%CLASSPATH%添加双引号

然后尝试再次启动

3、kibana

它的配置也非常简单,你需要在config下的kibana.yml文件中指定一下你需要读取的elasticSearch地址和可供外网访问的bind地址就可以了。


elasticsearch.url:            "<a href="http://localhost:9200/" "="" style="border-radius: 0px; background: 0px center; border: 0px; bottom: auto; float: none; height: auto; left: auto; line-height: 20px; margin: 0px; outline: 0px; overflow: visible; padding: 0px; position: static; right: auto; top: auto; vertical-align: baseline; width: auto; box-sizing: content-box; min-height: inherit; color: rgb(0, 51, 102) !important;">http://localhost:9200"          
           server.host:            0.0           .           0.0



然后进入bin目录启动。他的默认端口为5601.我们访问http://localhost:5601  当看到一下界面时说明启动成功

以上我们就完成了ELK的基本安装和启动。在之后我们会学习如何将我们的程序和ELK整合起来。

我们需要做的:

1、添加依赖


<dependency>          
                      <groupId>net.logstash.logback</groupId>          
                      <artifactId>logstash-logback-encoder</artifactId>          
                      <version>           4.6           </version>          
           </dependency>



2、添加配置文件


<?xml version=           "1.0"            encoding=           "UTF-8"           ?>          
           <!--该日志将日志级别不同的log信息保存到不同的文件中 -->          
           <configuration>          
                      <include resource=           "org/springframework/boot/logging/logback/defaults.xml"            />          
                      
                      <springProperty scope=           "context"            name=           "springAppName"          
                      source=           "spring.application.name"            />          
                      
                      <!-- 日志在工程中的输出位置 -->          
                      <property name=           "LOG_FILE"            value=           "${BUILD_FOLDER:-build}/${springAppName}"            />          
                      
                      <!-- 控制台的日志输出样式 -->          
                      <property name=           "CONSOLE_LOG_PATTERN"          
                      value=           "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"            />          
                      
                      <!-- 控制台输出 -->          
                      <appender name=           "console"            class           =           "ch.qos.logback.core.ConsoleAppender"           >          
                      <filter            class           =           "ch.qos.logback.classic.filter.ThresholdFilter"           >          
                      <level>INFO</level>          
                      </filter>          
                      <!-- 日志输出编码 -->          
                      <encoder>          
                      <pattern>${CONSOLE_LOG_PATTERN}</pattern>          
                      <charset>utf8</charset>          
                      </encoder>          
                      </appender>          
                      
                      <!-- 为logstash输出的JSON格式的Appender -->          
                      <appender name=           "logstash"          
                      class           =           "net.logstash.logback.appender.LogstashTcpSocketAppender"           >          
                      <destination>           127.0           .           0.1           :           9250           </destination>          
                      <!-- 日志输出编码 -->          
                      <encoder          
                      class           =           "net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"           >          
                      <providers>          
                      <timestamp>          
                      <timeZone>UTC</timeZone>          
                      </timestamp>          
                      <pattern>          
                      <pattern>          
                      {          
                      "severity"           :            "%level"           ,          
                      "service"           :            "${springAppName:-}"           ,          
                      "trace"           :            "%X{X-B3-TraceId:-}"           ,          
                      "span"           :            "%X{X-B3-SpanId:-}"           ,          
                      "exportable"           :            "%X{X-Span-Export:-}"           ,          
                      "pid"           :            "${PID:-}"           ,          
                      "thread"           :            "%thread"           ,          
                      "class"           :            "%logger{40}"           ,          
                      "rest"           :            "%message"          
                      }          
                      </pattern>          
                      </pattern>          
                      </providers>          
                      </encoder>          
                      </appender>          
                      
                      <!-- 日志输出级别 -->          
                      <root level=           "INFO"           >          
                      <appender-ref ref=           "console"            />          
                      <appender-ref ref=           "logstash"            />          
                      </root>          
           </configuration>