1、ELK平台介绍
在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段:以下内容来自:http://baidu.blog.51cto.com/71938/1676798
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站:https://www.elastic.co/product
E:\u\elk\pic\01_1.png
Elk平台环境
系统
版本
服务器操作系统
Centos release 6.7 (Final)
ElasticSearch
2.3.4
Logstash
2.3.4
Kibana
4.5.3
Jdk
1.8
注:由于Logstash的运行依赖于Java环境,而Logstash1.5以上版本不低于Java1.7,因此推荐使用最新版本的Java。因为我们只需要Java的运行环境,所以可以只安装JRE,不过这里我依然使用JDK,请自行搜索安装,我这里准备使用1.7
官方网址:https://www.elastic.co/downloads,如下图所示:E:\u\elk\pic\01_2.png
从中获得下载地址:
wgethttps://download.elastic.co/logstash/logstash/logstash-2.3.4.tar.gz
wgethttps://download.elastic.co/kibana/kibana/kibana-4.5.3-linux-x64.tar.gz
wgethttp://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz
百度云:软件和head插件(http://pan.baidu.com/s/1mhVcc0w)
使用root安装jdk
mkdir -p /usr/lib/jvm
tar -xvf jdk-8u45-linux-x64.tar.gz -C /usr/lib/jvm
# vim /etc/profile配置系统参数
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_45
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_45/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_45/bin/javac 300
使用elk账号安装elasticearch:
#解压缩安装
useradd elk
su - elk
tar -xvf elasticsearch-2.3.4.tar.gz
cd elasticsearch-2.3.4
#安装Head插件
./bin/plugin install mobz/elasticsearch-head
ls plugins/
# ls能看到head文件即可表示ok了。
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ ll plugins/
总用量 4
drwxrwxr-x. 5 elk elk 4096 8月 2 17:26 head
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$
编译es的配置文件:
cluster.name: es_cluster
node.name: node0
path.data: /home/elk/data
path.logs: /home/elk/logs
#当前的host ip地址
network.host: 192.168.121.62
network.port: 9200
启动es:
./bin/elasticsearch &
看后台日志,发现它和其它的节点的传输端口为9300,而接受HTTP请求的端口为9200。日志如下所示:
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ more ../logs/es_cluster.log
[2016-08-02 17:47:23,285][WARN ][bootstrap ] unable to install syscall filter: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled
in
[2016-08-02 17:47:23,579][INFO ][node ] [node0] version[2.3.4], pid[21176], build[e455fd0/2016-06-30T11:24:31Z]
[2016-08-02 17:47:23,586][INFO ][node ] [node0] initializing ...
[2016-08-02 17:47:24,213][INFO ][plugins ] [node0] modules [reindex, lang-expression, lang-groovy], plugins [head], sites [head]
[2016-08-02 17:47:24,235][INFO ][env ] [node0] using [1] data paths, mounts [[/home (/dev/mapper/vg_dbmlslave1-lv_home)]], net usable_space [542.1gb], net total_space [10
17.2gb], spins? [possibly], types [ext4]
[2016-08-02 17:47:24,235][INFO ][env ] [node0] heap size [989.8mb], compressed ordinary object pointers [true]
[2016-08-02 17:47:24,235][WARN ][env ] [node0] max file descriptors [4096] for elasticsearch process likely too low, consider increasing to at least [65536]
[2016-08-02 17:47:25,828][INFO ][node ] [node0] initialized
[2016-08-02 17:47:25,828][INFO ][node ] [node0] starting ...
[2016-08-02 17:47:25,939][INFO ][transport ] [node0] publish_address {192.168.121.62:9300}, bound_addresses {192.168.121.62:9300}
[2016-08-02 17:47:25,944][INFO ][discovery ] [node0] es_cluster/626_Pu5sQzy96m7P0EaU4g
[2016-08-02 17:47:29,028][INFO ][cluster.service ] [node0] new_master {node0}{626_Pu5sQzy96m7P0EaU4g}{192.168.121.62}{192.168.121.62:9300}, reason: zen-disco-join(elected_as_master,
[0] joins received)
[2016-08-02 17:47:29,116][INFO ][http ] [node0] publish_address {192.168.121.62:9200}, bound_addresses {192.168.121.62:9200}
[2016-08-02 17:47:29,117][INFO ][node ] [node0] started
[2016-08-02 17:47:29,149][INFO ][gateway ] [node0] recovered [0] indices into cluster_state
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$
打开url地址http://192.168.121.62:9200/,E:\u\elk\pic\01_3.png
备注:插件的下载安装方式从https://github.com/mobz/elasticsearch-head下载ZIP包。
在elasticsearch目录下创建目录/plugins/head/并且将刚刚解压的elasticsearch-head-master目录下所有内容COPY到当前创建的/plugins/head/目录下即可,然后重启elasticsearch.
看返回结果,有配置的cluster_name、节点name信息以及安装的软件版本信息,其中安装的head插件,它是一个用浏览器跟ES集群交互的插件,可以查看集群状态、集群的doc内容、执行搜索和普通的Rest请求等。可以使用web界面来操作查看http://192.168.121.62:9200/_plugin/head/,如下图E:\u\elk\pic\01_4.png:
可以从界面看到,当前的elas集群里面没有index也没有type,所以是空记录。
logstash其实它就是一个收集器而已,我们需要为它指定Input和Output(当然Input和Output可以为多个)。由于我们需要把Java代码中Log4j的日志输出到ElasticSearch中,因此这里的Input就是Log4j,而Output就是ElasticSearch。
结构图如E:\u\elk\pic\02.png所示:
安装配置:
#解压缩安装
tar -xvf logstash-2.3.4.tar.gz
cd logstash-2.3.4
#将配置文件放置在config文件夹下面
mkdir config
vim config/log4j_to_es.conf
# 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
log4j {
mode => "server"
host => "192.168.121.62"
port => 4567
}
}
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 => "192.168.121.62:9200" #ElasticSearch host, can be array.
index => "applog" #The index to write data to.
}
}
启动logstash,2个参数一个是agent一个是配置文件:
[elk@hch_test_dbm1_121_62 logstash-2.3.4]$ ./bin/logstash agent -f config/log4j_to_es.conf
Settings: Default pipeline workers: 32
log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAuthCache).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Pipeline main started
接下来,可以使用logstash来收集日志并保存到es中了,可以使用一段java代码来实现它。
工程环境是eclipse,工程大概目录结构如下图E:\u\elk\pic\04.png,一个java类Application.java,一个日志配置文件log4j.properties,一个调度配置文件pom.xml:
(1)Application.java
packagecom.demo.elk;
importorg.apache.log4j.Logger;
publicclassApplication {
privatestaticfinalLoggerLOGGER= Logger.getLogger(Application.class);
publicApplication() {
//TODOAuto-generated constructor stub
}
publicstaticvoidmain(String[] args) {
//TODOAuto-generated method stub
for(inti = 0; i < 10; i++) {
LOGGER.error("Info log ["+ i +"].");
try{
Thread.sleep(500);
}catch(InterruptedException e) {
//TODOAuto-generated catchblockl
e.printStackTrace();
}
}
}
}
(2)Pom.xml:
"http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
elk3
elk3
0.0.1-SNAPSHOT
elk3
log4j
log4j
1.2.17
(3)log4j.properties
Log4j.properties,将Log4j的日志输出到SocketAppender,因为官网是这么说的E:\u\elk\pic\01_5.png:
Log4j.properties文件:
log4j.rootLogger=DEBUG, socket
# for package com.demo.elk, log would be sent to socket appender.
#log4j.logger.com.demo.elk=DEBUG, socket
# appender socket
log4j.appender.socket=org.apache.log4j.NET.SocketAppender
log4j.appender.socket.Port=4567
log4j.appender.socket.RemoteHost=192.168.121.62
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
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%l] %m%n
注意:这里的端口号需要跟Logstash监听的端口号一致,这里是4567。
(1)eclipse查看调试结果
在eclipse里面允许java程序,查看console的输出信息(这个output只是为了做一验证,没有这一步不输出到console也是可以的),调试成功后输出结果如下图E:\u\elk\pic\05.png所示:
(2)去Elasticsearch的head界面查看效果
去界面http://192.168.121.62:9200/_plugin/head/查看效果,点击概览里面,看到下面绿色的就是primay分片,下面灰色的为非primay备份分片,如下图E:\u\elk\pic\06.png所示:
其中:
A:docs: 20(20) 表示一共有20个文档,一个文档一个日志记录;
B:node0 表示只有一个分片,5个备份,分片暂时没有地方存放,所以显示为灰色Unassigned状态;
C:es_cluster集群健康值: yellow (6 of 12)表示因为有的分片没有地方存放所以集群报出了警告的黄色字体信息;
(3)去Elasticsearch的brower界面查看效果
备注:记得自己添加一个.kibana的索引.要不然安装kibana时报错
点击索引,在点击新建索引即可
E:\u\elk\pic\07.png
其中索引中的.kibanaapplog:表示是生成的索引集群,kibana暂时是空的,没有记录不遍历查询,而applog有5个分片记录。
查询 6 个分片中用的 5 个. 30 命中. 耗时 0.054 秒 表示:看到6个分片,其中有5个是applog,有30个是执行了3次eclipse所产生的log记录次数。
(4)查看单个文档_index信息
在选择中的单个文档,点击左键,就会弹出单个文档的全部信息,除了message是我们的日志内容,其它都是logstash增加的内容信息,新增加的这些字段信息涵义可以参考官网:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html的描述,如下图E:\u\elk\pic\08.png所示
PS总结:上面列出的都是单个ES的head界面组件查看到的elas集群的数据和状态,只是一个简单的和elas的交互界面,并不能形成报表或者动态的图表,所以我们需要其它的专业工具来做搜索并生成图表。
#解压缩安装
tar -xvf kibana-4.5.3-linux-x64.tar.gz
cd kibana-4.5.3-linux-x64
#配置修改配置
vim config/kibana.yml server.port: 5601
server.host: "192.168.121.62"
elasticsearch.url: “http://192.168.121.62:9200”
kibana.index: ".kibana"
#启动kibana
./bin/kibana
[elk@hch_test_dbm1_121_62 kibana-4.5.3-linux-x64]$ ./bin/kibana
log [14:53:15.975] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready
log [14:53:16.021] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [14:53:16.036] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready
log [14:53:16.046] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready
log [14:53:16.052] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready
log [14:53:16.064] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready
log [14:53:16.068] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready
log [14:53:16.072] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready
log [14:53:16.075] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready
log [14:53:16.084] [info][listening] Server running at http://192.168.121.62:5601
./bin/kibana
之后打开界面http://192.168.121.62:5601/status如下,E:\u\elk\pic\03.png:
为了后续使用Kibana,需要配置至少一个Index名字或者Pattern,它用于在分析时确定ES中的Index。这里我输入之前配置的Index名字applog,Kibana会自动加载该Index下doc的field,并自动选择合适的field用于图标中的时间字段:
再打开http://192.168.121.62:5601/app/kibana,输入applog,会自动弹出如下界面,然后点击“create”按钮保存下,如下图E:\u\elk\pic\09.png所示:
创建完成后,自动弹出成功界面,如下图E:\u\elk\pic\10.png所示:
选择左上角的“Discover”,然后再选择右上角的“List 15 minutes”(如果右上角默认的时间查询没有数据,就需要手动调整查询时间了),如下图E:\u\elk\pic\12.png所示:
这里为了看到数据信息,所以保守的选择了“Today”,然后会看到今天的记录,也即是看到的elas中的数据记录了,如下图E:\u\elk\pic\13.png所示:
在输入框里面,输入info字样,点击搜索按钮搜索,可以看到搜索匹配的信息如下E:\u\elk\pic\14.png:
点击右上角的“Save Search”按钮,就会保存此次的search结果,如下图E:\u\elk\pic\16.png所示:
接下来去Visualize页面,点击新建一个柱状图(Vertical Bar Chart),然后选择刚刚保存的查询search_logs_save_1,如下图E:\u\elk\pic\17.png所示:
之后进入左边选择x轴为Date Histogram时间轴,显示为时分,间隔为Auto自动间隔,然后点击绿色的三角形按钮“Apply Changes”,kibana将生成类似于下图的柱状图,如下图E:\u\elk\pic\18.png所示:
然后点击右边的保存按钮“Save Visualization”,可以保存此图为search_log_visual_1,如下图E:\u\elk\pic\19.png所示:
然后进入“Dashboard”界面,点击下面的灰色背景的“+”按钮,如下图E:\u\elk\pic\20.png所示:
然后选择我们刚才保存的visual图,就会展示出来上次我们生成的图表记录,面板上就会显示出原来的图表,如下图E:\u\elk\pic\21.png所示:
如果有较多数据,我们可以根据业务需求和关注点在Dashboard页面添加多个图表:柱形图,折线图,地图,饼图等等。当然,我们可以设置更新频率,让图表自动更新,如下图E:\u\elk\pic\22.png所示:
当然如果设置的时间比较紧凑,比较短暂的话,其实就相当于实时分析的图表了,类似于zabbix的监控图了。
OK,最基本的elk平台部署和调试的流程就走完了,接下来就是各种业务场景的使用了。
(1)start 问题
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ ./bin/elasticsearch &
[1] 20726
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]];
Likely root cause: ElasticsearchParseException[malformed, expected settings to start with 'object', instead was [VALUE_STRING]]
at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:65)
at org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:45)
at org.elasticsearch.common.settings.loader.YamlSettingsLoader.load(YamlSettingsLoader.java:46)
at org.elasticsearch.common.settings.Settings$Builder.loadFromStream(Settings.java:1080)
at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067)
at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88)
at org.elasticsearch.common.cli.CliTool.(CliTool.java:107)
at org.elasticsearch.common.cli.CliTool.(CliTool.java:100)
at org.elasticsearch.bootstrap.BootstrapCLIParser.(BootstrapCLIParser.java:48)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:226)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)
Refer to the log for complete error details.
[1]+ Exit 1 ./bin/elasticsearch
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$
原因是:配置文件中的=要换成:
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$ more config/elasticsearch.yml |grep -v "#"
cluster.name: es_cluster
node.name: node0
path.data: /home/elk/data
path.logs: /home/elk/logs
network.host: 192.168.121.62
network.port: 9200
[elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$
(2)、Unable to fetch mapping.
Unable to fetch mapping. Do you haveindices matching the pattern?
这就说明logstash没有把日志写入到elasticsearch。
解决方法:
检查logstash与elasticsearch之间的通讯是否有问题,一般问题就在这。
(3)、log4j报错
log4j:WARN No appenders could be foundfor logger (com.demo.elk.Application).
log4j:WARN Please initialize the log4jsystem properly.
log4j:WARN Seehttp://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
解决:
(a) jdk版本比较低,需要jdk1.7以上
(b)java类和log4j.properties没有匹配上,在测试中需要将java类和log4j.properties放在一个目录上。