容器技術在發展到今天已是至關的成熟,但容器不一樣於虛擬機,咱們在使用容器的同時也有不少相關的技術問題須要解決,好比:容器性能監控,數據持久化,日誌監控與分析等。咱們不能像平時使用虛擬機同樣來管理容器,本文我將給你們帶來fluentd+elasticsearch+kilbana容器日誌收集方案。nginx
咱們將經過容器的fluentd日誌驅動將系統內產生的日誌發送給fluentd服務端,再過來fluentd服務端處理全部容器發送過來的日誌,再轉發到elasticsearch,最後經過kilbana來展現和分析咱們的日誌。咱們將經過如下拓撲來完成咱們的日誌收集。docker
部署elasticsearch+kilbana,此兩個組件不是本文重點介紹對象,網絡上也要不少關於這兩個組件的部署方法,由於篇幅緣由這裏就不在重複,之後可能會加更新上ELK的部署博文。另外關於Docker的安裝部署也是基本的,相信各位已經在研究容器日誌收集不會連Docker都不會部署吧,完成第一步請繼續往下看json
部署fluentd與配置tomcat
安裝主程序bash
你們請至官網下載本身所須要版本,對號入坐。我測試爲CentOS7-x86_64,因此我下載的包爲:td-agent-2.3.5-1.el7.x86_64.rpm,執行如下命令安裝:網絡
yum -y install td-agent-2.3.5-1.el7.x86_64.rpmelasticsearch
安裝elasticsearch插件ide
由於咱們須要將日誌發送到elasticsearch,因此須要安裝此插件,默認此插件沒有安裝,執行如下命令安裝:性能
/opt/td-agent/embedded/bin/gem install fluent-plugin-elasticsearch測試
咱們能夠查看安裝的插件列表:
/opt/td-agent/embedded/bin/gem list
編輯配置文件/etc/td-agent/td-agent.conf
若是存在此配置文件咱們清空文件裏面全部內容,增長以下內容:
<source> @type forward port 24224 bind 0.0.0.0 </source> <match docker.test.nginx> @type elasticsearch host 192.168.1.23 port 9200 logstash_format true logstash_prefix docker.test.nginx logstash_dateformat %Y-%m-%d flush_interval 5s type_name docker_container_log include_tag_key true </match>
啓動服務
systemctl start td-agent
確保已經監聽0.0.0.0:24224
啓動Nginx容器
啓動命令:
docker run -dit -p 8080:80 --log-driver=fluentd \ --log-opt fluentd-address=192.168.3.232:24224 \ --log-opt tag="docker.test.nginx" \ nginx
啓動命令介紹:
--log-driver:指定容器的日誌驅動,Docker默認支持不少日誌驅動,能夠查看官方文檔。
--log-opt:指定日誌驅動的選項,其中fluentd-address指定fluentd服務端的IP與端口,tag指定日誌的標籤,fluentd根據標籤來對日誌進行分類處理,每一條日誌發送到fluentd服務端的時候都會打上此標籤。
當咱們完成以上幾步那麼咱們的日誌收集就完成了一大半了,咱們的Nginx訪問日誌和錯誤日誌都已經經過fluentd驅動傳送到fluentd服務端,而後fluentd服務端又將日誌處理髮送到elasticsearch,最後咱們只須要經過kilbana,將日誌從elasticsearch取出展現及可。
若是你按個人操做方法完成的日誌收集,你不會天真的覺得就這麼簡單,錯!固然沒有這麼簡單。咱們只是簡單的完成了日誌收集與展現。fluentd收集的日誌每一條記錄都會存放在log字段中,咱們還須要對log這個字段進行json格式化處理,方便咱們對日誌進行分析,操做方法以下:
修改咱們的Nginx鏡像的日誌格式爲json格式,關於如何修改你們能夠根據本身需求,參考更多網友的方法進行修改,我這裏修改模板爲:
log_format main '{ "@timestamp": "$time_iso8601", ' '"@fields": { ' '"remote_addr": "$remote_addr", ' '"remote_user": "$remote_user", ' '"body_bytes_sent": "$body_bytes_sent", ' '"request_time": "$request_time", ' '"status": "$status", ' '"request": "$request", ' '"request_method": "$request_method", ' '"http_referrer": "$http_referer", ' '"http_x_forwarded_for": "$http_x_forwarded_for", ' '"http_user_agent": "$http_user_agent" } }';
修改咱們的fluentd服務端配置文件以下:
<source> @type forward port 24224 bind 0.0.0.0 </source> <filter docker.test.nginx> @type parser format json key_name log </filter> <match docker.test.nginx> @type elasticsearch host 192.168.1.23 port 9200 logstash_format true logstash_prefix docker.test.nginx logstash_dateformat %Y-%m-%d flush_interval 5s type_name docker_container_log include_tag_key true </match>
修改完成後記得td-agent服務
經過以上的步驟咱們也基本完成了對Nginx日誌的json處理,能夠經過咱們定義的字段經過ELK進行日誌的分析與處理。若是你的應用只有Nginx,那麼恭喜你大功告成。但若是你還有其它日誌要收集好比Tomcat,那麼問題又來了,Tomcat的訪問日誌咱們能夠和Nginx同樣進行json處理,但catalina日誌怎麼辦,catalina的錯誤日誌咱們須要進行多行合併處理,還須要進行字段進行過濾,進行分析,咱們有兩種方法進行處理,一種是讓開發把日誌直接寫成json格式,另一種就是由咱們來經過fluentd服務端轉換,因爲對fluentd研究不足,關於對tomcat容器日誌收集的方法有機會寫在後面的博文中,關於fluentd配置文件的進階也將在後面的博文中介紹