當您使用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地址}
排查容器日誌採集是否異常
如果您在Log Service控制台的預覽或LogStore查詢頁面未查到日誌,則說明Log Service未採集到您的容器日誌。請確認容器狀態,然後執行如下檢查。
-
查看機器組心跳是否存在異常。具體操作,請參見排查機器組心跳是否異常。
說明如果機器組心跳正常,但仍有部分容器的日誌未被採集,可能是容器實際啟動並執行節點未加入機器組。建議執行以下步驟確認容器分布情況:
-
在所有相關伺服器上執行以下命令,確認容器實際啟動並執行節點:
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_欄位不支援通過Regex同時匹配多個容器名稱。 -
若需同時採集多個特定容器(例如容器 a 和容器 b),建議分別為每個容器建立獨立的 Logtail 配置並設定對應的 Label 白名單,然後將多個配置均綁定到同一機器組。
-
Logtail 配置中標籤名稱(Label Key)不能重複——相同標籤名、不同值的多條規則無法被正確識別。建議改用Regex匹配多個值,或使用多個獨立配置實現多容器採集。
-
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)日誌無法正常採集。
原因:日誌行解析失敗,常見原因是多行日誌配置中行首Regex配置不正確,Logtail 無法識別 CRI 日誌行格式。
解決步驟:
-
檢查 Logtail 配置中的行首Regex,確認能正確匹配日誌格式;如有必要,嘗試關閉多行模式:
-
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叢集中Log Service相關組件的狀態
執行如下命令,查看Log Service的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