Tomcat容器日誌收集方案fluentd+elasticsearch+kilbana

  在上一遍博文中咱們介紹了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="{&quot;client&quot;:&quot;%h&quot;,
                         &quot;client user&quot;:&quot;%l&quot;,
                         &quot;authenticated&quot;:&quot;%u&quot;,
                         &quot;access time&quot;:&quot;%t&quot;,
                         &quot;method&quot;:&quot;%r&quot;,
                         &quot;status&quot;:&quot;%s&quot;,
                         &quot;send bytes&quot;:&quot;%b&quot;,
                         &quot;Query?string&quot;:&quot;%q&quot;,
                         &quot;partner&quot;:&quot;%{Referer}i&quot;,
                         &quot;Agent version&quot;:&quot;%{User-Agent}i&quot;}"
               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的錯誤日誌多行合併處理,目前沒有找到適合的方法

.

相關文章
相關標籤/搜索