場景描述:一個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 "%r" %s %b %D "%{Referer}i" "%{User-Agent}i"" /> </Host>
directory表示訪問日誌存儲在Tomcat的logs目錄中。json
prefix表示日誌文件名以localhost_access_log.開頭。瀏覽器
suffix表示日誌文件名以.txt截尾。tomcat
pattern="%h %l %u %t "%r" %s %b %D "%{Referer}i" "%{User-Agent}i""
pattern這一句很是重要,用於表示日誌的存儲格式,通常爲了方便會使用common或者combined,這兩種自定義格式已經能夠記錄足夠詳細的信息,我這裏使用了自定義方式。在這個pattern描述裏:bash
%h表示訪問來源的主機名或者IP地址;服務器
%l表示客戶端的標示,一般是 -;app
%u表示獲得了受權的訪問者標示,一般都是 -;
%t表示日誌事件的發生時間戳,用 [ 和 ] 括起來的;
"%r"表示用雙引號"括起來的訪問命令和連接,好比「GET /resource/logo.png」;
%s表示HTTP狀態碼,如200和404等;
%b是服務器返回的數據量,以字節爲單位;
%D表示服務器的響應時間,能夠用於分析頁面的執行效率;
"%{Referer}i"表示用兩個雙引號括起來的網址,用於告訴服務器這個訪問請求是從哪一個頁面連接過來的;
"%{User-Agent}i"表示用雙引號括起來的瀏覽器的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