ELK(ElasticSearch,Logstash,Kibana)实现Java分布式系统。
。。
⼀、⾸先理解为啥要使⽤ELK
⽇志主要分为三类:系统⽇志、应⽤程序⽇志和安全⽇志。系统运维和开发⼈员可以通过⽇志了解服务器软硬件信息、检查配置过程中的错误及错误发⽣的原因。通过分析⽇志可以了解服务器的负荷、性能安全性,从⽽及时采取措施纠正错误。通常情况下,分布式的运⾏⽇志是被分散的储存在不同的设备上,当服务器数量不多时,还能勉强应付,若服务器数量成百上千时,如果还是登录每台机器的传统⽅法查阅⽇志,这样会让⼈崩溃。此时就迫切需要使⽤集中化的⽇志管理,就是将所有服务器上的⽇志收集汇总。集中化管理⽇志后,⽇志的统计和检索⼜成为⼀件⽐较⿇烦的事情,⼀般我们使⽤grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更⾼的查询、排序和统计等要求和庞⼤的机器数量依然使⽤这样的⽅法难免有点⼒不从⼼。好的,经过上⾯的描述,那么ELK就是为了解决这些问题⽽存在的。
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,⾃动发现,索引⾃动分⽚,索引副本机制,restful风格接⼝,多数据源,⾃动搜索负载等。
Logstash是⼀个完全开源的⼯具,他可以对你的⽇志进⾏收集、过滤,并将其存储供以后使⽤(如,搜索)。
Kibana 也是⼀个开源和免费的⼯具,它Kibana可以为 Logstash 和 ElasticSearch 提供的⽇志分析友好的 Web 界⾯,可以帮助您汇总、分析和搜索重要数据⽇志。
直接上图,直观展⽰:
如图:Logstash收集AppServer产⽣的Log,并存放到ElasticSearch集中,⽽Kibana则从ES集中查询数据⽣成图表,再返回给Browser。
三、开源实时⽇志分析ELK平台部署流程:
ElasticSearch
配置ElasticSearch:
tar -zxvf elasticsearch-2.1.
cd elasticsearch-2.1.0
安装Head插件(Optional):
./bin/plugin install mobz/elasticsearch-head
然后编辑ES的配置⽂件:
vi l
修改以下配置项:
cluster.name=es_cluster
node.name=node0
path.data=/tmp/elasticsearch/data
path.logs=/tmp/elasticsearch/logs
#当前hostname或IP,我这⾥是centos2
network.host=centos2
network.port=9200
其他的选项保持默认,然后启动ES:
.
/bin/elasticsearch
可以看到,它跟其他的节点的传输端⼝为9300,接受HTTP请求的端⼝为9200。
使⽤ctrl+C停⽌。当然,也可以使⽤后台进程的⽅式启动ES:
./bin/elasticsearch &
然后可以打开页⾯localhost:9200,将会看到以下内容:
返回展⽰了配置的cluster_name和name,以及安装的ES的版本等信息。
刚刚安装的head插件,它是⼀个⽤浏览器跟ES集互的插件,可以查看集状态、集的doc内容、执⾏搜索和普通的Rest请求等。现在也可以使⽤它打开页⾯来查看ES集状态:
可以看到,现在,ES集中没有index,也没有type,因此这两条是空的。
Logstash
Logstash的功能如下:
其实它就是⼀个收集器⽽已,我们需要为它指定Input和Output(当然Input和Output可以为多个)。由于我们需要把Java代码中Log4j的⽇志输出到ElasticSearch中,因此这⾥的Input就是Log4j,⽽Output就是ElasticSearch。
配置Logstash:
tar -zxvf logstash-2.1.
cd logstash-2.1.1
编写配置⽂件(名字和位置可以随意,这⾥我放在config⽬录下,取名为log4j_f):
mkdir config
vi config/log4j_f
输⼊以下内容:
# For detail structure of this file
# Set: /guide/en/logstash/current/configuration-file-structure.html
input {
# For detail config for log4j as input,
# See: /guide/en/logstash/current/plugins-inputs-log4j.html
log4j {
mode => "server"
host => "centos2"
port => 4567
}
}
filter {
#Only matched data are send to output.
}
output {
# For detail config for elasticsearch as output,
# See: /guide/en/logstash/current/plugins-outputs-elasticsearch.html
elasticsearch {
action => "index" #The operation on ES
hosts => "centos2:9200" #ElasticSearch host, can be array.
index => "applog" #The index to write data to.
}
}
logstash命令只有2个参数:
因此使⽤agent来启动它(使⽤-f指定配置⽂件):
./bin/logstash agent -f config/log4j_f
到这⾥,我们已经可以使⽤Logstash来收集⽇志并保存到ES中了,下⾯来看看项⽬代码。
Java项⽬
照例先看项⽬结构图:
<dependency>
<groupId>log4j</groupId>
log4j2 appender<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
log4j.properties,将Log4j的⽇志输出到SocketAppender,因为官⽹是这么说的:
# for package com.demo.elk, log would be sent to socket appender.
log4j.logger.demo.elk=DEBUG, socket
# appender socket
log4j.appender.socket=org.apache.log4j.SocketAppender
log4j.appender.socket.Port=4567
log4j.appender.socket.RemoteHost=centos2
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n
log4j.appender.socket.ReconnectionDelay=10000
# appender console
sole=org.apache.log4j.ConsoleAppender
sole.target=System.out
sole.layout=org.apache.log4j.PatternLayout
sole.layout.ConversionPattern=%d [%-5p] [%l] %m%n
注意:这⾥的端⼝号需要跟Logstash监听的端⼝号⼀致,这⾥是4567。
Application.java,使⽤Log4j的LOGGER打印⽇志即可:
package com.demo.elk;
import org.apache.log4j.Logger;
public class Application {
private static final Logger LOGGER = Logger(Application.class);
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
<("Info log [" + i + "].");
Thread.sleep(500);
}
}
}
⽤Head插件查看ES状态和内容
运⾏Application.java,先看看console的输出(当然,这个输出只是为了做验证,不输出到console也可以的):
再来看看ES的head页⾯:
切换到Browser标签:
单击某⼀个⽂档(doc),则会展⽰该⽂档的所有信息:
上⾯使⽤了ES的Head插件观察了ES集的状态和数据,但这只是个简单的⽤于跟ES交互的页⾯⽽已,并不能⽣成报表或者图表什么的,接下来使⽤Kibana来执⾏搜索并⽣成图表。
Kibana
配置Kibana:
tar -zxvf kibana-4.3.
cd kibana-4.3.0-linux-x86
vi l
修改以下⼏项(由于是单机版的,因此host的值也可以使⽤localhost来代替,这⾥仅仅作为演⽰):
server.port: 5601
server.host: “centos2”
elasticsearch.url: centos2:9200
kibana.index: “.kibana”
启动kibana:
./bin/kibana
⽤浏览器打开该地址:
为了后续使⽤Kibana,需要配置⾄少⼀个Index名字或者Pattern,它⽤于在分析时确定ES中的Index。这⾥我输⼊之前配置的Index名字applog,Kibana会⾃动加载该Index下doc的field,并⾃动选择合适的field⽤于图标中的时间字段:
点击Create后,可以看到左侧增加了配置的Index名字:
接下来切换到Discover标签上,注意右上⾓是查询的时间范围,如果没有查到数据,那么你就可能需要调整这个时间范围了,这⾥我选择Today:
接下来就能看到ES中的数据了:
执⾏搜索看看呢:
点击右边的保存按钮,保存该查询为search_all_logs。接下来去Visualize页⾯,点击新建⼀个柱状图(Vertical Bar Chart),然后选择刚刚保存的查询search_all_logs,之后,Kibana将⽣成类似于下图的柱状图(只有10条⽇志,⽽且是在同⼀时间段的,⽐较丑,但⾜可以说明问题了:) ):
你可以在左边设置图形的各项参数,点击Apply Changes按钮,右边的图形将被更新。同理,其他类型的图形都可以实时更新。
点击右边的保存,保存此图,命名为search_all_logs_visual。接下来切换到Dashboard页⾯:
单击新建按钮,选择刚刚保存的search_all_logs_visual图形,⾯板上将展⽰该图:
如果有较多数据,我们可以根据业务需求和关注点在Dashboard页⾯添加多个图表:柱形图,折线图,地图,饼图等等。当然,我们可以设置更新频率,让图表⾃动更新:
如果设置的时间间隔够短,就很趋近于实时分析了。
到这⾥,ELK平台部署和基本的测试已完成。
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论