本文介紹如何通過控制台建立iLogtail採集配置,並以DaemonSet採集方式採集容器標準輸出。
前提條件
- 已安裝Logtail組件。具體操作,請參見安裝Logtail組件(阿里雲Kubernetes叢集)。
- 在您安裝Logtail組件時所使用的Project中已完成Logstore建立。具體操作,請參見建立Logstore。
- 目標容器持續產生日誌。重要 Logtail只採集增量日誌。如果下發Logtail配置後,記錄檔無更新,則Logtail不會採集該檔案中的日誌。更多資訊,請參見讀取日誌。
功能特點
Logtail支援採集容器內產生的標準輸出,並附加容器的相關中繼資料資訊一起上傳到Log Service。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採集配置
表單配置方式
登入Log Service控制台,在快速接入資料地區,單擊Kubernetes-標準輸出,按照設定精靈操作
在Logtail設定步驟中,完成如下配置。
重要參數說明如下:
基礎資訊
參數
說明
配置名稱
Logtail配置的名稱。
標準輸出
選中該選項後,Logtail將採集容器標準輸出。
標準錯誤
選中該選項後,Logtail將採集容器標準錯誤。
採集模式
包括單行模式和多行模式。
使用多行模式時,還需要設定行首正則。
容器過濾
Kubernetes中的命名空間名和容器名會映射到容器Label中,分別為
io.kubernetes.pod.namespace
和io.kubernetes.container.name
。推薦使用這兩個容器Label進行容器過濾。如果這兩個容器Label未滿足需求,請使用環境變數的黑白名單進行容器過濾。例如某Pod所屬的命名空間為backend-prod,容器名為worker-server,如果您要採集包含該容器的日誌,可以設定容器Label白名單為io.kubernetes.pod.namespace : backend-prod
或io.kubernetes.container.name : worker-server
。參數
說明
容器Label白名單
容器Label白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定容器Label白名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則容器Label中包含LabelKey的容器都匹配。
- 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才匹配。
LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如:配置LabelKey為io.kubernetes.container.name,配置LabelValue為^(nginx|cube)$,表示可匹配名為nginx、cube的容器。
多個白名單之間為或關係,即只要容器Label滿足任一白名單即可被匹配。
容器Label黑名單
容器Label黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定容器Label黑名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則容器Label中包含LabelKey的容器都將被排除。
- 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才會被排除。
LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如:設定LabelKey為io.kubernetes.container.name,設定LabelValue為^(nginx|cube)$,表示可匹配名為nginx、cube的容器。
多個黑名單之間為或關係,即只要容器Label滿足任一黑名單對即可被排除。
環境變數白名單
環境變數白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定環境變數白名單,那麼EnvKey必填,EnvValue可選填。
- 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器都匹配。
- 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才匹配。
EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配,例如:設定EnvKey為NGINX_SERVICE_PORT,設定EnvValue為^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。
多個白名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被匹配。
環境變數黑名單
環境變數黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定環境變數黑名單,那麼EnvKey必填,EnvValue可選填。
- 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器的日誌都將被排除。
- 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才會被排除。
EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配,例如:設定EnvKey為NGINX_SERVICE_PORT,設定EnvValue為^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。
多個黑名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被排除。
K8s Label白名單
通過Kubernetes Label白名單指定待採集的容器。如果您要設定Kubernetes Label白名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都匹配。
- 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才匹配。
LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如設定LabelKey為app,設定LabelValue為^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多個白名單之間為或關係,即只要Kubernetes Label滿足任一白名單即可被匹配。
說明Logtail 1.0.34及以上版本支援該參數。
由於在Kubernetes管控類資源(例如Deployment)運行時更改Label,不會重啟具體的工作資源Pod,因此Pod無法感知此變更,可能導致匹配規則失效。設定K8s Label黑白名單時,請以Pod中的Kubernetes Label為準。關於Kubernetes Label的更多資訊,請參見Labels and Selectors。
K8s Label黑名單
通過Kubernetes Label黑名單排除不採集的容器。如果您要設定Kubernetes Label黑名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都被排除。
- 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才會被排除。
LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如設定LabelKey為app,設定LabelValue為^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多個黑名單之間為或關係,即只要Kubernetes Label滿足任一黑名單對即可被排除。
說明Logtail 1.0.34及以上版本支援該參數。
由於在Kubernetes管控類資源(例如Deployment)運行時更改Label,不會重啟具體的工作資源Pod,因此Pod無法感知此變更,可能導致匹配規則失效。設定K8s Label黑白名單時,請以Pod中的Kubernetes Label為準。關於Kubernetes Label的更多資訊,請參見Labels and Selectors。
命名空間
通過Namespace名稱指定採集的容器,支援正則匹配。例如設定為"K8sNamespaceRegex":"^(default|nginx)$",表示匹配nginx命名空間、default命名空間下的所有容器。
說明Logtail 1.0.34及以上版本支援該參數。
Pod名稱
通過Pod名稱指定待採集的容器,支援正則匹配。例如設定為"K8sPodRegex":"^(nginx-log-demo.*)$",,表示匹配以nginx-log-demo開頭的Pod下的所有容器。
說明Logtail 1.0.34及以上版本支援該參數。
容器名稱
通過容器名稱指定待採集的容器(Kubernetes容器名稱是定義在spec.containers中),支援正則匹配。例如設定為"K8scontainerRegex":"^(container-test)$",表示匹配所有名為container-test的容器。
說明Logtail 1.0.34及以上版本支援該參數。
欄位擴充相關參數
如果您使用的是Logtail 1.0.34及以上版本,您可以將環境變數和Kubernetes Label添加到日誌,作為日誌標籤。
參數
說明
使用環境變數擴充
設定環境變數擴充欄位後,Log Service將在日誌中新增環境變數相關欄位。例如設定環境變數名為VERSION,設定擴充欄位名為env_version,當容器中包含環境變數
VERSION=v1.0.0
時,會將該資訊添加到日誌中,即添加欄位__tag__:__env_version__: v1.0.0。使用K8s Label擴充
設定Kubernetes Label擴充欄位後,Log Service將在日誌中新增Kubernetes Label相關欄位。例如設定K8s Label為app,設定擴充欄位名為
k8s_label_app
,當Kubernetes中包含Labelapp=serviceA
時,會將該資訊添加到日誌中,即添加欄位__tag__:__k8s_label_app__: serviceA。進階參數
參數
說明
日誌最大長度(位元組)
日誌最大長度,預設值為524288位元組。取值範圍為[1024, 20971520],單位:位元組。
如果日誌長度超過該值,則不再繼續尋找行首,直接上傳。
首次採集回溯歷史資料長度(位元組)
首次採集時回溯歷史資料長度,預設值為131072位元組(128 KB)。建議取值範圍為[131072,1048576],單位:位元組。
行首正則匹配長度(位元組)
行首匹配的長度,預設值為10240位元組。
如果行首匹配的Regex在前N個位元組即可體現,推薦設定此參數,提升行首匹配效率。
BeginLineTimeoutMs
行首匹配的逾時時間,預設值為3000毫秒。
如果3000毫秒內沒有出現新日誌,則結束匹配,將最後一條日誌上傳到Log Service。
CRD-AliyunPipelineConfig(推薦)
建立AliyunPipelineConfig CR,需要的alibaba-log-controller Deployment的鏡像版本號碼最低為0.5.0。
您只需要建立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採集配置,以單行模式採集Kubernetes叢集內所有容器的標準輸出,將採集到的日誌直接發送到名稱為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: # 定義輸入外掛程式 inputs: # 使用service_docker_stdout外掛程式採集容器內文本日誌 - Type: service_docker_stdout Stdout: true Stderr: true # 定義輸出外掛程式 flushers: # 使用flusher_sls外掛程式輸出到指定Logstore。 - Type: flusher_sls Logstore: k8s-stdout Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
多行模式採集指定容器的標準輸出
建立名為
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.*)$" # 配置多行切分配置 # 配置行首Regex 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開始採集各個容器上的文本日誌,並發送到Log Service中。
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狀態與Log Service中iLogtail採集配置的狀態不一致。
CR欄位的格式請參見使用AliyunLogConfig管理採集配置。本文的iLogtail採集配置範例包含基礎的文本日誌採集功能,具體參數參見CreateConfig - 建立Logtail採集配置。
單行模式採集容器標準輸出
建立名為
example-k8s-file
的iLogtail採集配置,以單行文字模式採集叢集內所有容器內的標準輸出,直接發送到名稱為k8s-file
的Logstore,該Logstore屬於名稱為k8s-log-clusterid
的Project。apiVersion: log.alibabacloud.com/v1alpha1 kind: AliyunLogConfig metadata: # 設定資源名,在當前Kubernetes叢集內唯一。 name: example-k8s-stdout namespace: kube-system spec: # 設定Logstore名稱。如果您所指定的Logstore不存在,Log Service會自動建立。 logstore: k8s-stdout # 設定iLogtail採集配置。 logtailConfig: # 設定採集的資料來源類型。採集容器標準輸出時,需設定為plugin。 inputType: plugin # 設定iLogtail採集配置的名稱,必須與資源名(metadata.name)相同。 configName: example-k8s-stdout inputDetail: plugin: inputs: # 指定通過service_docker_stdout外掛程式採集文本日誌。 - type: service_docker_stdout detail: # 採集stdout與stderr日誌 Stdout: true Stderr: true
執行如下命令使iLogtail採集配置生效。iLogtail採集配置生效後,Logtail開始採集各個容器上的文本日誌,並發送到Log Service中。
cube.yaml
為檔案名稱,請根據實際情況替換。kubectl apply -f cube.yaml
重要採集到日誌後,您需要先建立索引,才能在Logstore中查詢和分析日誌。具體操作,請參見建立索引。
JSON配置方式
登入Log Service控制台,在快速接入資料地區,單擊Kubernetes-標準輸出,按照設定精靈操作,在Logtail配置頁面,單擊右上方的切換為編輯器配置。
在外掛程式配置中填寫您的Logtail配置資訊,樣本如下所示。
如果當前的配置無法滿足日誌解析需求,您可以在外掛程式配置中添加processors配置,即添加Logtail外掛程式處理資料。例如提取欄位、提取日誌時間、脫敏資料、過濾日誌等。更多資訊,請參見使用Logtail外掛程式處理資料。
{
"inputs":[
{
"type":"service_docker_stdout",
"detail":{
"Stdout":true,
"Stderr":true,
"IncludeContainerLabel":{
"LabelKey":"LabelValue"
},
"ExcludeContainerLabel":{
"LabelKey":"LabelValue"
},
"IncludeK8sLabel":{
"LabelKey":"LabelValue"
},
"ExcludeK8sLabel":{
"LabelKey":"LabelValue"
},
"IncludeEnv":{
"EnvKey":"EnvValue"
},
"ExcludeEnv":{
"EnvKey":"EnvValue"
},
"ExternalK8sLabelTag":{
"EnvKey":"EnvValue"
},
"ExternalEnvTag":{
"EnvKey":"EnvValue"
},
"K8sNamespaceRegex":"^(default|kube-system)$",
"K8sPodRegex":"^(deploy.*)$",
"K8sContainerRegex":"^(container1|container2)$"
}
}
]
}
重要參數說明如下:
資料來源類型
固定為service_docker_stdout。
容器過濾相關參數
Logtail 1.0.34以下版本,只支援通過環境變數、容器Label進行容器過濾。詳細說明如下:
Kubernetes中的命名空間名和容器名會映射到容器Label中,分別為
io.kubernetes.pod.namespace
和io.kubernetes.container.name
。推薦使用這兩個容器Label進行容器過濾。如果這兩個容器Label未滿足需求,請使用環境變數的黑白名單進行容器過濾。例如某Pod所屬的命名空間為backend-prod,容器名為worker-server,如果您要採集包含該容器的日誌,可以設定容器Label白名單為io.kubernetes.pod.namespace : backend-prod
或io.kubernetes.container.name : worker-server
。參數
資料類型
是否必填
說明
IncludeLabel
map類型,其中LabelKey和LabelValue為string類型。
可選
容器Label白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定容器Label白名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則容器Label中包含LabelKey的容器都匹配。
- 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才匹配。
LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如:配置LabelKey為io.kubernetes.container.name,配置LabelValue為^(nginx|cube)$,表示可匹配名為nginx、cube的容器。
多個白名單之間為或關係,即只要容器Label滿足任一白名單即可被匹配。
ExcludeLabel
map類型,其中LabelKey和LabelValue為string類型。
可選
容器Label黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定容器Label黑名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則容器Label中包含LabelKey的容器都將被排除。
- 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才會被排除。
LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如:設定LabelKey為io.kubernetes.container.name,設定LabelValue為^(nginx|cube)$,表示可匹配名為nginx、cube的容器。
多個黑名單之間為或關係,即只要容器Label滿足任一黑名單對即可被排除。
IncludeEnv
map類型,其中EnvKey和EnvValue為string類型。
可選
環境變數白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定環境變數白名單,那麼EnvKey必填,EnvValue可選填。
- 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器都匹配。
- 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才匹配。
EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配,例如:設定EnvKey為NGINX_SERVICE_PORT,設定EnvValue為^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。
多個白名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被匹配。
ExcludeEnv
map類型,其中EnvKey和EnvValue為string類型。
可選
環境變數黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定環境變數黑名單,那麼EnvKey必填,EnvValue可選填。
- 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器的日誌都將被排除。
- 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才會被排除。
EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配,例如:設定EnvKey為NGINX_SERVICE_PORT,設定EnvValue為^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。
多個黑名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被排除。
Logtail 1.0.34及以上版本,推薦使用Kubernetes層級的資訊(Pod名稱、Namespace名稱、容器名稱、Label)進行容器過濾。
說明由於在Kubernetes管控類資源(例如Deployment)運行時更改Label,不會重啟具體的工作資源Pod,因此Pod無法感知此變更,可能導致匹配規則失效。設定K8s Label黑白名單時,請以Pod中的Kubernetes Label為準。關於Kubernetes Label的更多資訊,請參見Labels and Selectors。
參數
資料類型
是否必填
說明
IncludeK8sLabel
map類型,其中LabelKey和LabelValue為string類型。
可選
通過Kubernetes Label白名單指定待採集的容器。如果您要設定Kubernetes Label白名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都匹配。
- 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才匹配。
LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如設定LabelKey為app,設定LabelValue為^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多個白名單之間為或關係,即只要Kubernetes Label滿足任一白名單即可被匹配。
ExcludeK8sLabel
map類型,其中LabelKey和LabelValue為string類型。
可選
通過Kubernetes Label黑名單排除不採集的容器。如果您要設定Kubernetes Label黑名單,那麼LabelKey必填,LabelValue可選填。
- 如果LabelValue為空白,則Kubernetes Label中包含LabelKey的容器都被排除。
- 如果LabelValue不為空白,則Kubernetes Label中包含LabelKey=LabelValue的容器才會被排除。
LabelValue預設為字串匹配,即只有LabelValue和Kubernetes Label的值完全相同才會匹配。如果該值以
^
開頭並且以$
結尾,則為正則匹配。例如設定LabelKey為app,設定LabelValue為^(test1|test2)$,表示匹配Kubernetes Label中包含app:test1、app:test2的容器。
多個黑名單之間為或關係,即只要Kubernetes Label滿足任一黑名單對即可被排除。
K8sNamespaceRegex
string
可選
通過Namespace名稱指定採集的容器,支援正則匹配。例如設定為"K8sNamespaceRegex":"^(default|nginx)$",表示匹配nginx命名空間、default命名空間下的所有容器。
K8sPodRegex
string
可選
通過Pod名稱指定待採集的容器,支援正則匹配。例如設定為"K8sPodRegex":"^(nginx-log-demo.*)$",,表示匹配以nginx-log-demo開頭的Pod下的所有容器。
K8sContainerRegex
string
可選
通過容器名稱指定待採集的容器(Kubernetes容器名稱是定義在spec.containers中),支援正則匹配。例如設定為"K8scontainerRegex":"^(container-test)$",表示匹配所有名為container-test的容器。
日誌標籤相關參數
如果您使用的是Logtail 1.0.34及以上版本,您可以將環境變數和Kubernetes Label添加到日誌,作為日誌標籤。
參數
資料類型
是否必填
說明
ExternalEnvTag
map類型,其中EnvKey和EnvValue為string類型。
可選
設定環境變數日誌標籤後,Log Service將在日誌中新增環境變數相關欄位。例如設定EnvKey為VERSION,設定EnvValue為env_version,當容器中包含環境變數
VERSION=v1.0.0
時,會將該資訊添加到日誌中,即添加欄位__tag__:__env_version__: v1.0.0。ExternalK8sLabelTag
map類型,其中LabelKey和LabelValue為string類型。
可選
設定Kubernetes Label日誌標籤後,Log Service將在日誌中新增Kubernetes Label相關欄位。例如設定LabelKey為app,設定LabelValue為
k8s_label_app
,當Kubernetes中包含Labelapp=serviceA
時,會將該資訊添加到日誌中,即添加欄位__tag__:__k8s_label_app__: serviceA。其他參數
參數
資料類型
是否必填
說明
Stdout
boolean
可選
是否採集容器標準輸出。
true(預設值):採集。
false:不採集。
Stderr
boolean
可選
是否採集容器標準錯誤。
true(預設值):採集。
false:不採集。
BeginLineRegex
string
可選
行首匹配的Regex。
該配置項為空白,表示單行模式。
Logtail通過行首Regex去匹配一條日誌的行首,如果匹配成功,則將該行作為一條新的日誌,否則將此行拼接到上一條日誌。
BeginLineTimeoutMs
int
可選
行首匹配的逾時時間。預設值為3000毫秒。
如果3000毫秒內沒有出現新日誌,則結束匹配,將最後一條日誌上傳到Log Service。
BeginLineCheckLength
int
可選
行首匹配的長度,預設值為10240位元組。
如果行首匹配的Regex在前N個位元組即可體現,推薦設定此參數,提升行首匹配效率。
MaxLogSize
int
可選
日誌最大長度,預設值為524288(512KB)位元組。取值範圍為1024(1KB)-8388608(8M),單位:位元組。
如果日誌長度超過該值,則不再繼續尋找行首,直接上傳。
StartLogMaxOffset
int
可選
首次採集時回溯歷史資料長度,預設值為131072位元組。建議取值範圍為[131072,1048576],單位:位元組。
單行日誌的Logtail配置樣本
通過環境變數黑白名單過濾容器
採集環境變數為NGINX_SERVICE_PORT=80
且不為POD_NAMESPACE=kube-system
的容器的標準輸出。
擷取環境變數。
您可以登入容器所在的宿主機查看容器的環境變數。具體操作,請參見擷取容器環境變數。
建立Logtail配置。
Logtail配置樣本如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeEnv": { "NGINX_SERVICE_PORT": "80" }, "ExcludeEnv": { "POD_NAMESPACE": "kube-system" } } } ] }
通過容器Label黑白名單過濾容器
採集容器Label為io.kubernetes.container.name=nginx
的容器的標準輸出。
擷取容器Label。
您可以登入容器所在的宿主機查看容器的Label。具體操作,請參見擷取容器Label。
建立Logtail配置。
Logtail配置樣本如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeLabel": { "io.kubernetes.container.name": "nginx" } } } ] }
通過Kubernetes Namespace名稱、Pod名稱和容器名稱過濾容器
採集default命名空間下以nginx-log-demo開頭的Pod中的nginx-log-demo-0容器的標準輸出。
擷取Kubernetes層級的資訊。
擷取Pod資訊。
擷取Namespace等資訊。
建立Logtail配置。
Logtail配置樣本如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "K8sNamespaceRegex":"^(default)$", "K8sPodRegex":"^(nginx-log-demo.*)$", "K8sContainerRegex":"^(nginx-log-demo-0)$" } } ] }
通過Kubernetes Label過濾容器
採集Kubernetes Label中Key為job-name,Value以nginx-log-demo開頭的所有容器的標準輸出。
擷取Kubernetes Label。
建立Logtail配置。
Logtail配置樣本如下所示。
{ "inputs": [ { "type": "service_docker_stdout", "detail": { "Stdout": true, "Stderr": true, "IncludeK8sLabel":{ "job-name":"^(nginx-log-demo.*)$" } } } ] }
多行日誌的Logtail配置樣本
對於Java異常堆棧輸出(多行日誌),您可以參見如下配置。
日誌樣本
2021-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start 2021-02-03 14:18:41.969 ERROR [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : java.lang.NullPointerException at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ... 2021-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done
Logtail配置
採集容器Label為
app=monitor
的容器的Java異常堆棧輸出,該輸出內容以固定格式的日期開頭。為提高匹配效率,此處只判斷行首的10個位元組。採集到Log Service後,Log Service使用正則表達將其解析成time、level、module、thread、message等欄位。inputs為資料來源配置,必選項,請根據您的資料來源配置。
重要一個inputs中只允許配置一個類型的資料來源。
processors為處理配置,可選項。您可以配置一種或多種處理方式。具體操作,請參見使用Logtail外掛程式處理資料。
{ "inputs": [ { "detail": { "BeginLineCheckLength": 10, "BeginLineRegex": "\\d+-\\d+-\\d+.*", "IncludeLabel": { "app": "monitor" } }, "type": "service_docker_stdout" } ], "processors": [ { "type": "processor_regex", "detail": { "SourceKey": "content", "Regex": "(\\d+-\\d+-\\d+ \\d+:\\d+:\\d+\\.\\d+)\\s+(\\w+)\\s+\\[([^]]+)]\\s+\\[([^]]+)]\\s+([\\s\\S]*)", "Keys": [ "time", "level", "module", "thread", "message" ], "NoKeyError": true, "NoMatchError": true, "KeepSource": false } } ] }
解析後的日誌
例如
2018-02-03 14:18:41.968 INFO [spring-cloud-monitor] [nio-8080-exec-4] c.g.s.web.controller.DemoController : service start done
日誌,經過解析後的日誌內容如下所示。其中:_time_為日誌採集時間。
time為日誌中存在的時間內容,是從日誌中提取得到的。
__tag__:__hostname__:logtail-dfgef _container_name_:monitor _image_name_:example.com-hangzhou.aliyuncs.xxxxxxxxxxxxxxx _namespace_:default _pod_name_:monitor-6f54bd5d74-rtzc7 _pod_uid_:7f012b72-04c7-11e8-84aa-00163f00c369 _source_:stdout _time_:2018-02-02T14:18:41.979147844Z time:2018-02-02 02:18:41.968 level:INFO module:spring-cloud-monitor thread:nio-8080-exec-4 class:c.g.s.web.controller.DemoController message:service start done
預覽容器元資訊
建立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)日誌遇到異常情況時,您可以參見如下內容進行排查。