当您使用Logtail采集容器(标准容器、Kubernetes)日志时,如果采集状态异常,可以根据本文进行问题排查、运行状态检查等运维操作。
排查机器组心跳是否异常
您可以通过检查机器组心跳的状态来判断容器中的Logtail是否已正确安装。
-
查看机器组心跳状态。
登录日志服务控制台。
在Project列表区域,单击目标Project。
-
在左侧导航栏中,选择。
-
在机器组列表中,单击目标机器组。
-
在机器组配置页面,查看机器组状态并记录心跳状态为OK的节点数。
-
检查容器集群中Worker节点数。
-
连接集群。
-
执行如下命令,查看集群中Worker节点数。
kubectl get node | grep -v master系统会返回如下类似结果。
NAME STATUS ROLES AGE VERSION cn-hangzhou.i-bp17enxc2us3624wexh2 Ready <none> 238d v1.10.4 cn-hangzhou.i-bp1ad2b02jtqd1shi2ut Ready <none> 220d v1.10.4
-
-
对比心跳状态为OK的节点数是否和容器集群中Worker节点数一致。根据对比结果选择排查方式。
-
机器组中所有节点的心跳状态均为Failed。
-
如果您要采集标准Docker容器日志,请参见采集Docker容器日志(标准输出/文件),检查
${your_region_name}、${your_aliyun_user_id}、${your_machine_group_user_defined_id}是否填写正确。 -
如果您使用的是自建Kubernetes集群,请参见通过Sidecar方式采集Kubernetes容器文本日志,检查
{regionId}、{aliuid}、{access-key-id}和{access-key-secret}是否已正确填写。如果填写错误,请执行
helm del --purge alibaba-log-controller命令,删除安装包,然后重新安装。
-
-
机器组心跳状态为OK的节点数量少于集群中的Worker节点数量。
-
判断是否已使用YAML文件手动部署DaemonSet。
-
执行如下命令。如果存在返回结果,则表示您之前已使用YAML文件手动部署DaemonSet。
kubectl get po -n kube-system -l k8s-app=logtail -
根据实际值,配置${your_region_name}、${your_aliyun_user_id}、${your_machine_group_name}等参数。
-
执行如下命令,更新文件。
kubectl apply -f ./logtail-daemonset.yaml
-
-
-
Docker/LoongCollector 部署后无心跳(AliUID 配置缺失)
在 Docker 模式下部署 LoongCollector/Logtail 后,如果机器组心跳状态持续异常(无法注册),通常是由于用户标识(AliUID)配置缺失。LoongCollector/Logtail 容器需要读取阿里云账号 ID 信息才能向 SLS 注册机器组,未挂载该文件时注册无法完成。
解决步骤:
-
在宿主机上创建用户标识目录:
mkdir -p /etc/ilogtail/users/ -
在该目录下创建以阿里云账号 ID 命名的空文件(文件名即阿里云账号 ID):
touch /etc/ilogtail/users/{阿里云账号ID} -
启动 LoongCollector/Logtail 容器时,将该目录以只读方式挂载到容器内(在
docker run命令中添加如下参数):-v /etc/ilogtail/users:/etc/ilogtail/users:ro -
重启 LoongCollector/Logtail 容器。
验证:操作完成后,在 SLS 控制台进入对应机器组,查看心跳状态是否变为 OK。
Docker Swarm 集群多台服务器上报相同 IP 导致机器组识别异常
在 Docker Swarm 集群中,如果机器组中仅显示一台机器而非实际数量,通常是因为多台服务器的 Logtail 容器使用了相同的内部 IP,且配置了相同的 ALIYUN_LOGTAIL_USER_DEFINED_ID,导致 SLS 无法区分不同的服务器。
解决方法一:为每台服务器的 Logtail 容器设置唯一的 ALIYUN_LOGTAIL_USER_DEFINED_ID 环境变量,确保各服务器标识不重复,并与机器组配置中的自定义标识匹配:
-e ALIYUN_LOGTAIL_USER_DEFINED_ID={唯一标识,如 swarm-node-1}
解决方法二:设置 ALIYUN_LOGTAIL_WORKING_IP 环境变量,手动为每台服务器的 Logtail 容器指定唯一的工作 IP(例如宿主机公网 IP 或内网唯一 IP):
-e ALIYUN_LOGTAIL_WORKING_IP={宿主机唯一IP地址}
排查容器日志采集是否异常
如果您在日志服务控制台的预览或LogStore查询页面未查到日志,则说明日志服务未采集到您的容器日志。请确认容器状态,然后执行如下检查。
-
查看机器组心跳是否存在异常。具体操作,请参见排查机器组心跳是否异常。
说明如果机器组心跳正常,但仍有部分容器的日志未被采集,可能是容器实际运行的节点未加入机器组。建议执行以下步骤确认容器分布情况:
-
在所有相关服务器上执行以下命令,确认容器实际运行的节点:
docker ps -a | grep <容器名> -
对比容器所在节点 IP 与机器组中已配置的 IP 列表,确认是否存在未加入的节点。
-
如果发现容器运行在未加入机器组的服务器上,将这些服务器的 IP 添加到机器组中。
-
-
检查Logtail配置是否正确。
检查Logtail配置中的IncludeLabel、ExcludeLabel、IncludeEnv、ExcludeEnv等配置是否符合您的采集需求。
说明-
其中此处的Label为容器Label,即Docker inspect中的Label,不是Kubernetes中的Label。
-
您可以将IncludeLabel、ExcludeLabel、IncludeEnv和ExcludeEnv配置临时去除,查看是否可以正常采集到日志。如果可以,则说明是上述参数的配置存在问题。
说明以下为 Docker Label/容器名称过滤的注意事项:
-
自建 Docker 节点(非 K8s)使用旧版 Logtail 配置时,
_container_name_字段不支持通过正则表达式同时匹配多个容器名称。 -
若需同时采集多个特定容器(例如容器 a 和容器 b),建议分别为每个容器创建独立的 Logtail 配置并设置对应的 Label 白名单,然后将多个配置均绑定到同一机器组。
-
Logtail 配置中标签名称(Label Key)不能重复——相同标签名、不同值的多条规则无法被正确识别。建议改用正则表达式匹配多个值,或使用多个独立配置实现多容器采集。
-
SLS 容器元信息预览找不到 Pod 或采集不到 emptyDir 日志
在 SLS 控制台的容器元信息预览中找不到目标 Pod,或应用写入 emptyDir 的日志始终无法被采集,通常是由于 Logtail(DaemonSet 模式)无法访问容器内部的 emptyDir 临时存储。
原因:Logtail 以 DaemonSet 方式运行在宿主机上,emptyDir 是 K8s 的临时存储卷,仅存在于 Pod 内部,宿主机无法直接访问,因此 Logtail 无法读取其中的日志文件,也无法提取容器元数据。
解决方案一(推荐):修改应用,将日志输出到标准输出(stdout/stderr)。在 SLS 控制台将采集路径配置为 K8s 标准日志路径:
/logtail_host/var/log/pods/<namespace>_<pod-name>-<uid>/<container-name>/*.log
解决方案二:若必须使用文件日志,将应用的日志目录挂载方式从 emptyDir 改为 hostPath 或 PVC,确保日志持久化在宿主机可访问路径,然后将 SLS 采集路径调整为宿主机实际挂载路径,例如:
/logtail_host/var/log/your-app/*.log
Logtail 采集容器日志提示创建文件失败或权限错误
现象:Logtail 报错,提示需要在容器内创建特定的空文件,或出现权限拒绝(Permission denied)错误,导致无法正常采集日志。
解决步骤:
-
根据报错提示,在容器内手动创建指定的空文件:
touch <报错中指定的文件路径> -
设置该文件的权限为
-rw-r--r--(644):chmod 644 <报错中指定的文件路径> -
重启容器。
替代方案:如果以上步骤后仍无法采集,建议将容器日志目录挂载到宿主机,通过宿主机路径进行采集,此方案更为稳定。
采集 K8s 标准输出日志报错 parse cri docker line error
现象:日志中出现 parse cri docker line error: invalid CRI log, timestamp not found 报错,导致 K8s 标准输出(stdout)日志无法正常采集。
原因:日志行解析失败,常见原因是多行日志配置中行首正则表达式配置不正确,Logtail 无法识别 CRI 日志行格式。
解决步骤:
-
检查 Logtail 配置中的行首正则表达式,确认能正确匹配日志格式;如有必要,尝试关闭多行模式:
-
YAML 配置方式:在配置文件中注释或删除
multiline相关配置段,然后重新 apply 配置。 -
控制台方式:在 SLS 控制台的 Logtail 配置页面,关闭多行日志采集选项。
-
-
确认 K8s Namespace Regex 格式正确。若需匹配多个命名空间,各命名空间之间需使用竖线(
|)分隔,例如:namespace1|namespace2。 -
修改 YAML 配置后,执行以下命令重新应用配置使其生效:
kubectl apply -f <配置文件.yaml>
其他运维操作
登录Logtail容器
-
普通Docker
-
在宿主机上执行如下命令,查询Logtail容器。
docker ps | grep logtail系统将返回如下类似结果。
223****6e registry.cn-hangzhou.aliyuncs.com/log-service/logtail "/usr/local/ilogta..." 8 days ago Up 8 days logtail-iba -
执行如下命令,在Logtail容器内启动bash shell。
docker exec -it 223****6e bash其中,
223****6e为容器ID,请根据实际值替换。
-
-
Kubernetes
-
执行如下命令,查询Logtail的Pod。
kubectl get po -n kube-system | grep logtail系统将返回如下类似结果。
logtail-ds-****d 1/1 Running 0 8d logtail-ds-****8 1/1 Running 0 8d -
执行如下命令,登录Pod。
kubectl exec -it -n kube-system logtail-ds-****d -- bash其中,
logtail-ds-****d为Pod ID,请根据实际值替换。
-
查看Logtail的运行日志
Logtail日志存储在Logtail容器中的/usr/local/ilogtail/目录中,文件名为ilogtail.LOG和logtail_plugin.LOG。
-
登录Logtail容器。具体操作,登录Logtail容器。
-
打开/usr/local/ilogtail/目录。
cd /usr/local/ilogtail -
查看ilogtail.LOG和logtail_plugin.LOG文件。
cat ilogtail.LOG cat logtail_plugin.LOG
Logtail容器的标准输出(stdout)说明
Logtail容器中的标准输出并不具备参考意义,请忽略以下标准输出内容。
start umount useless mount points, /shm$|/merged$|/mqueue$
umount: /logtail_host/var/lib/docker/overlay2/3fd0043af174cb0273c3c7869500fbe2bdb95d13b1e110172ef57fe840c82155/merged: must be superuser to unmount
umount: /logtail_host/var/lib/docker/overlay2/d5b10aa19399992755de1f85d25009528daa749c1bf8c16edff44beab6e69718/merged: must be superuser to unmount
umount: /logtail_host/var/lib/docker/overlay2/5c3125daddacedec29df72ad0c52fac800cd56c6e880dc4e8a640b1e16c22dbe/merged: must be superuser to unmount
......
xargs: umount: exited with status 255; aborting
umount done
start logtail
ilogtail is running
logtail status:
ilogtail is running
查看Kubernetes集群中日志服务相关组件的状态
执行如下命令,查看日志服务的Deployment的状态和信息。
kubectl get deploy -n kube-system | grep -E 'alibaba-log-controller|loongcollector-operator'
返回结果:
NAME READY UP-TO-DATE AVAILABLE AGE
alibaba-log-controller 1/1 1 1 11d
执行以下命令,查看关于DaemonSet资源的状态信息。
kubectl get ds -n kube-system | grep -E 'logtail-ds|loongcollector-ds'
返回结果:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
logtail-ds 2 2 2 2 2 **ux 11d
查看Logtail的版本号、IP地址、启动时间
-
在宿主机执行如下命令,查看Logtail的版本号、IP地址、启动时间。
相关信息存储在Logtail容器的
/usr/local/ilogtail/app_info.json文件中。kubectl exec logtail-ds-****k -n kube-system cat /usr/local/ilogtail/app_info.json系统将返回如下类似结果。
{ "UUID" : "", "hostname" : "logtail-****k", "instance_id" : "0EB****_172.20.4.2_1517810940", "ip" : "172.20.4.2", "logtail_version" : "0.16.2", "os" : "Linux; 3.10.0-693.2.2.el7.x86_64; #1 SMP Tue Sep 12 22:26:13 UTC 2017; x86_64", "update_time" : "2018-02-05 06:09:01" }
ACK 集群中 Pod 日志采集异常的排查信息获取
在 ACK 集群中遇到 Pod 日志采集异常时,可以通过以下方法获取排查所需的基础信息,并在寻求技术支持时一并提供,以加快问题定位。
获取 Logtail/LoongCollector 的 IP 地址:
-
执行以下命令,查找目标节点上的 LoongCollector/Logtail Pod 名称:
kubectl get pods -n kube-system | grep loongcollector -
执行以下命令,获取 IP 地址及其他基础信息(
<pod-name>替换为上一步获取的实际 Pod 名称):kubectl exec <pod-name> -n kube-system cat /usr/local/ilogtail/app_info.json
向技术支持提供有效排查信息:寻求帮助时,请提供以下信息:
-
Project 名称
-
Logtail 采集配置名称
-
目标 Pod 名称
-
容器名称(Container Name)
误删由CRD创建的LogStore后,如何处理
如果您删除了由CRD自动创建出的LogStore,则已采集的数据无法恢复,并且针对此LogStore的CRD配置会失效,您可以选择以下方案避免日志采集异常。
-
在CRD配置中使用其他LogStore,避免使用手动误删的LogStore。
-
重启alibaba-log-controller Pod。
您可通过如下命令查找该Pod。
kubectl get po -n kube-system | grep alibaba-log-controller