日誌分析利器elk與logback(log4j)實戰
在近期的專案中,由於其專案中記錄了許多日誌,當系統由於某些BUG掛掉時,單純地通過命令來查詢錯誤日誌很不方便排除,且搜尋起來很非常不方便,很花費時間,對於一向不喜歡乾重復單調很費時間的我來說,如果沒有一種辦法來解決日誌問題是一件很痛苦的事情。那天偶然,公司的CTO說解決這種事情,只需要ELK就能解決掉了(CTO果然見多識廣),對於一向喜歡新技術的我來說,我便在網上搜索了一些關於ELK的知識,正好今天週六,我將此記錄一下,為方便以後檢視和快速安裝ELK。
首先ELK到底是什麼呢?通過在網上查詢相關資訊瞭解到,其實ELK是由Elasticsearch、Logstash、Kibana這3個軟體的縮寫。
在以前的專案中日誌的處理流程大致是這樣的:先由我們自己開發的系統產生出日誌,由其日誌框架進行處理,(在JAVAEE中這些日誌框架如log4j,slf4j,logback)通過日誌框架將日誌列印到控制檯或輸出到指定的檔案中,當我們需要對日誌檔案進行檢視時,通過vim等工具進行檢視。
L
那麼有了ELK之後,其日誌的處理流程就是在其上所述的基礎上,日誌處理框架在輸出日誌資訊的時候,還將日誌輸出到一個開放了TCP埠的程式中,那麼在ELK中,這個用於收集日誌的程式便是Logstash,在Logstash收集到日誌資訊後,Logstash這個程式可以將這些日誌再次包裝一下,也可以直接輸出到Elasticsearch這個程式中。
E
由Elasticsearch這個名字猜想出,它是一個和搜尋相關的程式,事實上也是這樣的,Elasticsearch是一個基於Lucene的搜尋伺服器,能在很快的時間內檢索出你所想要查詢的資訊。
K
Kibana是什麼呢?個人理解的話,Kibana是一個用於操作Elasticsearch的一個圖形化介面,通過Kibana這個WEB介面,使得對於Elasticsearch的資料的檢索變得非常方便。
ELK流程
所有總結起來,ELK的流程應該是這樣的:Logback->Logstash->(Elasticsearch<->Kibana)
由我們自己的程式產生出日誌,由日誌框架進行處理,將日誌資料輸出到Logstash中,Logstash再將資料輸出到Elasticsearch中,Elasticsearch再與Kibana相結合展示給使用者。
ELK搭建過程
軟體準備
在這裡,以Centos7伺服器為例,記錄下其ELK的搭建過程。
首先在伺服器上下載好以下安裝包:
logstash-1.5.4-1.noarch.rpm
elasticsearch-1.7.3.noarch.rpm
kibana-4.1.2-linux-x64.tar.gz
當然,由於以上軟體的執行環境為JAVA,所以得要提前安裝好JDK。我這裡安裝的是JDK1.8,並設好環境變數及JAVA_HOME
Logstash安裝
[[email protected] elk]# yum localinstall logstash-1.5.4-1.noarch.rpm一直y 待安裝完成後,看看安裝到哪裡了,並配置下log4j的
[[email protected] elk]# whereis logstash
logstash: /etc/logstash /opt/logstash/bin/logstash /opt/logstash/bin/logstash.bat
[[email protected] elk]# cd /opt/logstash/bin
[[email protected] bin]# ll
total 36
-rwxrwxr-x. 1 logstash logstash 1046 Aug 20 2015 logstash
-rw-rw-r--. 1 logstash logstash 689 Aug 20 2015 logstash.bat
-rwxrwxr-x. 1 logstash logstash 4107 Aug 20 2015 logstash.lib.sh
-rwxrwxr-x. 1 logstash logstash 439 Aug 20 2015 plugin
-rw-rw-r--. 1 logstash logstash 251 Aug 20 2015 plugin.bat
-rwxrwxr-x. 1 logstash logstash 322 Aug 20 2015 rspec
-rw-rw-r--. 1 logstash logstash 245 Aug 20 2015 rspec.bat
-rw-rw-r--. 1 logstash logstash 2165 Aug 20 2015 setup.bat
然後建立一個logstash的配置檔案
mkdir config
vim log4j_to_es.conf
在這裡面插入如下內容:
input {
tcp {
port => 4567
}
}
filter {
}
output {
stdout {
codec => rubydebug
}
}
其意思就是,開放本地的4567埠,通過此埠接收日誌資料
output代表輸出,將日誌資料輸出配置 stdout codec代表按照rubydebug方式把日誌包裝下
然後再啟動下logstash,為了省事,先防火牆關掉
[[email protected] ping]# systemctl stop firewalld
然後再執行啟動,並以config目錄下的log4j_to_es.conf為配置檔案
[[email protected] bin]# ./logstash -f config/log4j_to_es.conf
提示startup completed就證明啟動OK了!
Logback配置
logstash的配置已經好了之後,我再測試下,能否把JAVAEE的日誌輸出到logstash上去呢。 先新增jar包的maven依賴 <!-- Logstash encoder -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.4</version>
</dependency>
再在logback.xml中新增如下內容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are by default assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<param name="Encoding" value="UTF-8"/>
<remoteHost>192.168.31.222</remoteHost>
<port>4567</port>
<!-- encoder is required -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="info">
<appender-ref ref="logstash" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
其中remoteHost指定了logstash的IP地址,port為logstash的埠 這樣就配置好了logback,然後再啟動我們的程式,看看logstash是否能接收到日誌資料。
OK!從logstash上可以看到logstash已經接收到資料了,這就證明成功了一大半,接下來配置下elasticsearch 和kibana就完了。
elasticsearch安裝與配置
[[email protected] elk]# yum localinstall elasticsearch-1.7.3.noarch.rpm# 過載所有修改過的配置檔案
[[email protected] elk]# systemctl daemon-reload #設為開機啟動 [[email protected] elk]# systemctl enable elasticsearch.service
#開啟elasticsearch [[email protected] elk]# systemctl start elasticsearch.service
elasticsearch預設會開啟9200埠,為了驗證elasticsearch是否成功啟動了,在瀏覽器上驗證下
OK,顯示為以上畫面,證明啟動OK了! 如果需要對elasticsearch的相關配置修改下,可以修改elasticsearch的配置檔案
查詢出elasticsearch的配置檔案,再根據需要修改就好
rpm -qc elasticsearch
kibana安裝與配置
#執行解壓 [[email protected] elk]# tar -zxvf kibana-4.1.2-linux-x64.tar.gz修改配置檔案
在kibana.yml中可以修改kibana的埠和要關聯的elasticsearch地址
執行kibana解壓目錄下的kibana就好 然後在瀏覽器中開啟此安裝伺服器5601埠
Ok,證明kibana的啟動也成功了。
ELK配置關聯,並測試
在上面的安裝中,為了測試方便,是分別對單個程式的安裝,並沒有將logstash收集到的日誌轉給elasticserach進行處理,所以最後再將logstash的配置檔案修改下,重新啟動下logstash就好![[email protected] config]# vim log4j_to_es.conf
input {
tcp {
port => 4567
}
}
filter {
}
output {
elasticsearch { host => localhost }
stdout {
codec => rubydebug
}
}
~
~
~
~
~
~
~
~
~
~
~
~
~
~
:wq
新增elasticsearch配置,制定host的位置,然後重新啟動logstash [[email protected] bin]# ./logstash -f config/log4j_to_es.conf
啟動完成後,在JAVAEE專案中輸出幾條日誌,然後再在kibana中查詢一下 為了測試方便,我在javaee工程中新建了一個controller,用它來列印日誌
@Controller
@RequestMapping("test")
public class TestController {
private Logger logger = LoggerFactory.getLogger(getClass());
private static int i = 0;
@RequestMapping(value = "hello")
public ResponseEntity<?> helloWorld() {
logger.debug("[ResponseEntity]:{}", "i am debug" + i);
logger.info("[ResponseEntity] i am info" + i);
logger.error("[ResponseEntity]i am error" + i);
logger.warn("[ResponseEntity]i am warn" + i);
i++;
String responseStr = "OK";
ResponseEntity<String> responseEntity = new ResponseEntity<>(responseStr, HttpStatus.OK);
return responseEntity;
}
}
啟動測試的WEB工程後,訪問測試的controller,並在kibana中檢視下日誌OK!在kibana中也能看到了!ELK最簡單的配置就這樣完成了!