由於咱們如今須要用Logstash收集tomcat日誌,因此咱們暫時將tomcat安裝到Logstash所在機器,也就是db03:10.0.0.53這臺機器,收集tomcat訪問日誌以及tomcat錯誤日誌進行實時統計,在企業中,tomcat機器確定不是單臺,而是一個集羣的形式,那麼咱們每臺tomcat上都須要安裝一個Logstash,而後將收集到的日誌輸出給Elasticsearch進行分析。php
將tomcat日誌改爲json格式 |
在企業中,咱們看到tomcat日誌遇到異常(exception)一條日誌多是幾行或者十幾行甚至幾十行,組成的,那麼,咱們須要將多行日誌變成一行日誌,來收集。html
這裏咱們有幾種方式能夠實現:
1.將日誌改爲Json格式
在企業中,想要將java日誌改爲json格式,並無那麼容易。
格式不是你想改,想改就能改,讓我掙開,讓我明白,放手你的愛~~~~
由於將日誌改爲Json格式,查看起來會很難受,有些開發人員不但願將日誌格式改爲Json的,因此,在改日誌格式以前須要跟開發人員進行溝通,那麼將tomcat日誌格式改爲Json格式也有兩種方式。
1)開發本身更改,經過程序代碼,或者log4j
2)運維修改tomcat的server配置文件java
#編輯tomcat配置文件 [root@elkstack03 ~]# vim conf/server.xml <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="tomcat_access_log" suffix=".log" pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
2.經過Logstash其餘模塊來收集例:multiline多行匹配linux
如下是tomcat日誌文件中exception展現web
apache
安裝tomcat |
安裝JDK環境json
下載地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlvim
#解壓JDK安裝包 [root@elkstack03 ~]# tar xf jdk-8u121-linux-x64.tar.gz #將JDK安裝包移動到安裝目錄下 [root@elkstack03 ~]# mv jdk1.8.0_121 /usr/local/ #作軟連接(方便往後升級) [root@elkstack03 ~]# ln -s /usr/local/jdk1.8.0_121 /usr/local/jdk1.8 #添加環境變量 [root@elkstack03 ~]# vim /etc/profile.d/jdk1.8.sh export JAVA_HOME=/usr/local/jdk1.8 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #加載環境變量 [root@elkstack03 ~]# source /etc/profile #檢查是否加載成功 [root@elkstack03 ~]# java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
安裝tomcat瀏覽器
#解壓tomcat安裝包 [root@elkstack03 ~]# tar xf apache-tomcat-8.0.38.tar.gz #將安裝包移動到安裝路徑並更名 [root@elkstack03 ~]# mv apache-tomcat-8.0.38 /usr/local/tomcat-8.0.38 #作軟連接 [root@elkstack03 ~]# ln -s /usr/local/tomcat-8.0.38 /usr/local/tomcat #進入tomcat站點目錄 [root@elkstack03 ~]# cd /usr/local/tomcat/webapps/ #建立新項目目錄 [root@elkstack03 webapps]# mkdir webdir #寫一個測試頁面到站點目錄下的index.html文件中 [root@elkstack03 webapps]# echo 'zls tomcat page' > webdir/index.html #進入tomcat程序目錄 [root@elkstack03 webapps]# cd /usr/local/tomcat/bin/ #啓動tomcat [root@elkstack03 bin]# ./catalina.sh start #檢測tomcat端口是否啓動 [root@elkstack03 bin]# netstat -lntup|grep 8080 tcp 0 0 :::8080 :::* LISTEN 12569/java
啓動成功後,打開瀏覽器,訪問:http://10.0.0.53:8080/webdir/tomcat

修改tomcat日誌格式 |
#進入tomcat配置文件目錄 [root@elkstack03 ~]# cd /usr/local/tomcat/conf #編輯server配置文件 [root@elkstack03 conf]# vim server.xml #在138行,添加以下內容 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="tomcat_access_log" suffix=".log" pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/> #進入tomcat程序目錄 [root@elkstack03 conf]# cd /usr/local/tomcat/bin/ #中止tomcat [root@elkstack03 bin]# ./catalina.sh stop #啓動tomcat [root@elkstack03 bin]# ./catalina.sh start #進入tomcat日誌目錄 [root@elkstack03 bin]# cd /usr/local/tomcat/logs/ #查看新生成的tomcat日誌 [root@elkstack03 logs]# ll 總用量 40 -rw-r--r-- 1 root root 14601 3月 31 10:10 tomcat_access_log.2019-03-31.log #實時跟進日誌 [root@elkstack03 logs]# tail -f tomcat_access_log.2019-03-31.log
打開瀏覽器,訪問:http://10.0.0.53:8080/webdir/


