全部產品
Search
文件中心

Simple Log Service:通過DaemonSet方式採集Kubernetes容器標準輸出

更新時間:Jul 30, 2024

本文介紹如何通過控制台建立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.namespaceio.kubernetes.container.name。推薦使用這兩個容器Label進行容器過濾。如果這兩個容器Label未滿足需求,請使用環境變數的黑白名單進行容器過濾。例如某Pod所屬的命名空間為backend-prod,容器名為worker-server,如果您要採集包含該容器的日誌,可以設定容器Label白名單為io.kubernetes.pod.namespace : backend-prodio.kubernetes.container.name : worker-server

    重要
    • 容器Label為Docker inspect中的Label,不是Kubernetes中的Label。如何擷取,請參見擷取容器Label
    • 環境變數為容器啟動中配置的環境變數資訊。如何擷取,請參見擷取容器環境變數
    • 請勿設定相同的LabelKey,如果重名只生效一個。

    參數

    說明

    容器Label白名單

    容器Label白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定容器Label白名單,那麼LabelKey必填,LabelValue可選填。

    • 如果LabelValue為空白,則容器Label中包含LabelKey的容器都匹配。
    • 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才匹配。

      LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:配置LabelKeyio.kubernetes.container.name,配置LabelValue^(nginx|cube)$,表示可匹配名為nginx、cube的容器。

    多個白名單之間為或關係,即只要容器Label滿足任一白名單即可被匹配。

    容器Label黑名單

    容器Label黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定容器Label黑名單,那麼LabelKey必填,LabelValue可選填。

    • 如果LabelValue為空白,則容器Label中包含LabelKey的容器都將被排除。
    • 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才會被排除。

      LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:設定LabelKeyio.kubernetes.container.name,設定LabelValue^(nginx|cube)$,表示可匹配名為nginx、cube的容器。

    多個黑名單之間為或關係,即只要容器Label滿足任一黑名單對即可被排除。

    環境變數白名單

    環境變數白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定環境變數白名單,那麼EnvKey必填,EnvValue可選填。

    • 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器都匹配。
    • 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才匹配。

      EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_SERVICE_PORT,設定EnvValue^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。

    多個白名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被匹配。

    環境變數黑名單

    環境變數黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定環境變數黑名單,那麼EnvKey必填,EnvValue可選填。

    • 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器的日誌都將被排除。
    • 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才會被排除。

      EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定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 Labelapp,設定擴充欄位名k8s_label_app,當Kubernetes中包含Label app=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採集配置

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 執行如下命令建立一個YAML檔案。

    cube.yaml為檔案名稱,請根據實際情況替換。

    vim cube.yaml
  3. 在YAML檔案中輸入如下指令碼,並根據實際情況設定其中的參數。

    重要

    單行模式採集容器標準輸出

    建立名為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
  4. 執行如下命令使iLogtail採集配置生效。iLogtail採集配置生效後,Logtail開始採集各個容器上的文本日誌,並發送到Log Service中。

    cube.yaml為檔案名稱,請根據實際情況替換。

    kubectl apply -f cube.yaml
    重要

    採集到日誌後,您需要先建立索引,才能在Logstore中查詢和分析日誌。具體操作,請參見建立索引

CRD-AliyunLogConfig

