我们一直在用阿里云的sls业务,主要是用以采集服务端的日志为主,有几次我发现突然不能采集上传了,然后看了看日志,然后发现还是很惊人的。这个阿里云的日志服务的agen的镜像做的其实很有问题。下面我来说一下有哪些问题:
- 没有使用stdout和stderr来处理日志
先说这个吧,阿里云的agent的运行方式如下:
我们看这里的时候没有什么问题,但是我们使用docker logs进行查看的时候,就会发现一个异常:
root@bj-meishi-dev-host:~# docker logs logtail
start umount useless mount points, /shm$|/merged$|/mqueue$
umount done
start logtail
ilogtail is running
这是使用docker logs的输出的结果,我们发现并没有什么有用的信息,经过询问得知在容器里面的/usr/local/ilogtail/下面有日志。并没有使用标准输出来处理,非常的不方便使用
2. 内部使用initd管理进程
我们看下它容器里面的pid为1的进程,我们发现实际上运行了一个shell脚本,找到这个shell脚本,我们看到这个shell脚本的内容:
#!/bin/bash
echo 'start umount useless mount points, /shm$|/merged$|/mqueue$ '
cat /proc/self/mountinfo | awk '{print $5}' | grep '^/' | grep -E '/shm$|/merged$|/mqueue$|volumes/kubernetes' | grep -v '/dev/' | xargs umount -l
echo 'umount done'
if [ "$ALIYUN_LOGTAIL_CONFIG" = "" ];then
echo "no logtail config, use default config : /etc/ilogtail/conf/cn_hangzhou/ilogtail_config.json"
cp /etc/ilogtail/conf/cn_hangzhou/ilogtail_config.json /usr/local/ilogtail/ilogtail_config.json
fi
echo start logtail
/etc/init.d/ilogtaild start
echo logtail status:
/etc/init.d/ilogtaild status
exit_handle()
{
echo stop logtail
/etc/init.d/ilogtaild stop
echo stop logtail done, result $?
exit 0
}
trap 'exit_handle' SIGTERM
while true
do
sleep 3
done
这个诡异的脚本里面写了啥内容,只是用/etc/init.d的脚本去管理下进程,然后最后一句为了保持这个脚本一直在前台运行,写了一个while true,何必呢,为什么不直接把logtail程序放到前台让docker本身管理呢。
3. 程序异常没有抛出,自己程序本身内部不断尝试
更有意思的来了,如果我们docker daemon设置为live-restore: true的话,重启docker,是一定会触发logtail报错的,为什么呢,因为live-restore: true重启docker后,重建了docker.sock,原来的句柄没有释放,新的又读不到,简直是噩梦,询问了阿里工程师后给了我一个这样的答复:
![1ab913a782e340af15f0dd69f5840c8c.png](https://img-blog.csdnimg.cn/img_convert/1ab913a782e340af15f0dd69f5840c8c.png)
想想也是很搞笑的,使用容器外部的一个健康检查去检查已经running的容器,自身的检查机制不好用。
不过目前使用外部脚本也是不好用,只能是重启docker也重启logtail了,或者尝试用systemd处理下