一:ELK名字解释
ELK是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash和Kibana。
Logstash:负责数据的收集,处理和储存
Elasticsearch:负责数据的检索和分析
Kibana:负责可视化
体系结构
基本流程是 logstash 负责从各种数据源里采集数据,然后再写入 Elasticsearch,Elasticsearch 对这些数据创建索引,然后由 Kibana 对其进行各种分析并以图表的形式展示。
ELK就是ElasticSearch + LogStash + Kibana,这三样搭配起来确实非常不错,先画张图给大家看一下。
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
- 修改
elasticsearch/config/elasticsearch.yml
- 添加
http.cors.enabled: true
http.cors.allow-origin: "*"
- 下载 elasticsearch-head 或者 git clone 到随便一个文件夹
- 安装
nodejs
cd /path/to/elasticsearch-head
npm install -g grunt-cli
npm install
grunt server
最后请求http://localhost:9100/
- 当你看到以下界面说明插件已启动
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>
|