您只需要建立AliyunLogConfig CR即可建立iLogtail採集配置。建立完成後,系統自動應用該iLogtail採集配置。

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 執行如下命令建立一個YAML檔案。cube.yaml為檔案名稱,請根據實際情況替換。

    vim cube.yaml
  3. 在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
  4. 執行如下命令使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.namespaceio.kubernetes.container.name。推薦使用這兩個容器Label進行容器過濾。如果這兩個容器Label未滿足需求,請使用環境變數的黑白名單進行容器過濾。例如某Pod所屬的命名空間為backend-prod,容器名為worker-server,如果您要採集包含該容器的日誌,可以設定容器Label白名單為io.kubernetes.pod.namespace : backend-prodio.kubernetes.container.name : worker-server

      重要
      • 容器Label為Docker inspect中的Label,不是Kubernetes中的Label。如何擷取,請參見擷取容器Label
      • 環境變數為容器啟動中配置的環境變數資訊。如何擷取,請參見擷取容器環境變數
      • 請勿設定相同的LabelKey,如果重名只生效一個。

      參數

      資料類型

      是否必填

      說明

      IncludeLabel

      map類型,其中LabelKey和LabelValue為string類型。

      可選

      容器Label白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定容器Label白名單,那麼LabelKey必填,LabelValue可選填。

      • 如果LabelValue為空白,則容器Label中包含LabelKey的容器都匹配。
      • 如果LabelValue不為空白,則容器Label中包含LabelKey=LabelValue的容器才匹配。

        LabelValue預設為字串匹配,即只有LabelValue和容器Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:配置LabelKeyio.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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如:設定LabelKeyio.kubernetes.container.name,設定LabelValue^(nginx|cube)$,表示可匹配名為nginx、cube的容器。

      多個黑名單之間為或關係,即只要容器Label滿足任一黑名單對即可被排除。

      IncludeEnv

      map類型,其中EnvKey和EnvValue為string類型。

      可選

      環境變數白名單,用於指定待採集的容器。預設為空白,表示採集所有容器的標準輸出。如果您要設定環境變數白名單,那麼EnvKey必填,EnvValue可選填。

      • 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器都匹配。
      • 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才匹配。

        EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_SERVICE_PORT,設定EnvValue^(80|6379)$,表示可匹配服務連接埠為80、6379的容器。

      多個白名單之間為或關係,即只要容器的環境變數滿足任一索引值對即可被匹配。

      ExcludeEnv

      map類型,其中EnvKey和EnvValue為string類型。

      可選

      環境變數黑名單,用於排除不採集的容器。預設為空白,表示不排除任何容器。如果您要設定環境變數黑名單,那麼EnvKey必填,EnvValue可選填。

      • 如果EnvValue為空白,則容器環境變數中包含EnvKey的容器的日誌都將被排除。
      • 如果EnvValue不為空白,則容器環境變數中包含EnvKey=EnvValue的容器才會被排除。

        EnvValue預設為字串匹配,即只有EnvValue和環境變數的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定EnvKeyNGINX_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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定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的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定LabelKeyapp,設定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將在日誌中新增環境變數相關欄位。例如設定EnvKeyVERSION,設定EnvValueenv_version,當容器中包含環境變數VERSION=v1.0.0時,會將該資訊添加到日誌中,即添加欄位__tag__:__env_version__: v1.0.0

    ExternalK8sLabelTag

    map類型,其中LabelKey和LabelValue為string類型。

    可選

    設定Kubernetes Label日誌標籤後,Log Service將在日誌中新增Kubernetes Label相關欄位。例如設定LabelKeyapp,設定LabelValuek8s_label_app,當Kubernetes中包含Label app=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的容器的標準輸出。

  1. 擷取環境變數。

    您可以登入容器所在的宿主機查看容器的環境變數。具體操作,請參見擷取容器環境變數

    環境變數配置方式

  2. 建立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的容器的標準輸出。

  1. 擷取容器Label。

    您可以登入容器所在的宿主機查看容器的Label。具體操作,請參見擷取容器Label

    Label配置方式

  2. 建立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容器的標準輸出。

  1. 擷取Kubernetes層級的資訊。

    1. 擷取Pod資訊。k8s資源

    2. 擷取Namespace等資訊。K8s資源

  2. 建立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開頭的所有容器的標準輸出。

  1. 擷取Kubernetes Label。K8s資源

  2. 建立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使用正則表達將其解析成timelevelmodulethreadmessage等欄位。

    • 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及以上版本支援該功能。

  1. 登入Log Service控制台

  2. 在Project列表中,單擊目標Project。

    此處需選擇您在建立Logtail配置所使用的Project。

  3. 日誌儲存 > 日誌庫頁簽中,單擊目標Logstore左側的>,然後選擇資料接入 > Logtail配置

    此處需選擇您在建立Logtail配置所使用的Logstore。

  4. 在Logtail配置列表中,單擊目標Logtail配置。

  5. Logtail配置頁面中,單擊編輯

  6. 配置詳情頁簽下的容器過濾地區,開啟容器元資訊預覽開關。

  7. 單擊容器元資訊預覽

  8. 容器預覽對話方塊中,查看容器的元資訊。

    • 匹配容器頁簽中展示匹配您所設定的過濾條件的容器的元資訊。

    • 全量容器頁簽中展示當前Kubernetes叢集中所有容器的元資訊以及容器未匹配過濾條件的原因。

日誌欄位

Kubernetes叢集的每條日誌預設上傳的欄位如下所示。

欄位名稱

說明

_time_

日誌採集時間,例如2021-02-02T02:18:41.979147844Z

_source_

日誌源類型,stdout或stderr。

_image_name_

鏡像名

_container_name_

容器名

_pod_name_

Pod名

_namespace_

Pod所在的命名空間

_pod_uid_

Pod的唯一標識

問題排查

當您使用Logtail採集容器(標準容器、Kubernetes)日誌遇到異常情況時,您可以參見如下內容進行排查。