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放在一個目錄上。