1. 程式人生 > 實用技巧 >logstash 收集tomcat日誌

logstash 收集tomcat日誌

四、logstash收集tomcat日誌

在企業中,我們看到tomcat日誌遇到異常(exception)一條日誌可能是幾行或者十幾行甚至幾十行,
組成的,那麼,我們需要將多行日誌變成一行日誌,來收集
1.tomcat日誌收集方式
這裡我們有幾種方式可以實現:
1.將日誌改成Json格式
在企業中,想要將java日誌改成json格式,並沒有那麼容易。
因為將日誌改成Json格式,檢視起來會很難受,有些開發人員不希望將日誌格式改成Json的,
所以,在改日誌格式之前需要跟開發人員進行溝通,那麼將tomcat日誌格式改成Json格式也有兩種方式。
	1)開發自己更改,通過程式程式碼,或者log4j
	2)運維修改tomcat的server配置檔案
	
2.通過logstash的mutiline模組實現多行匹配
2.安裝tomcat
1)安裝java環境
2)安裝tomcat
1.上傳程式碼包
[root@web01 ~]# rz
[root@web01 ~]# ll
-rw-r--r--  1 root root  11026056 2020-12-04 18:04 apache-tomcat-9.0.30.tar.gz

2.解壓tomcat包
[root@web01 ~]# tar xf apache-tomcat-9.0.30.tar.gz

3.將安裝包移動並改名
[root@web01 ~]# mv apache-tomcat-9.0.30 /usr/local/tomcat-9.0.30

4.做軟連線
[root@web01 ~]# ln -s /usr/local/tomcat-9.0.30 /usr/local/tomcat
3)配置站點
1.寫一個測試頁面到站點目錄下的index.html檔案中
[root@web01 ~]# echo 'TEST elk' > /usr/local/tomcat/webapps/ROOT/index.html

2.啟動tomcat
[root@web01 ~]# /usr/local/tomcat/bin/startup.sh

3.檢測tomcat埠是否啟動
[root@web01 ~]# netstat -lntup|grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      12569/java
4)訪問測試
http://10.0.0.7:8080/
3.配置logstash收集tomcat日誌
1)配置
[root@web01 ~]# vim /etc/logstash/conf.d/tomcat_log_es.conf 
input {
  file {
    path => "/usr/local/tomcat/logs/localhost_access_log.*.txt"
    start_position => "end"
    type => "tomcat_log"
  }
}
output {
  elasticsearch {
    hosts => ["10.0.0.71:9200"]
    index => "tomcat_log_%{+YYYY-MM-dd}"
  }
}
2)啟動
[root@web01 ~]# logstash -f /etc/logstash/conf.d/tomcat_log_es.conf
4.收集tomcat的json格式日誌方式一:
1)修改tomcat日誌格式
[root@web01 ~]# vim /usr/local/tomcat/conf/server.xml
            <!--  註釋掉原來的日誌格式配置 -->
160         <!--Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
161                prefix="localhost_access_log" suffix=".txt"
162                pattern="%h %l %u %t &quot;%r&quot; %s %b" /-->

            <!--  新增新的日誌格式配置 -->
163         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
164                prefix="tomcat_access_json" suffix=".log"
165                pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessT    ime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot    ;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>
166 
167       </Host>
168     </Engine>
169   </Service>
170 </Server>

2)重啟Tomcat
[root@web01 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@web01 ~]# /usr/local/tomcat/bin/startup.sh
3)檢視新的日誌
[root@web01 ~]# tail -f  /usr/local/tomcat/logs/tomcat_access_json.2020-12-07.log
{"clientip":"10.0.0.1","ClientUser":"-","authenticated":"-","AccessTime":"[07/Dec/2020:22:51:25 +0800]","method":"GET / HTTP/1.1","status":"200","SendBytes":"9","Query?string":"","partner":"-","AgentVersion":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36"}
4)配置logstash收集新的日誌
[root@web01 ~]# vim /etc/logstash/conf.d/tomcat_log_es.conf 
input {
  file {
    path => "/usr/local/tomcat/logs/tomcat_access_json.*.log"
    start_position => "end"
    type => "tomcat_log"
  }
}
output {
  elasticsearch {
    hosts => ["10.0.0.71:9200"]
    index => "tomcat_json_log_%{+YYYY-MM-dd}"
  }
}
5)啟動服務
[root@web01 ~]# logstash -f /etc/logstash/conf.d/tomcat_log_es.conf
5.方式二:使用multiline外掛收集java日誌
使用codec的multiline外掛實現多行匹配,這是一個可以將多行進行合併的外掛,
而且可以使用what指定將匹配到的行與前面的行合併還是和後面的行合併
幫助文件:
      https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

因為目前tomcat日誌中沒有exception,所以,我們把Logstash部署在ES上,收集一下ES的java日誌。
1)測試多行匹配
[root@web01 ~]# vim /etc/logstash/conf.d/stdin_stdout.conf
input {
  stdin {
    codec => multiline {
      pattern => "^\["
      negate => "true"
      what => "previous"
    }
  }
}

output {
  stdout {}
}
2)啟動
[root@web01 ~]# logstash -f /etc/logstash/conf.d/stdin_stdout.conf
3)測試
#測試輸入一堆內容,並沒有列印,只有當輸入一個以 [ 開頭的時候才會結束並輸出

jhvc
jkhv
jhv
jc
[
{
       "message" => "jhvc\njkhv\njhv\njc",
    "@timestamp" => 2020-12-07T15:15:49.182Z,
      "@version" => "1",
          "tags" => [
        [0] "multiline"
    ],
          "host" => "web01"
}
4)收集java日誌寫入ES
[root@web01 ~]# cat /etc/logstash/conf.d/java_es.conf 
input {
  file {
    path => "/usr/local/tomcat/logs/tomcat_access_json.2020-12-07.log"
    start_position => "end"
    codec => multiline {
      pattern => "^\["
      negate => "true"
      what => "previous"
    }
  }
}

output {
  elasticsearch {
    hosts => ['10.0.0.71:9200']
    index => "tomcat_json_log_%{+YYYY-MM-DD}"
  }
}
5)啟動
[root@web01 ~]# logstash -f /etc/logstash/conf.d/java_es.conf &
6)測試收集日誌
[root@web01 ~]# cat tomcat.log >> /usr/local/tomcat/logs/tomcat_access_json.2020-12-07.log
7)去頁面檢視