關于容器環境下的日志收集阿里云官方文檔給出了一個方案。具體鏈接如下:
https://yq.aliyun.com/articles/303
具體來說就是通過所在容器宿主機的磁盤鏡像掛載的方式將容器內的日志路徑映射到宿主機的某一個磁盤路徑下。但這個地方有個問題就是當容器需要集群部署的情況下,有可能相同鏡像的容器實例會部署在同一臺宿主機上,這個時候有可能日志路徑就會沖突。這里以tocmat為例,默認情況下容器內的tocmat日志會記錄在/usr/local/tomcat/logs下,且生成的日志文件名默認為:xxx-yyyy-MM-dd.log,如:catalina.2018-05-11.log;host-manager.2018-05-11.log;localhost_access_log.2018-05-11.txt。所以在默認情況下就會導致兩個容器想要對同一個文件進行寫操作,導致沖突。
個人的解決思路及實現方式如下:
1.在容器啟動的時候傳入一個環境變量,該環境變量值是唯一標識的;
如果是docker 可以在創建容器里傳入一個HOSTNAME參數,如:
docker create --name tomcat_log_test1 --env HOSTNAME=host_name1 -p 8081:8080 -v /Users/xxx/docker/logs:/usr/local/tomcat/logs my-tocmat:latest
如果是K8S,則可以直接使用默認的HOSTNAME就可以了。
2.修改tomcat的啟動腳本,讀取環境變量修改日志生成的路徑,讓不同容器寫入不同路徑。
編輯catalina.sh文件
在注釋行
# Register custom URL handlers
# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
下面添加JVM運行參數:
JAVA_OPTS="$JAVA_OPTS -Dhost.name=$HOSTNAME"
編輯logging.properties文件
將${catalina.base}/logs路徑改為:${catalina.base}/logs/${host.name}
如:
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.AsyncFileHandler.level =FINE
1catalina.org.apache.juli.AsyncFileHandler.directory =${catalina.base}/logs/${host.name}
1catalina.org.apache.juli.AsyncFileHandler.prefix =catalina.
2localhost.org.apache.juli.AsyncFileHandler.level =FINE
2localhost.org.apache.juli.AsyncFileHandler.directory =${catalina.base}/logs/${host.name}
2localhost.org.apache.juli.AsyncFileHandler.prefix =localhost.
3manager.org.apache.juli.AsyncFileHandler.level =FINE
3manager.org.apache.juli.AsyncFileHandler.directory =${catalina.base}/logs/${host.name}
3manager.org.apache.juli.AsyncFileHandler.prefix =manager.
4host-manager.org.apache.juli.AsyncFileHandler.level =FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory =${catalina.base}/logs/${host.name}
4host-manager.org.apache.juli.AsyncFileHandler.prefix =host-manager.
編輯server.xml文件
將<Valve>中的directory中的logs改為:logs/{host.name}
在生成鏡像的時候將這些文件替換
RUNrm/usr/local/tomcat/bin/catalina.sh
ADD ./tomcat/catalina.sh /usr/local/tomcat/bin/
RUNrm/usr/local/tomcat/conf/logging.properties
ADD ./tomcat/logging.properties /usr/local/tomcat/conf/
RUNrm/usr/local/tomcat/conf/server.xml
ADD ./tomcat/server.xml /usr/local/tomcat/conf/
這樣就可以讓不在鏡像多實例運行在同一個宿主機下,而日志輸出不沖突了。