由于咱们如今须要用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/