共计 13512 个字符,预计需要花费 34 分钟才能阅读完成。
1、ELK平台介绍
在搜索 ELK 资料的时候,发现这篇文章比较好,于是摘抄一小段:
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的 syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用 grep、awk 和 wc 等 Linux 命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
开源实时日志分析 ELK 平台能够完美的解决我们上述的问题,ELK 由 ElasticSearch、Logstash 和 Kiabana 三个开源工具组成。官方网站:https://www.elastic.co/product
E:\u\elk\pic\01_1.png
2、安装准备
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 以上版本不低于 java 1.7,因此推荐使用最新版本的Java。因为我们只需要Java 的运行环境,所以可以只安装JRE,不过这里我依然使用JDK,请自行搜索安装,我这里准备使用1.7
3、下载
官方网址:https://www.elastic.co/downloads,如下图所示:E:\u\elk\pic\01_2.png
从中获得下载地址:
wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.4/elasticsearch-2.3.4.tar.gz wget https://download.elastic.co/logstash/logstash/logstash-2.3.4.tar.gz wget https://download.elastic.co/kibana/kibana/kibana-4.5.3-linux-x64.tar.gz wget http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz |
4、安装调试
4.1、安装jdk
使用 root 安装 jdk
mkdir -p /usr/lib/jvm tar -xvf jdk-8u45-linux-x64.tar.gz -C /usr/lib/jvm # vim /etc/profile 配置系统参数 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 |
4.2、安装elasticsearch
使用 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
看返回结果,有配置的 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,所以是空记录。
4.3、安装logstash
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 代码来实现它。
4.4、elk3测试工程
工程环境是 eclipse,工程大概目录结构如下图 E:\u\elk\pic\04.png,一个 java 类 Application.java,一个日志配置文件 log4j.properties,一个调度配置文件 pom.xml:
(1)Application.java
package com.demo.elk; import org.apache.log4j.Logger; public class Application { private static final Logger LOGGER = Logger.getLogger(Application.class); public Application() { // TODO Auto-generated constructor stub } public static void main(String[] args) { // TODO Auto-generated method stub for (int i = 0; i < 10; i++) { LOGGER.error(“Info log [“ + i + “].”); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch blockl e.printStackTrace(); } } } } |
(2)Pom.xml:
<project xmlns=“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”> <modelVersion>4.0.0</modelVersion> <groupId>elk3</groupId> <artifactId>elk3</artifactId> <version>0.0.1-SNAPSHOT</version> <name>elk3</name> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </project> |
(3) log4j.properties
Log4j.properties,将 Log4j 的日志输出到 SocketAppender,因为官网是这么说的 E:\u\elk\pic\01_5.png:
Log4j.properties 文件:
log4j.rootLogger=INFO,console # 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。
4.5、eclipse调试结果
(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界面查看效果
E:\u\elk\pic\07.png
其中 索引中的 .kibana applog:表示是生成的索引集群,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 的交互界面,并不能形成报表或者动态的图表,所以我们需要其它的专业工具来做搜索并生成图表。
4.6、安装kinana
# 解压缩安装 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:
4.7、配置kibana
为了后续使用 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 所示:
4.8、kibana生成图表
选择左上角的“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 平台部署和调试的流程就走完了,接下来就是各种业务场景的使用了。
5、一些错误记录
(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.<init>(CliTool.java:107) at org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:100) at org.elasticsearch.bootstrap.BootstrapCLIParser.<init>(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 放在一个目录上。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135137.htm