集群环境下容器内日志收集方案问题解决

关于容器环境下的日志收集阿里云官方文档给出了一个方案。具体链接如下:

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文件

中的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/

这样就可以让不在镜像多实例运行在同一个宿主机下,而日志输出不冲突了。

你可能感兴趣的:(集群环境下容器内日志收集方案问题解决)