驗證Json格式 |
複製一條日誌,打開瀏覽器,訪問:http://www.kjson.com/


配置Logstash收集tomcat日誌輸出到ES中 |
#進入Logstash配置文件目錄 [root@elkstack03 logs]# cd /etc/logstash/conf.d/ #編輯Logstash配置文件 [root@elkstack03 conf.d]# vim tomcat_es.conf #輸入插件 input { #文件模塊 file { #文件路徑 path => "/usr/local/tomcat/logs/tomcat_access_log.2019-03-31.log" #從結束位置點開始收集 start_position => "end" #日誌類型 type => "tomct_access_log" } } #輸出插件 output { #ES模塊 elasticsearch { #主機信息 hosts => ["10.0.0.51:9200"] #索引名稱,也就是日誌名稱 index => "tomcat_access-%{+YYYY.MM.dd}" #輸出成json格式 codec => "json" } } #啓動Logstash [root@elkstack03 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/tomcat_es.conf &
啓動成功,以下圖所示:
打開瀏覽器,訪問:http://10.0.0.51:9100/ 查看是否生成日誌,若是沒有,則訪問tomcat頁面。

使用multiline插件收集java日誌 |
使用codec的multiline插件實現多行匹配,這是一個能夠將多行進行合併的插件,並且可使用what指定將匹配到的行與前面的行合併仍是和後面的行合併,https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html
由於目前tomcat日誌中沒有exception,因此,咱們把Logstash部署在ES上,收集一下ES的java日誌。
安裝JDK環境
下載地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
#解壓JDK安裝包 [root@elkstack01 ~]# tar xf jdk-8u121-linux-x64.tar.gz #將JDK安裝包移動到安裝目錄下 [root@elkstack01 ~]# mv jdk1.8.0_121 /usr/local/ #作軟連接(方便往後升級) [root@elkstack01 ~]# ln -s /usr/local/jdk1.8.0_121 /usr/local/jdk1.8 #添加環境變量 [root@elkstack01 ~]# vim /etc/profile.d/jdk1.8.sh export JAVA_HOME=/usr/local/jdk1.8 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #加載環境變量 [root@elkstack01 ~]# source /etc/profile #檢查是否加載成功 [root@elkstack01 ~]# java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
安裝Logstash
下載地址: https://www.elastic.co/downloads/past-releases/logstash-5-3-0
#安裝Logstash使用yum localinstall 自動安裝依賴包 [root@elkstack03 ~]# yum localinstall -y logstash-5.3.0.rpm #給Logstash目錄受權 [root@elkstack03 ~]# chown -R logstash.logstash /usr/share/logstash/
測試標準輸入標準輸出多行匹配 |
#編輯Logstash配置文件 [root@elkstack03 ~]# vim /etc/logstash/conf.d/java.conf input { stdin { codec => multiline { #當遇到[開頭的行時候將多行進行合併 pattern => "^\[" #true爲匹配成功進行操做,false爲不成功進行操做 negate => true #與上面的行合併,若是是下面的行合併就是next what => "previous" }} } output { stdout { codec => rubydebug } } #測試多行匹配數據 [root@elkstack01 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/java.conf

測試將日誌寫入到文件中 |
[root@elkstack01 ~]# vim /etc/logstash/conf.d/eslog_file.conf input { file { path => "/data/elk/logs/elk-cluster.log" type => "es-log" start_position => "beginning" codec => multiline { pattern => "^\[" negate => true what => "previous" }} } output { file { path => "/tmp/es_log.txt" } } #啓動Logstash [root@elkstack01 conf.d]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/eslog_file.conf &

將結果輸出到ES中 |
#編寫Logstash配置文件 [root@elkstack01 ~]# vim /etc/logstash/conf.d/eslog_es.conf input { file { path => "/data/elk/logs/elk-cluster.log" type => "es-log" start_position => "beginning" codec => multiline { pattern => "^\[" negate => true what => "previous" }} } output { elasticsearch { hosts => ["10.0.0.51:9200"] index => "es_log_%{+YYYY.MM.dd}" } } #啓動Logstash [root@elkstack01 ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/eslog_es.conf &
打開瀏覽器,訪問:http://10.0.0.51:9100/