我们知道容器服务 swarm,每个集群节点都自动安装了一个acslogging 应用,方便我们收集容器内的日志信息,但是当我们要收集主机ecs上日志有怎么做了?
比如说收集ecs主机 /var/log/auth.log /var/log/message 这类信息,应该怎么解决
在ecs上手动在安装一次logtail ,在日志服务里面配置对应的收集目录
结果: 我们确实可以收集到 文件里面的日志,但是我们发现一个问题,我们容器日志里面出现所有的日志收集了二次
分析: 具体原因是因为相当于ecs 安装了二个 logtail ,外部的logtail 读取了日志服务的配置,包含那些容器收集日志的配置 ,内部容器的acslog 本身有容器应用配置,这样就导致 容器内的日志传输了二次,这显然不是我们想要的。
解决方法:
我们发现 容器内日志上传的方式是 ,把容器内日志映射到主机 /acs/log 下面 ,日志服务实际就是收集这些 /acs/log 下的日志,按照这个思路,我们可以 本机ECS不要安装 ilogtail ,把需要收集的文件 放置到 /acs/log 下就OK了 ,于是就有下面这些解决办法
软连接 ln -s /var/log /acs/log/varlog/log
结果: 失败,进入容器内部发现 它软连接了 acslogging 这个容器 内的 /var/log , 根本不是 ecs主机的 /var/log
硬连接 ln /var/log/auth.log /acs/log/varlog/auth.log
结果:可以收集,但是一旦文件 轮转了 ,auth.log 就不变了,导致后面的auth.log 收集不到
复制-同步
为了方便,我们新建一个镜像来做这件事情
Dockerfile
FROM ubuntu:16.04
ENV TZ=Asia/Shanghai
RUN apt-get update && \
apt-get -y install rsync
COPY start.sh /start.sh
CMD ["/bin/bash", "/start.sh"]
start.sh
#!/bin/bash
folder="/host/acs/log/varlog"
if [ ! -x ${folder} ]
then
mkdir -p ${folder}
fi
while true;do
sleep 10;
rsync -rtopg /host/var/log/ /host/acs/log/varlog/
done;
这个镜像部署时,需要映射 主机 / 到容器 /host
这个镜像的主要作用就是 把主机需要收集日志目录 同步到 /acs/log 下
这样我们在日志服务中 配置收集 /acs/log/varlog/ 下就可以收集到日志了
网友评论