Docker應用容器日誌資訊收集
Docker應用容器銷燬不管人為操作,還是容器掛掉甚至容器應用導致其崩潰,它執行的資料都會隨著它的生命週期結束而結束,這種情況是非常適合部署無狀態服務。卻不適合有狀態的應用部署。 但問題來了,假如運維同事需要對容器應用發生的故障進行下一步分析,而在容器中這分部有狀態的應用日誌也會隨著容器銷燬而銷燬。日誌都丟了還談分析故障。然而 在大的容器叢集環境下如果直接將容器應用日誌持久化儲存目錄裡面那樣日誌會出現目錄結構臨亂和日誌檔案覆蓋問題。因此接下來要跟大家介紹我們如何對容器中的應用日誌進行自動統一採集到日誌伺服器。
1)將容器中的單個或多個業務應用日誌檔案按照一定目錄結構統一採集到遠端日誌伺服器進行集中管理。
2)儲存日誌的目錄結構形式需要以下方式儲存:
/logs/app_id/service_id/host_name/app_name/xxx.log
-
Filebeat 是一個日誌檔案託運工具,在你的伺服器上安裝客戶端後, filebeat 會監控日誌目錄或者指定的日誌檔案,追蹤讀取這些檔案(追蹤檔案的變化,不停的讀),並且轉發這些資訊到l ogstarsh 中存放
-
Logstash是一款輕量級的日誌蒐集處理框架,可以方便的把分散的、多樣化的日誌蒐集起來,並進行自定義的處理,然後傳輸到指定的位置。
申請
伺服器部署logstash日誌服務端,此伺服器的要求是要有充足的儲存來存放容器應用日誌。
指標名稱 |
值 |
系統 |
Centos7.0 X86_64 以上 |
CPU |
4核 |
記憶體 |
16G |
儲存 |
外部儲存500G以上 |
Logstash軟體對JDK也是有要求的,建議在JDK1.8.0以上版本來執行logstash軟體。
-
4.1 JDK軟體安裝
直接去oracle官方下載JDK版本1.8軟體來安裝
tar xvf jdk1.8.0_131.tar.gz–C /usr
然後配置JDK環境變數vi /etc/profile
JAVA_HOME=/usr/jdk1.8.0_131
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOMECLASSPATH PATH
用命令source/etc/profile生效環境變數
-
4.2 JDK軟體安裝
軟體下載
軟體安裝
執行命令tar-xvf /opt/ logstash-6.0.0.tar.gz 解壓logstash
啟動logstash
/opt/logstash/bin/logstash -f /opt/logstash/logstash.conf
在日誌伺服器上新建一個/logs目錄用於儲存大量應用容器日誌
直接將filebeat軟體和nginx,php-fpm軟體聯合一起封裝成一個新的基礎映象,事先我們需要知道哪此應用日誌檔案需要提取出來。注意以下是需要提取容器中的應用日誌:
Nginx日誌容器路徑
/var/log/nginx
Php-fpm日誌視窗路徑:
/var/opt/remi/php70/log/php-fpm
下載filebeat軟體
wget
-
5.1 採用dockerfile指令碼安裝nginx,php-fpm, Filebeat軟體
以上紅色字型部署就是規範 nginx 與 php-fpm 應用日誌,並將日誌檔案對映到 /logs 目錄下。同時安裝 filebeat 軟體。
FROM centos MAINTAINER jaymarco@shsnc.com #Install system library RUN rpm -ivh && rpm -ivh && \ yum install -y php70-php-gd.x86_64 php70-php-mcrypt.x86_64 php70-php-fpm.x86_64 php70-php-pecl-redis.x86_64 python-setuptools \ php70-php-mbstring.x86_64 php70-php-snmp.x86_64 php70-php-pecl-zip.x86_64 php70-php-xml.x86_64 \ php70-php-mysqlnd.x86_64 php70-php-pecl-mysql.x86_64 gcc gcc-c++ automake libtool make cmake openssl openssl-devel pcre-devel && \ yum clean all #Make install nginx RUN rpm -ivh COPY nginx.conf /etc/nginx/nginx.conf #set php config RUN sed -e 's/127.0.0.1:9000/9000/' \ -e '/allowed_clients/d' \ -e '/catch_workers_output/s/^;//' \ -e '/error_log/d' \ -e 's/;listen.backlog = 511/listen.backlog = 1024/' \ -e 's/pm.max_children = 50/pm.max_children = 300/' \ -e 's/pm.start_servers = 5/pm.start_servers = 30/' \ -e 's/pm.min_spare_servers = 5/pm.min_spare_servers = 30/' \ -e 's/pm.max_spare_servers = 35/pm.max_spare_servers = 60/' \ -e 's/;pm.max_requests = 500/pm.max_requests = 10240/' \ -e 's/;request_slowlog_timeout = 0/request_slowlog_timeout = 2/' \ -e 's/;request_terminate_timeout = 0/request_terminate_timeout = 20/' \ -e 's/;rlimit_files = 1024/rlimit_files = 65535/' \ -i /etc/opt/remi/php70/php-fpm.d/ && \ sed -e 's/max_execution_time = 30/max_execution_time = 150/' \ -e 's/max_input_time = 60/max_input_time = 300/' \ -i /etc/opt/remi/php70/php.ini && \ sed -e 's/daemonize = yes/daemonize = no/' \ -e 's/;rlimit_files = 1024/rlimit_files = 65535/' -i /etc/opt/remi/php70/php-fpm.conf && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ echo 'Asia/Shanghai' >/etc/timezone RUN easy_install supervisor && \ mkdir -p /var/log/supervisor && \ mkdir -p /var/run/sshd && \ mkdir -p /var/run/supervisord #Add supervisord conf ADD supervisord.conf /etc/supervisord.conf #copy start script ADD startserv.sh /startserv.sh RUN chmod +x /startserv.sh #Set port EXPOSE 9000
# For collecting logs, install filebeat plugin RUN mkdir /logs RUN ln -s /var/log/nginx /logs/ RUN ln -s /var/opt/remi/php70/log/php-fpm /logs ADD filebeat-6.0.0-linux-x86_64.tar.gz /var/log/ RUN chmod +x /var/log/filebeat/filebeat
#Start web server #ENTRYPOINT ["/var/log/filebeat/init.sh"] CMD ["/startserv.sh"] |
-
5.2 supervisord.conf 配置引數
容器中只能執行一個程式,執行多程式如果需要執行多個程式我們使用了supervisord後臺管理程式工具,方便多程式啟動監控。以上紅色字型加入了filebeat啟動命令。
[unix_http_server] file=/tmp/supervisor.sock ; (the path to the socket file) [supervisord] logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=true ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) user=root ; ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket [program:php-fpm] command=/opt/remi/php70/root/usr/sbin/php-fpm -F [program:nginx] command=/usr/sbin/nginx -c /etc/nginx/nginx.conf [program:filebeat] command=/var/log/filebeat/filebeat -c /var/log/filebeat/filebeat.yml |
-
5.3 服務啟動指令碼startserv.sh
以上紅色字型部分的內容主要是為了生成一個filebeat.yml檔案,讓filebeat程式載入對應的app_id,service_id,host_name,logstash等引數值,並將服務接起來。
#!/bin/sh ip=`ip a|grep -w inet|grep -v -w lo|awk '{print $2}'|awk -F'/' '{print $1}'` LOGS="/logs/" #FILE=`ls -l $LOGS |awk '/^d/ {print $NF}'` FILE=`ls $LOGS` HOME="/var/log/filebeat" BAK="$HOME/bak" CONF="$HOME/filebeat.yml" HOST_NAME=`hostname` cp $BAK $CONF for name in $FILE do sed -i "/paths/a\ - $LOGS$name/*.log" $CONF done sed -i "s/#APP_ID#/$APP_ID/g" $CONF sed -i "s/#ip#/$ip/g" $CONF sed -i "s/#SERVICE_ID#/$SERVICE_ID/g" $CONF sed -i "s/#HOST_NAME#/$HOST_NAME/g" $CONF sed -i "s/#LOGSTASH_HOST#/$LOGSTASH_HOST/g" $CONF /usr/bin/supervisord -n -c /etc/supervisord.conf |
生成filebeat.yml檔案例子:
filebeat: spool_size: 10240 idle_timeout: "10s" prospectors: - paths: - /logs/php-fpm/*.log - /logs/nginx/*.log fields: app_id: "6db116df" service_id: "_6db116df_64a00233" host_name: "139b3e343614" fields_under_root: true tail_files: true document_type: "172.17.0.2" processors: - drop_fields: fields: ["input_type", "beat", "offset"] output.logstash: hosts: ["XX.XX.XX.XX:5044"] worker: 2 |
-
5.4 啟動 應用容器
docker run -itd -p 80:80 -e APP_ID=6db116df -e SERVICE_ID=_6db116df_64a00233 -e LOGSTASH_HOST=<日誌伺服器IP> XX.XX.XX.XX/zjhtproj/acitivty_front:6.0-201711221420
容器應用啟動後,容器中的應用日誌就會透過filebeat自動每隔30秒同步到 logstash日誌伺服器上面。接下來看一下這兩個外掛的日誌。
其中一個容器中的filebeat日誌資訊
日誌伺服器日誌目錄解析:
日誌伺服器logstash 接收日誌:
有需要的朋友可以關注我的公眾號,文章每日一更
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2723075/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於Docker應用容器日誌檔案收集Docker
- Flume+Kafka收集Docker容器內分散式日誌應用實踐KafkaDocker分散式
- 利用ELK搭建Docker容器化應用日誌中心Docker應用日誌
- 容器引擎Docker和容器編排kubernetes如何優雅的收集容器日誌Docker
- Docker 容器日誌分析Docker
- ELK+logspout收集Docker日誌Docker
- docker 容器日誌清理方案Docker
- k8s容器日誌收集方案K8S
- docker檢視容器日誌命令Docker
- 通過helm部署EFK收集應用日誌,ingress-nginx日誌解析。應用日誌Nginx
- 一套標準的ASP.NET Core容器化應用日誌收集分析方案ASP.NET應用日誌
- Docker容器日誌管理最佳實踐Docker
- Docker Compose部署 EFK(Elasticsearch + Fluentd + Kibana)收集日誌DockerElasticsearch
- ABP 使用ElasticSearch、Kibana、Docker 進行日誌收集ElasticsearchDocker
- 系統日誌及資料庫相關資訊收集資料庫
- 應用容器引擎-DockerDocker
- Amazon Kinesis Data Streams 實現跨賬戶應用日誌收集應用日誌
- K8S 使用 SideCar 模式部署 Filebeat 收集容器日誌K8SIDE模式
- 在Docker中,很多應用容器都是預設後臺執行的,怎麼檢視它們的輸出和日誌資訊?Docker
- Vector + ClickHouse 收集日誌
- rac日誌收集方法
- logstash收集springboot日誌Spring Boot
- Docker Compose 多容器應用Docker
- 大資料01-Flume 日誌收集大資料
- Docker筆記(十三):容器日誌採集實踐Docker筆記
- 如何訪問Docker容器中的Spring Boot日誌DockerSpring Boot
- SpringBoot使用ELK日誌收集Spring Boot
- Linux-ELK日誌收集Linux
- 使用Kafka做日誌收集Kafka
- 關於k8s叢集容器日誌收集的總結K8S
- Docker容器化部署Python應用DockerPython
- Docker容器與虛擬化技術:OpenEuler 部署 docker容器應用Docker
- 通過 Systemd Journal 收集日誌
- (四)Logstash收集、解析日誌方法
- TFA-收集日誌及分析
- docker日誌引擎Docker
- 檢視Docker容器的資訊Docker
- Springboot通過攔截器攔截請求資訊收集到日誌Spring Boot