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
相關文章
相關標籤/搜索