本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
本文介紹如何通過控制臺創建iLogtail采集配置,并以DaemonSet采集方式采集容器標準輸出。
前提條件
- 已安裝Logtail組件。具體操作,請參見安裝Logtail組件(阿里云Kubernetes集群)。
- 在您安裝Logtail組件時所使用的Project中已完成Logstore創建。具體操作,請參見創建Logstore。
- 目標容器持續產生日志。重要 Logtail只采集增量日志。如果下發Logtail配置后,日志文件無更新,則Logtail不會采集該文件中的日志。更多信息,請參見讀取日志。
功能特點
Logtail支持采集容器內產生的標準輸出,并附加容器的相關元數據信息一起上傳到日志服務。Logtail具備以下功能特點。
支持采集標準輸出信息(stdout)和標準出錯信息(stderr)。
支持通過容器Label白名單指定待采集的容器。
支持通過容器Label黑名單排除不要采集的容器。
支持通過環境變量白名單指定待采集的容器。
支持通過環境變量黑名單排除不要采集的容器。
支持采集多行日志(例如Java Stack日志)。
支持上報容器日志時自動關聯Meta信息(例如容器名、鏡像、Pod、Namespace、環境變量等)。
當容器運行于Kubernetes時,Logtail還具有以下功能。
支持通過Kubernetes Namespace名稱、Pod名稱、容器名稱指定待采集的容器。
支持通過Kubernetes Label白名單指定待采集的容器。
支持通過Kubernetes Label黑名單排除不要采集的容器。
支持上報容器日志時自動關聯Kubernetes Label信息。
實現原理
Logtail與Docker的Domain Socket進行通信,查詢該Docker上運行的所有容器,并根據容器中的Label和環境變量定位需要被采集的容器。Logtail通過docker logs
命令獲取指定容器日志。
Logtail在采集容器的標準輸出時,會定期將采集的點位信息保存到checkpoint文件中。如果Logtail停止后再次啟動,會從上一次保存的點位開始采集。
使用限制
此功能目前僅支持Linux操作系統,依賴Logtail 0.16.0及以上版本。版本查看與升級,請參見安裝Logtail(Linux系統)。
Logtail支持Docker和Containerd兩種容器引擎的數據采集,訪問路徑說明如下:
Docker:Logtail通過/run/docker.sock訪問Docker,請確保該路徑存在且具備訪問權限。
Containerd:Logtail通過/run/containerd/containerd.sock訪問Containerd,請確保該路徑存在且具備訪問權限。
多行日志限制:為保證多行組成的一條日志不因為輸出延遲而被分割成多條,多行日志情況下,采集的最后一條日志默認都會緩存一段時間。默認緩存時間為3秒,可通過
BeginLineTimeoutMs
參數修改,但此值不能低于1000(毫秒),否則容易出現誤判。采集停止策略:當容器被停止后,Logtail監聽到容器
die
的事件后會停止采集該容器的標準輸出。如果此時采集出現延遲,則可能丟失停止前的部分輸出。Docker容器引擎限制:目前標準輸出采集僅支持JSON類型的日志驅動。
上下文限制:默認同一Logtail配置下的所有容器的標準輸出處于同一上下文中,即無法使用控制臺的上下文查詢及Livetail功能直接查看某一容器標準輸出的上下文。如果需要使用這些功能,請添加日志上下文聚合插件。更多信息,請參見aggregators配置。
數據處理:采集到的數據默認保存在
content
字段中。Logtail對于采集到的容器標準輸出,支持數據處理。更多信息,請參見使用Logtail插件處理數據。
創建Logtail采集配置
表單配置方式
登錄日志服務控制臺,在快速接入數據區域,單擊Kubernetes-標準輸出,按照配置向導操作
在Logtail設置步驟中,完成如下配置。
重要參數說明如下:
配置項 | 說明 |
配置名稱 | Logtail配置名稱,在其所屬Project內必須唯一。創建Logtail配置成功后,無法修改其名稱。 |
高級參數 | 其它可選的與配置全局相關的高級功能參數,請參見創建Logtail流水線配置。 |
配置項 | 說明 |
多行模式 | Logtail通過行首正則表達式去匹配一條日志的行首,如果匹配成功,則將該行作為一條新的日志,否則將此行拼接到上一條日志。 行首匹配的長度,默認值為10240字節。 如果行首匹配的正則表達式在前N個字節即可體現,推薦設置此參數,提升行首匹配效率。 行首匹配的超時時間,默認值為3000毫秒。 如果3000毫秒內沒有出現新日志,則結束匹配,將最后一條日志上傳到日志服務。 說明 如果日志為多行日志,請使用該選項。 |
處理模式 | 處理插件支持拓展插件。有關處理插件的更多信息,請參見處理插件概述。 |
CRD-AliyunPipelineConfig(推薦)
如果使用AliyunPipelineConfig,需要日志組件版本最低為0.5.1。
您只需要創建AliyunPipelineConfig CR即可創建iLogtail采集配置。創建完成后,系統自動應用該iLogtail采集配置。
執行如下命令創建一個YAML文件。
cube.yaml
為文件名,請根據實際情況替換。vim cube.yaml
在YAML文件中輸入如下腳本,并根據實際情況設置其中的參數。
重要每個iLogtail采集配置必須單獨設置一個對應的CR,如果多個CR關聯同一個Logtail配置,后配置的CR將不會生效。
AliyunPipelineConfig
的參數,請參見【推薦】使用AliyunPipelineConfig管理采集配置。本文的iLogtail采集配置樣例包含基礎的標準輸出采集功能,參數說明參見CreateLogtailPipelineConfig - 創建Logtail流水線配置。請確保
config.flushers.Logstore
參數配置的Logstore
已存在,可以通過配置spec.logstore
參數自動創建Logstore。
多行模式采集指定容器的標準輸出
創建名為
example-k8s-stdout
的iLogtail采集配置,對于集群內名稱包含app
的所有容器,以多行模式采集標準輸出,直接發送到名稱為k8s-stdout
的Logstore,該Logstore屬于名稱為k8s-log-clusterid
的Project。apiVersion: telemetry.alibabacloud.com/v1alpha1 # 創建一個 ClusterAliyunPipelineConfig kind: ClusterAliyunPipelineConfig metadata: # 設置資源名,在當前Kubernetes集群內唯一。該名稱也是創建出的iLogtail采集配置名 name: example-k8s-stdout spec: # 指定目標project project: name: k8s-log-clusterid # 創建用于存儲日志的 Logstore logstores: - name: k8s-stdout # 定義iLogtail采集配置 config: # 日志樣例(可不填寫) sample: | 2024-06-19 16:35:00 INFO test log line-1 line-2 end # 定義輸入插件 inputs: # 使用service_docker_stdout插件采集容器內文本日志 - Type: service_docker_stdout Stdout: true Stderr: true # 配置容器信息過濾條件,多個選項之間為“且”的關系。 # 指定待采集容器所在 Pod 所屬的命名空間,支持正則匹配。 K8sNamespaceRegex: "^(default)$" # 指定待采集容器的名稱,支持正則匹配。 K8sContainerRegex: "^(.*app.*)$" # 配置多行切分配置 # 配置行首正則表達式 BeginLineRegex: \d+-\d+-\d+.* # 定義輸出插件 flushers: # 使用flusher_sls插件輸出到指定Logstore。 - Type: flusher_sls Logstore: k8s-stdout Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
執行如下命令使iLogtail采集配置生效。iLogtail采集配置生效后,Logtail開始采集各個容器上的標準輸出,并發送到日志服務中。
cube.yaml
為文件名,請根據實際情況替換。kubectl apply -f cube.yaml
重要采集到日志后,您需要先創建索引,才能在Logstore中查詢和分析日志。具體操作,請參見創建索引。
CRD-AliyunLogConfig
您只需要創建AliyunLogConfig CR即可創建iLogtail采集配置。創建完成后,系統自動應用該iLogtail采集配置。
執行如下命令創建一個YAML文件。
cube.yaml
為文件名,請根據實際情況替換。vim cube.yaml
在YAML文件中輸入如下腳本,并根據實際情況設置其中的參數。
重要請確保
configName
字段值在安裝Logtail組件的Project中唯一。如果多個CR關聯同一個iLogtail采集配置,則刪除或修改任意一個CR均會影響到該iLogtail采集配置,導致其他關聯該iLogtail采集配置的CR狀態與日志服務中iLogtail采集配置的狀態不一致。
CR字段的格式請參見使用AliyunLogConfig管理采集配置。本文的iLogtail采集配置樣例包含基礎的標準輸出采集功能,具體參數參見CreateConfig - 創建Logtail采集配置。
單行模式采集指定容器的標準輸出
創建名為
example-stdout-example
的Logtail采集配置,以單行文本模式采集集群內所有名稱開頭為app的Pod的容器內的標準輸出,直接發送到名稱為k8s-stdout
的Logstore,該Logstore屬于名稱為k8s-log-clusterid
的Project。# 標準輸出配置 apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: # 設置資源名,在當前Kubernetes集群內唯一。 name: simple-stdout-example spec: # 設置Logstore名稱。如果您所指定的Logstore不存在,日志服務會自動創建。 logstore: k8s-stdout # 設置Logtail采集配置。 logtailConfig: # 設置采集的數據源類型。采集標準輸出時,需設置為plugin。 inputType: plugin # 設置Logtail采集配置的名稱,必須與資源名(metadata.name)相同。 configName: simple-stdout-example inputDetail: plugin: inputs: - # input type type: service_docker_stdout detail: # 指定采集stdout和stderr。 Stdout: true Stderr: true K8sPodRegex: "^(app.*)$"
執行如下命令使iLogtail采集配置生效。iLogtail采集配置生效后,Logtail開始采集各個容器上的標準輸出,并發送到日志服務中。
cube.yaml
為文件名,請根據實際情況替換。kubectl apply -f cube.yaml
重要采集到日志后,您需要先創建索引,才能在Logstore中查詢和分析日志。具體操作,請參見創建索引。
預覽容器元信息
創建Logtail配置后,您可以在Logtail配置頁面查看容器元信息以及容器未匹配過濾條件的原因。
僅Linux Logtail 1.4.0及以上版本或Windows Logtail 1.4.0.0及以上版本支持該功能。
登錄日志服務控制臺。
在Project列表中,單擊目標Project。
此處需選擇您在創建Logtail配置所使用的Project。
在 頁簽中,單擊目標Logstore左側的>,然后選擇 。
此處需選擇您在創建Logtail配置所使用的Logstore。
在Logtail配置列表中,單擊目標Logtail配置。
在Logtail配置頁面中,單擊編輯。
打開啟用容器元信息預覽開關。
單擊容器元信息預覽。
在容器預覽對話框中,查看容器的元信息。
匹配容器頁簽中展示匹配您所設置的過濾條件的容器的元信息。
全量容器頁簽中展示當前Kubernetes集群中所有容器的元信息以及容器未匹配過濾條件的原因。
日志字段
Kubernetes集群的每條日志默認上傳的字段如下所示。
字段名稱 | 說明 |
_time_ | 日志采集時間,例如 |
_source_ | 日志源類型,stdout或stderr。 |
_image_name_ | 鏡像名 |
_container_name_ | 容器名 |
_pod_name_ | Pod名 |
_namespace_ | Pod所在的命名空間 |
_pod_uid_ | Pod的唯一標識 |
問題排查
當您使用Logtail采集容器(標準容器、Kubernetes)日志遇到異常情況時,您可以參見如下內容進行排查。