在上一遍博文中咱們介紹了Nginx容器訪問日誌收集的方案,咱們使用EFK的架構來完成對容器日誌內應用日誌的收集,若是不知道什麼是EFK架構,那麼請訪問如下連接獲取相關的幫助docker
Nginx容器日誌收集方案fluentd+elasticsearch+kilbanaapache
若是你已經認真閱讀了上面的連接,並撐握了其用法,那麼再來看本博文(針對於初學者),下面假設咱們已經搭建好了上一講所須要的基礎環境,咱們接下來就直接開始步入正題。json
在步入正題以前咱們首先須要確認咱們須要完成的目標與效果,一樣咱們在啓動Tomcat容器的時候使用fluentd日誌驅動,將標準輸出的日誌發送到fluentd服務端,而後經過fluentd服務端處理日誌發送至ES,最後再經過kilbana展現日誌。就這麼簡單?NO NO NO!!!經測試默認狀況下Tomcat容器(docker hub官方鏡像)內catalina的日誌會自動從stdout輸出,併發送到fluentd服務端,但access日誌不會,這是咱們第一個須要解決的技術問題,另外Tomcat的日誌默認狀況下是天天滾動生成,天天日誌名稱都不同,這是咱們須要解決的第二個問題,假設咱們解決了以上兩個問題,最後還會存在一個問題,也就是咱們輸出的日誌有兩種類型,咱們又如何經過fluentd服務端區分不一樣的日誌,併發送到ES存儲爲不一樣的Index。咱們明白了目標和技術難題下面咱們就一步一步來解決。tomcat
第一個問題解決方法(先解決第二個問題再解決第一個問題):bash
咱們能夠手工指定將access日誌輸出到/dev/stdout,因此此方法剛下載下來的鏡像沒法直接使用,咱們須要從新build該鏡像建立一個/dev/stdou的軟連接到Tomcat的access日誌文件路徑。架構
ln -s /dev/stdout /usr/local/tomcat/logs/localhost_access_log.txt
第二個問題解決方法:併發
默認docker hub官方的tomcat鏡像的日誌是天天滾動生成的,因此咱們須要從新build該鏡像,關閉日誌的滾動生成elasticsearch
關閉catalina日誌的滾動生成ide
編輯容器內配置文件:/usr/local/tomcat/conf/logging.properties測試
#下面這一行是已經存在的一行,用來定義文件的前綴 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. #下面兩行是須要加入的內容,分別爲定義文件的後綴和關閉日誌輪替,最終日誌名稱爲catalina.out 1catalina.org.apache.juli.AsyncFileHandler.suffix = out 1catalina.org.apache.juli.AsyncFileHandler.rotatable = False
關閉access日誌的滾生成
編輯配置文件:/usr/local/tomcat/conf/server.xml
#配置中rotatable="false"是咱們加入的內容,而pattern裏面的內容是咱們須要修改成的內容,用來將訪問日誌轉換爲json格式用來關閉日誌的輪替,最終日誌名稱爲localhost_access_log.txt <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="{"client":"%h", "client user":"%l", "authenticated":"%u", "access time":"%t", "method":"%r", "status":"%s", "send bytes":"%b", "Query?string":"%q", "partner":"%{Referer}i", "Agent version":"%{User-Agent}i"}" rotatable="false" />
第三個問題解決方法:
這裏咱們能夠採用經過fluentd服務端對收集過來的日誌再進行過濾,分類從新打標籤,最後再發送到ES存爲不一樣的Index,修改fluentd服務端配置文件以下:
#若是沒有rewrite-tag-filter插件請安裝gem install fluent-plugin-rewrite-tag-filter <source> @type forward port 24224 bind 0.0.0.0 </source> #下面根據tomcat.test.docker標籤進行過濾,由於裏面有兩種日誌輸出,分別爲access和catalina <match tomcat.test.docker> @type copy <store> @type rewrite_tag_filter #這裏是匹配咱們的catalina日誌,根據log字段用正則匹配,這裏須要根據本身字段進行修改正則 rewriterule1 log ^\d.*$ catalina.${tag} </store> <store> @type rewrite_tag_filter #由於咱們的訪問日誌轉換爲了json,因此開頭必定爲{,這裏根據正則匹配,匹配到後從新打tag rewriterule1 log ^{.*$ access.${tag} </store> </match> #對訪問日誌作json轉換,**表明任何字符 <filter access.**> @type parser format json key_name log </filter> #將訪問日誌輸出到ES,索引名爲tomcat.test.docker.access <match access.**> @type elasticsearch host 192.168.1.23 port 9200 logstash_format true logstash_prefix tomcat.test.docker.access logstash_dateformat %Y-%m-%d flush_interval 5s type_name docker_container_log include_tag_key true </match> #將catalina日誌輸出到ES,索引名爲tomcat.test.docker.catalina <match catalina.**> @type elasticsearch host 192.168.1.23 port 9200 logstash_format true logstash_prefix tomcat.test.docker.catalina logstash_dateformat %Y-%m-%d flush_interval 5s type_name docker_container_log include_tag_key true </match>
完成以上配置之後咱們只要啓動咱們的fluentd服務端服務和Tomcat容器,並訪問下咱們的Tomcat站點,這時候就能夠在ES中查看到咱們所須要的Index了
systemctl start td-agent docker run -dit -p 80:8080 --log-driver=fluentd --log-opt fluentd-address=192.168.3.232:24224 --log-opt tag="tomcat.test.docker" tomcat
上面須要注意tag,須要和fluentd服務端配置文件裏面接收的tag同樣
最後還有一個技術問題,一直沒有解決,須要你們獨立思考,若是有好的解決方案能夠在博文中留言,若是後續我解決了,會及時更新此博文。問題就是catalina的錯誤日誌多行合併處理,目前沒有找到適合的方法
.