Logstash收集Tomcat集群日志的解决方案

场景描述:一个Web应用,前端设置了8个具备相同配置的Tomcat服务器,跑在Nginx反向代理后。每一个Tomcat服务器运行在一个虚拟机上,要求能对Tomcat服务器的访问日志汇总存储并提供必定的分析能力。html

须要的开源软件:Logstash和Elasticsearch。经过在各个虚拟机上安装Logstash收集Tomcat的日志数据,并存储在Elasticsearch中达到日志集中收集和分析的目的。前端

过程有两个步骤:web

1、配置Tomcat的日志存储格式。编辑Tomcat目录下server.xml,填写以下内容apache

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
	<!-- Access log processes all example.
	 Documentation at: /docs/config/valve.html
	 Note: The pattern used is equivalent to using pattern="common" -->
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  prefix="localhost_access_log." suffix=".txt"   pattern="%h %l %u %t &quot;%r&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot;" />

</Host>

directory表示访问日志存储在Tomcat的logs目录中。json

prefix表示日志文件名以localhost_access_log.开头。浏览器

suffix表示日志文件名以.txt截尾。tomcat

pattern="%h %l %u %t &quot;%r&quot; %s %b %D &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot;"

pattern这一句很是重要,用于表示日志的存储格式,通常为了方便会使用common或者combined,这两种自定义格式已经能够记录足够详细的信息,我这里使用了自定义方式。在这个pattern描述里:bash

%h表示访问来源的主机名或者IP地址;服务器

%l表示客户端的标示,一般是 -;app

%u表示获得了受权的访问者标示,一般都是 -;

%t表示日志事件的发生时间戳,用 [ 和 ] 括起来的;

&quot;%r&quot;表示用双引号&quot;括起来的访问命令和连接,好比“GET /resource/logo.png”;

%s表示HTTP状态码,如200和404等;

%b是服务器返回的数据量,以字节为单位;

%D表示服务器的响应时间,能够用于分析页面的执行效率;

&quot;%{Referer}i&quot;表示用两个双引号括起来的网址,用于告诉服务器这个访问请求是从哪一个页面连接过来的;

&quot;%{User-Agent}i&quot;表示用双引号括起来的浏览器的HTTP代理信息,能够获得客户端使用了什么浏览器内核。

2、配置Logstash

一、在每一个虚拟机上传logstash安装文件,安装logstash,以2.2.2版本为例

rpm -ivh logstash-2.2.2-1.noarch.rpm

二、建立Logstash的工做目录

mkdir /root/logstash_work_dir;mkdir /root/logstash_work_dir/config;mkdir /root/logstash_work_dir/logs;mkdir /root/logstash_work_dir/pid

其中/root/logstash_work_dir是工做目录,config目录用于存储Logstash的配置文件,logs目录用于存储Logstash的日志数据,pid目录用于存储Logstash的pid文件。

三、设置Logstash的运行脚本,修改/etc/init.d/logstash中,替换其中的代码以下

LS_WORK_DIR=/root/logstash_work_dir

name=logstash

LS_USER=root
LS_GROUP=root
LS_HOME=/var/lib/logstash
LS_HEAP_SIZE="1g"

pidfile=${LS_WORK_DIR}/pid/$name.pid
LS_LOG_DIR=${LS_WORK_DIR}/logs
LS_LOG_FILE=${LS_WORK_DIR}/logs/$name.log
LS_CONF_DIR=${LS_WORK_DIR}/config/root_tomcat.conf
LS_OPEN_FILES=16384
LS_NICE=19
LS_OPTS=""

LS_USER和LS_GROUP指定了Logstash进程运行时的用户名和组,我这里使用了root,也能够使用其余权限更低的通常用户和组。

LS_CONF_DIR=${LS_WORK_DIR}/config/root_tomcat.conf这一句最重要,指定了Logstash服务运行时的配置文件路径。

四、在/root/logstash_work_dir/config/目录中编写Logstash的配置文件root_tomcat.conf,这是本系统最重要的文件。

input {		
	file {  
		path => "/root/tomcat/logs/localhost_access_log*.txt"  
		sincedb_path => "/root/logstash_work_dir/config/sincedb_apache_access_log.txt"
		type => "apache_access_log"
		add_field => {"tomcatip" => "10.128.18.61"}
	}  
}

filter{	
	if [type] == "apache_access_log" {
		grok{
			match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{URIPATHPARAM:request}(?: HTTP/%{NUMBER:httpversion})?|-)\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{NUMBER:responsetime} \"(?:%{URI:referrer}|-)\" %{QS:agent}" }
		}				
		date{
			match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
			target => ["writetime"]
		}		
		mutate {
			convert => { 
				"response" => "integer" 
				"bytes" => "integer" 
				"responsetime" => "integer" 
			}
		}
	}
}

output {
	if [type] == "apache_access_log" {		
		elasticsearch {
			hosts => ["10.128.18.74:9200","10.128.18.75:9200","10.128.18.77:9200"]
			index => "logstash-apacheaccesslog-%{+YYYY.MM.dd}"
		}		
	}
}

Logstash的配置文件包括input、filter和output三部分。

input部分,使用了file插件。path指定了Logstash扫描的文件,每当有文件变化时,Logstash会读取文件尾部新增的数据;sincedb_path用于存储上一次文件读取的位置信息,若是这个文件不存在,则会从日志文件首部获取全部数据;type用于对这个配置插件作标识,当一个配置文件中有多个数据收集任务时尤为有用;add_field用于标识本机的ip地址,当数据存储在Elasticsearch后,用于区分来自哪个Tomcat服务器。

filter插件,使用了grok、date和mutate三个插件。

grok插件用于解析Tomcat的访问日志,logstash自带了COMBINEDAPACHELOG等多个配置模式,但因为我使用了自定义的Tomcat日志配置,这里也本身编写;

date部分用于从日志中提取时间戳信息;

mutate中用convert将response、byte和responsetime三个解析获得的字符串转化为整数integer类型,这个步骤对于后续的分析比较重要,由于这样能够在Elasticsearch中作数值比较运算,好比按照响应时间responsetime排序,找出访问最慢的请求。

output插件,使用了elasticsearch插件,其中hosts指定了Elasticsearch集群的地址,本例子中指定了三个实例;index指定了数据存储在Elasticsearch中的索引名字,以logstash做为开头是由于Logstash自带的针对ELasticsearch的mapping映射中,对于全部的字符串类型都附带设置了一个raw不作解析的设置,这样便于在Elasticsearch中作底层的文本检索。


五、设置chkconfig的启动命令

chkconfig --add logstash

六、启动Logstash服务

service logstash start
相关文章
相关标签/搜索