全部產品
Search
文件中心

Container Service for Kubernetes:在Knative上實現日誌採集

更新時間:Nov 02, 2024

如需採集Knative服務的容器文本日誌,您可以通過DaemonSet的方式,在每個節點上自動運行一個日誌代理,以提升營運效率。ACK叢集已相容Log ServiceSLS,支援無侵入式採集日誌。您可以安裝日誌組件Logtail,該組件會在節點上部署一個Logtail執行個體,用於收集節點上所有容器的日誌,便於後續的管理和分析。

工作原理

DaemonSet模式

  • 在DaemonSet模式中,Kubernetes叢集確保每個節點(Node)只運行一個Logtail容器,用於採集當前節點內所有容器(Containers)的日誌。

  • 當新節點加入叢集時,Kubernetes叢集會自動在新節點上建立Logtail容器;當節點退出叢集時,Kubernetes叢集會自動銷毀當前節點上的Logtail容器。通過DaemonSet的自動擴縮容機制以及標識型機器組,無需您手動管理Logtail執行個體。

容器發現

  • Logtail容器採集其他容器的日誌,必鬚髮現和確定哪些容器正在運行,這個過程稱為容器發現。在容器發現階段,Logtail容器不與Kubernetes叢集的kube-apiserver進行通訊,而是直接和節點上的容器運行時守護進程(Container Runtime Daemon)進行通訊,從而擷取當前節點上的所有容器資訊,避免容器發現對叢集kube-apiserver產生壓力。

  • Logtail支援通過Namespace名稱、Pod名稱、Pod標籤、容器環境變數等條件指定或排除採集相應容器的日誌。

容器檔案路徑映射

在Kubernetes叢集中,因為Pod之間資源隔離,所以Logtail容器無法直接存取其他Pod中的容器的檔案。但是,容器內的檔案系統都是由宿主機的檔案系統掛載形成,通過將宿主機根目錄所在的檔案系統掛載到Logtail容器,就可以訪問宿主機上的任意檔案,從而間接採集業務容器檔案系統的檔案。容器內檔案路徑與宿主機檔案路徑之間的關係被稱為檔案路徑映射。

記錄檔在當前容器內的路徑是/log/app.log,假設映射後的宿主機路徑是/var/lib/docker/containers/<container-id>/log/app.log。Logtail預設將宿主機根目錄所在的檔案系統掛載到自身的/logtail_host目錄下,因此Logtail實際採集的檔案路徑為/logtail_host/var/lib/docker/containers/<container-id>/log/app.log

前提條件

步驟一:安裝Logtail組件

Logtail是SLS提供的日誌採集Agent,支援無侵入式採集ACK叢集中產生的日誌。您無需修改應用程式代碼,Logtail採集日誌時不會影響您的應用程式運行。您可以在ACK叢集中安裝Logtail組件,安裝完成後,Logtail會自動部署logtail-ds DaemonSet,用於採集節點的日誌。

重要
  • 請確保僅使用一款日誌採集工具例如Logtail,來採集並發送容器日誌到SLS。同時使用這兩個組件可能會導致容器日誌被重複採集和發送,帶來額外的費用和資源消耗。

  • 升級Logtail、查看Logtail版本及IP地址、查看Logtail的作業記錄等操作步驟,請參見安裝Logtail組件(阿里雲Kubernetes叢集)

建立叢集時安裝

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列,單擊叢集

  3. 叢集列表頁面中,單擊頁面右上方的建立叢集

    以下僅介紹開啟Log Service的關鍵步驟。關於建立叢集的具體操作,請參見建立ACK託管叢集

  4. 組件配置配置項頁中,選中使用Log Service,表示在建立的Kubernetes叢集中安裝日誌外掛程式。

    當選中使用Log Service後,會出現建立專案(Project)的提示。關於Log Service管理日誌的組織圖,請參見專案(Project)。有以下兩種建立Project的方式。

    • 單擊使用已有Project,選擇一個現有的Project來管理採集的日誌。

      image..png

    • 單擊建立新Project,自動建立一個新的Project來管理採集的日誌,Project會自動命名為k8s-log-{ClusterID},其中,ClusterID是您建立的Kubernetes叢集的唯一標識。

      image..png

  5. 配置完成後,單擊右下角的建立叢集,在彈出的視窗中單擊確定,完成建立。

    完成建立後,您可在叢集列表頁面查看開啟了Logtail的ACK叢集。

為已有叢集安裝

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列,單擊叢集

  3. 叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情

  4. 在叢集管理頁左側導覽列中,選擇營運管理>組件管理,並在日誌與監控地區找到logtail-ds

  5. logtail-ds組件右側,單擊安裝,並在安裝組件對話方塊中單擊確定

如果您已安裝的Log Service組件為舊版本,可以在logtail-ds組件右側,單擊升級

重要

升級logtail-ds組件後,會重設組件參數。如果您曾自訂logtail-ds或alibaba-log-controller的配置和環境變數,參數將被覆蓋,請重新設定。具體操作,請參見手動升級

步驟二:配置Logtail採集配置

  1. 建議您只選擇以下一種方式配置Logtail採集配置。

    • CRD:可以通過Kubernetes的工具進行大量設定和版本控制,適合集中管理多個Logtail採集配置。通過CRD建立的Logtail採集配置不會同步到控制台,因此如需修改這些配置,必須直接修改CRD資源,不要直接在控制台操作,否則導致Logtail採集配置不一致。

    • Log Service控制台:適合少量Logtail採集配置的建立和管理,無需登入Kubernetes叢集,操作步驟簡單但無法大量設定,配置的優先順序低於CRD。

    • 環境變數:只支援單行文本,如果要配置多行文本或其他日誌格式,必須使用CRD或在Log Service控制台配置。

  2. Logtail採集配置項包括:是否過濾某些容器、是否忽略指定的目錄或檔案(採集黑名單)、是否允許檔案多次採集等。

(推薦)CRD-AliyunPipelineConfig

建立Logtail採集配置

警告

使用AliyunPipelineConfig,需要日誌組件版本最低為0.5.1。

您只需要建立AliyunPipelineConfig CR即可建立iLogtail採集配置,建立完成後自動生效。對於通過CR建立的iLogtail採集配置,其修改只能通過更新相應的CR來實現。

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

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

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

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

    重要
    • 請確保configName欄位值在安裝Logtail組件的Project中唯一。

    • 每個iLogtail採集配置必須單獨設定一個對應的CR,如果多個CR關聯同一個Logtail配置,後配置的CR將不會生效。

    • AliyunPipelineConfig的參數,請參見【推薦】使用AliyunPipelineConfig管理採集配置。本文的iLogtail採集配置範例包含基礎的文本日誌採集功能,參數說明參見CreateLogtailPipelineConfig - 建立Logtail流水線配置

    • 請確保config.flushers.Logstore參數配置的Logstore已存在,可以通過配置spec.logstore參數自動建立Logstore。

    採集指定容器內的單行文本日誌

    建立名為example-k8s-file的iLogtail採集配置,對於叢集內名稱包含app的所有容器,以單行文字模式採集/data/logs/app_1路徑下的test.LOG檔案,

    直接發送到名稱為k8s-file的Logstore,該Logstore屬於名稱為k8s-log-test的Project。

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    # 建立一個 ClusterAliyunPipelineConfig
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 設定資源名,在當前Kubernetes叢集內唯一。該名稱也是建立出的iLogtail採集配置名
      name: example-k8s-file
    spec:
      # 指定目標project
      project:
        name: k8s-log-test
      # 建立用於儲存日誌的 Logstore
      logstores:
        - name: k8s-file
      # 定義iLogtail採集配置
      config:
        # 定義輸入外掛程式
        inputs:
          # 使用input_file外掛程式採集容器內文本日誌
          - Type: input_file
            # 容器內的檔案路徑
            FilePaths:
              - /data/logs/app_1/**/test.LOG
            # 啟用容器發現功能。
            EnableContainerDiscovery: true
            # 添加容器資訊過濾條件,多個選項之間為“且”的關係。
            ContainerFilters:
              # 指定待採集容器所在 Pod 所屬的命名空間,支援正則匹配。
              K8sNamespaceRegex: default
              # 指定待採集容器的名稱,支援正則匹配。
              K8sContainerRegex: ^(.*app.*)$
        # 定義輸出外掛程式
        flushers:
          # 使用flusher_sls外掛程式輸出到指定Logstore。
          - Type: flusher_sls
            # 需要確保該 Logstore 存在
            Logstore: k8s-file
            # 需要確保 endpoint 正確
            Endpoint: cn-hangzhou.log.aliyuncs.com
            Region: cn-hangzhou
            TelemetryType: logs

    採集所有容器內的多行文本日誌並正則解析

    建立名為example-k8s-file的iLogtail採集配置,以多行文字模式採集叢集內所有容器內的/data/logs/app_1路徑下的test.LOG檔案,對採集到的資料進行JSON解析,直接發送到名稱為k8s-file的Logstore,該Logstore屬於名稱為k8s-log-test的Project。

    下面範例中的日誌原文通過input_file外掛程式讀取後格式為{"content": "2024-06-19 16:35:00 INFO test log\nline-1\nline-2\nend"},會被正則解析外掛程式解析為{"time": "2024-06-19 16:35:00", "level": "INFO", "msg": "test log\nline-1\nline-2\nend"}

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    # 建立一個 ClusterAliyunPipelineConfig
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 設定資源名,在當前Kubernetes叢集內唯一。該名稱也是建立出的iLogtail採集配置名
      name: example-k8s-file
    spec:
      # 指定目標project
      project:
        name: k8s-log-test
      # 建立用於儲存日誌的 Logstore
      logstores:
        - name: k8s-file
      # 定義iLogtail採集配置
      config:
        # 日誌範例(可不填寫)
        sample: |
          2024-06-19 16:35:00 INFO test log
          line-1
          line-2
          end
        # 定義輸入外掛程式
        inputs:
          # 使用input_file外掛程式採集容器內多行文本日誌
          - Type: input_file
            # 容器內的檔案路徑
            FilePaths:
              - /data/logs/app_1/**/test.LOG
            # 啟用容器發現功能。
            EnableContainerDiscovery: true
            # 開啟多行能力
            Multiline:
              # 選擇自訂行首Regex模式
              Mode: custom
              # 配置行首Regex
              StartPattern: \d+-\d+-\d+.*
        # 定義處理外掛程式
        processors:
          # 使用正則解析外掛程式解析日誌
          - Type: processor_parse_regex_native
            # 源欄位名
            SourceKey: content
            # 解析用的Regex,用擷取的群組"()"捕獲待提取的欄位
            Regex: (\d+-\d+-\d+\s*\d+:\d+:\d+)\s*(\S+)\s*(.*)
            # 提取的欄位列表
            Keys: ["time", "level", "msg"]
        # 定義輸出外掛程式
        flushers:
          # 使用flusher_sls外掛程式輸出到指定Logstore。
          - Type: flusher_sls
            # 需要確保該 Logstore 存在
            Logstore: k8s-file
            # 需要確保 endpoint 正確
            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採集配置,建立完成後自動生效。對於通過CR建立的iLogtail採集配置,其修改只能通過更新相應的CR來實現。

  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採集配置,以單行文字模式採集叢集內所有名稱開頭為app的Pod的容器內的/data/logs/app_1路徑下的test.LOG檔案,直接發送到名稱為k8s-file的Logstore,該Logstore屬於名稱為k8s-log-test的Project。”

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 設定資源名,在當前Kubernetes叢集內唯一。
      name: example-k8s-file
      namespace: kube-system
    spec:
      # 設定目標project名稱(可不填寫,預設為k8s-log-<your_cluster_id>)
      project: k8s-log-test
      # 設定Logstore名稱。如果您所指定的Logstore不存在,Log Service會自動建立。
      logstore: k8s-file
      # 設定iLogtail採集配置。
      logtailConfig:
        # 設定採集的資料來源類型。採集文本日誌時,需設定為file。
        inputType: file
        # 設定iLogtail採集配置的名稱。
        configName: example-k8s-file
        inputDetail:
          # 指定通過極簡模式採集文本日誌。
          logType: common_reg_log
          # 設定記錄檔所在路徑。
          logPath: /data/logs/app_1
          # 設定記錄檔的名稱。支援萬用字元星號(*)和半形問號(?),例如log_*.log。
          filePattern: test.LOG
          # 採集容器的文本日誌時,需設定dockerFile為true。
          dockerFile: true
          #設定容器過濾條件。
          advanced:
            k8s:
              K8sPodRegex: '^(app.*)$'
  4. 執行如下命令使其iLogtail採集配置生效。iLogtail採集配置生效後,Logtail開始採集各個容器上的文本日誌,並發送到Log Service中。

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

    kubectl apply -f cube.yaml
    重要

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

Log Service控制台

  1. 登入Log Service控制台

  2. 單擊控制台右側的快速接入資料,在接入資料地區單擊Kubernetes-檔案卡片。

    image

  3. 選擇目標Project和Logstore,單擊下一步。選擇您在安裝Logtail組件時所使用的Project。Logstore為您自訂建立的Logstore。

  4. 機器組配置頁面。

    1. 根據實際情境,單擊以下頁簽:

      • K8s情境 > ACK Daemonset

      • K8s情境 > 自建叢集Daemonset

        重要

        不同頁簽的後續配置步驟不同,請根據實際需求正確選擇。

    2. 確認目標機器組已在應用機器組列表中,然後單擊下一步。在ACK中安裝Logtail組件後,Simple Log Service自動建立名為k8s-group-${your_k8s_cluster_id}的機器組,您可以直接使用該機器組。

      重要
      • 如果需要建立機器組,請單擊建立機器組,按照右側面板進行建立。更多資訊,請參見通過控制台配置

      • 如果機器組心跳為FAIL,您可單擊自動重試。如果還未解決,請參見Logtail機器組無心跳進行排查。

  5. 建立Logtail採集配置,單擊下一步建立Logtail採集配置,Log Service開始採集日誌。

    說明

    Logtail採集配置生效時間最長需要3分鐘,請耐心等待。

    全域配置

    配置項

    說明

    配置名稱

    Logtail配置名稱,在其所屬Project內必須唯一。建立Logtail配置成功後,無法修改其名稱。

    日誌主題類型

    選擇日誌主題(Topic)的產生方式。更多資訊,請參見日誌主題

    • 機器組Topic:設定為機器組的Topic屬性,用於明確區分不同機器組產生的日誌。

    • 檔案路徑提取:設定為檔案路徑正則,則需要設定自訂正則,用Regex從路徑裡提取一部分內容作為Topic。用於區分不同源產生的日誌。

    • 自訂:自訂日誌主題。

    進階參數

    其它可選的與配置全域相關的進階功能參數,請參見建立Logtail流水線配置

    輸入配置

    參數名稱

    說明

    Logtail部署模式

    Logtail部署模式,選擇DaemonSet。

    檔案路徑類型

    選擇待採集的檔案路徑是容器內路徑或宿主機路徑。對於通過hostPath方式掛載資料卷的容器,如果您希望直接採集其在宿主機上映射的記錄檔,請選擇宿主機路徑,其餘情況請選擇容器內路徑。

    檔案路徑

    • 如果目標容器節點是Linux系統,則日誌路徑必須以正斜線(/)開頭,例如/apsara/nuwa/**/app.Log

    • 如果目標容器節點是Windows系統,則日誌路徑必須以盤符開頭,例如C:\Program Files\Intel\**\*.Log

    目錄名和檔案名稱均支援完整模式和萬用字元模式,檔案名稱規則請參見Wildcard matching。其中,日誌路徑萬用字元只支援星號(*)和半形問號(?)。

    記錄檔尋找模式為多層目錄匹配,即合格指定目錄(包含所有層級的目錄)下所有合格檔案都會被尋找到。例如:

    • /apsara/nuwa/**/*.log表示/apsara/nuwa目錄(包含該目錄的遞迴子目錄)中尾碼名為.log的檔案。

    • /var/logs/app_*/**/*.log表示/var/logs目錄下所有符合app_*格式的目錄(包含該目錄的遞迴子目錄)中尾碼名為.log的檔案。

    • /var/log/nginx/**/access*表示/var/log/nginx目錄(包含該目錄的遞迴子目錄)中以access開頭的檔案。

    最大目錄監控深度

    設定日誌目錄被監控的最大深度,即檔案路徑中萬用字元**匹配的最大目錄深度。0代表只監控本層目錄。

    警告

    請按最小需要原則配置目錄監控深度,過大的目錄深度導致Logtail佔用更多的監控資源,造成日誌採集延遲。

    啟用容器元資訊預覽

    開啟啟用容器元資訊預覽後,您可以在建立Logtail配置後,查看容器元資訊,包括匹配容器資訊和全量容器資訊。

    容器過濾

    • Logtail版本

      • Logtail 1.0.34以下版本,只支援通過環境變數容器Label進行容器過濾。

      • Logtail 1.0.34及以上版本,推薦使用Kubernetes層級的資訊(Pod名稱Namespace容器名稱容器Label等)進行容器過濾。

    • 過濾條件說明

      重要
      • 容器Label為Docker inspect中的Label,不是Kubernetes中的Label。如何擷取,請參見擷取容器Label

      • 環境變數為容器啟動中配置的環境變數資訊。如何擷取,請參見擷取容器環境變數

      1. Kubernetes中的Namespace和容器名稱會映射到容器Label中,分別為io.kubernetes.pod.namespaceio.kubernetes.container.name,推薦使用這兩個容器Label進行容器過濾。例如,某Pod所屬的命名空間為backend-prod,容器名為worker-server,如果您要採集包含該容器的日誌,可以設定容器Label白名單為io.kubernetes.pod.namespace : backend-prodio.kubernetes.container.name : worker-server

      2. 如果以上兩個容器Label不滿足過濾需求,請使用環境變數的黑白名單進行容器過濾。

    • K8s Pod名稱正則匹配

      通過Pod名稱指定待採集的容器,支援正則匹配。例如設定為^(nginx-log-demo.*)$,表示匹配以nginx-log-demo開頭的Pod下的所有容器。

    • K8s Namespace正則匹配

      通過Namespace名稱指定採集的容器,支援正則匹配。例如設定為^(default|nginx)$,表示匹配nginx命名空間、default命名空間下的所有容器。

    • K8s容器名稱正則匹配

      通過容器名稱指定待採集的容器(Kubernetes容器名稱是定義在spec.containers中),支援正則匹配。例如設定為^(container-test)$,表示匹配所有名為container-test的容器。

    • 容器label白名單

      通過容器Label白名單指定待採集的容器。

      重要

      請勿設定相同的標籤名,如果重名只生效一個。

      • 如果設定了標籤名但不設定標籤值,則容器Label中包含該標籤名的容器都匹配。

      • 如果設定了標籤名標籤值,則容器Label中包含該標籤名:標籤值的容器才匹配。

        標籤值預設為字串匹配,即只有標籤值和容器Label的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定標籤名app,設定標籤值^(test1|test2)$,表示匹配容器Label中包含app:test1app:test2的容器。

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

    • 容器label黑名單

      通過容器Label黑名單排除不採集的容器。

      重要

      請勿設定相同的標籤名,如果重名只生效一個。

      • 如果設定了標籤名但不設定標籤值,則容器Label中包含該標籤名的容器都被排除。

      • 如果設定了標籤名標籤值,則容器Label中包含該標籤名:標籤值的容器才會被排除。

        標籤值預設為字串匹配,即只有標籤值和容器Label的值完全相同才會被排除。如果該值以^開頭並且以$結尾,則為正則匹配。例如設定標籤名app,設定標籤值^(test1|test2)$,表示排除容器Label中包含app:test1、app:test2的容器。

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

    • 環境變數白名單

      通過環境變數白名單指定待採集的容器。

      • 如果設定了環境變數名但不設定環境變數值,則容器環境變數中包含該環境變數名的容器都匹配。

      • 如果設定了環境變數名環境變數值,則容器環境變數中包含該環境變數名和值的容器才匹配。

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

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

    • 環境變數黑名單

      通過環境變數黑名單排除不採集的容器。

      • 如果設定了環境變數名但不設定環境變數值,則容器環境變數中包含該環境變數名的容器的日誌都將被排除。

      • 如果設定了環境變數名環境變數值,則容器環境變數中包含該環境變數名和值的容器才會被排除。

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

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

    • K8s Pod標籤白名單

      通過Kubernetes Pod標籤白名單指定待採集的容器。

      • 如果設定了標籤名但不設定標籤值,則Pod標籤中包含該標籤名的容器都匹配。

      • 如果設定了標籤標籤值,則Pod標籤中包含該標籤名:標籤值的容器才匹配。

        標籤值預設為字串匹配,即只有標籤值和Pod標籤的值完全相同才會匹配。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定標籤名environment,設定標籤值^(dev|pre)$,表示匹配Pod標籤中包含environment:devenvironment:pre的容器。

      多個白名單之間為或關係,即只要Pod標籤滿足任一索引值對即可。

    • K8s Pod標籤黑名單

      通過Kubernetes Pod標籤黑名單排除不採集的容器。

      • 如果設定了標籤名但不設定標籤值,則Pod標籤中包含該標籤名的容器都將被排除。

      • 如果設定了標籤標籤值,則Pod標籤中包含該標籤名和標籤值的容器才會被排除。

        標籤值預設為字串匹配,即只有標籤值和Pod標籤的值完全相同才會被排除。如果該值以^開頭並且以$結尾,則為正則匹配,例如:設定標籤名environment,設定標籤值^(dev|pre)$,表示排除Pod標籤中包含environment:devenvironment:pre的容器。

      多個黑名單之間為或關係,即只要Pod標籤滿足任一索引值對即可被排除。

    日誌標籤富化

    環境變數相關tag和Pod標籤相關tag。

    檔案編碼

    記錄檔的編碼格式。

    首次採集大小

    配置首次生效時,匹配檔案的起始採集位置距離檔案結尾的大小。首次採集大小設定值為1024 KB。

    • 首次採集時,如果檔案小於1024 KB,則從檔案內容起始位置開始採集。

    • 首次採集時,如果檔案大於1024 KB,則從距離檔案末尾1024 KB的位置開始採集。

    您可以通過此處修改首次採集大小,取值範圍為0~10485760,單位為KB。

    採集黑名單

    開啟採集黑名單開關後,可進行黑名單配置,即可在採集時忽略指定的目錄或檔案。支援完整匹配和萬用字元匹配目錄和檔案名稱。其中,萬用字元只支援星號(*)和半形問號(?)。

    重要
    • 如果您在配置日誌路徑時使用了萬用字元,但又需要過濾掉其中部分路徑,則需在採集黑名單中填寫對應的完整路徑來保證黑名單配置生效。

      例如您配置日誌路徑/home/admin/app*/log/*.log,但要過濾/home/admin/app1*目錄下的所有子目錄,則需選擇目錄黑名單,配置目錄為/home/admin/app1*/** 。如果配置為/home/admin/app1*,黑名單不會生效。

    • 匹配黑名單過程存在計算開銷,建議黑名單條目數控制在10條內。

    • 目錄路徑不能以正斜線(/)結尾,例如將設定路徑為/home/admin/dir1/,目錄黑名單不會生效。

    支援按照檔案路徑黑名單、檔案黑名單、目錄黑名單設定,詳細說明如下:

    檔案路徑黑名單

    • 選擇檔案路徑黑名單,配置路徑為/home/admin/private*.log,則表示在採集時忽略/home/admin/目錄下所有以private開頭,以.log結尾的檔案。

    • 選擇檔案路徑黑名單,配置路徑為/home/admin/private*/*_inner.log,則表示在採集時忽略/home/admin/目錄下以private開頭的目錄內,以_inner.log結尾的檔案。例如/home/admin/private/app_inner.log檔案被忽略,/home/admin/private/app.log檔案被採集。

    檔案黑名單

    選擇檔案黑名單,設定檔名為app_inner.log,則表示採集時忽略所有名為app_inner.log的檔案。

    目錄黑名單

    • 選擇目錄黑名單,配置目錄為/home/admin/dir1,則表示在採集時忽略/home/admin/dir1目錄下的所有檔案。

    • 選擇目錄黑名單,配置目錄為/home/admin/dir*,則表示在採集時忽略/home/admin/目錄下所有以dir開頭的子目錄下的檔案。

    • 選擇目錄黑名單,配置目錄為/home/admin/*/dir,則表示在採集時忽略/home/admin/目錄下二級目錄名為dir的子目錄下的所有檔案。例如/home/admin/a/dir目錄下的檔案被忽略,/home/admin/a/b/dir目錄下的檔案被採集。

    允許檔案多次採集

    預設情況下,一個記錄檔只能匹配一個Logtail配置。如果檔案中的日誌需要被採集多份,需開啟允許檔案多次採集開關。

    進階參數

    Logtail配置的部分參數需要手動輸入,請參見建立Logtail流水線配置

    處理配置

    配置項

    說明

    日誌範例

    待採集日誌的範例,請務必使用實際情境的日誌。日誌範例可協助您配置Tlog相關參數,降低配置難度。支援添加多條範例,總長度不超過1500個字元。

    [2023-10-01T10:30:01,000] [INFO] java.lang.Exception: exception happened
        at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
        at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
        at TestPrintStackTrace.main(TestPrintStackTrace.java:16)

    多行模式

    • 多行日誌的類型:多行日誌是指每條日誌分布在連續的多行中,需要從日誌內容中區分出每一條日誌。

      • 自訂:通過行首Regex區分每一條日誌。

      • 多行JSON:每個JSON對象被展開為多行,例如:

        {
          "name": "John Doe",
          "age": 30,
          "address": {
            "city": "New York",
            "country": "USA"
          }
        }
    • 切分失敗處理方式:

      Exception in thread "main" java.lang.NullPointerException
          at com.example.MyClass.methodA(MyClass.java:12)
          at com.example.MyClass.methodB(MyClass.java:34)
          at com.example.MyClass.main(MyClass.java:½0)

      對於以上日誌內容,如果Log Service切分失敗:

      • 丟棄:直接丟棄這段日誌。

      • 保留單行:將每行日誌文本單獨保留為一條日誌,保留為一共四條日誌。

    處理模式

    處理外掛程式組合,包括原生外掛程式拓展外掛程式。有關處理外掛程式的更多資訊,請參見處理外掛程式概述

    重要

    處理外掛程式的使用限制,請以控制台頁面的提示為準。

    • 2.0版本的Logtail:

      • 原生處理外掛程式可任意組合。

      • 原生處理外掛程式和擴充處理外掛程式可同時使用,但擴充處理外掛程式只能出現在所有的原生處理外掛程式之後。

    • 低於2.0版本的Logtail:

      • 不支援同時添加原生外掛程式和擴充外掛程式。

      • 原生外掛程式僅可用於採集文本日誌。使用原生外掛程式時,須符合如下要求:

        • 第一個處理外掛程式必須為正則解析外掛程式、分隔字元模式解析外掛程式、JSON解析外掛程式、Nginx模式解析外掛程式、Apache模式解析外掛程式或IIS模式解析外掛程式。

        • 從第二個處理外掛程式到最後一個處理外掛程式,最多包括1個時間解析處理外掛程式,1個過濾處理外掛程式和多個脫敏處理外掛程式。

      • 對於解析失敗時保留原始欄位解析成功時保留原始欄位參數,只有以下組合有效,其餘組合無效。

        • 只上傳解析成功的日誌:

          image

        • 解析成功時上傳解析後的日誌,解析失敗時上傳原始日誌:

          image

        • 解析成功時不僅上傳解析後的日誌,並且追加原始日誌欄位,解析失敗時上傳原始日誌。

          例如,原始日誌"content": "{"request_method":"GET", "request_time":"200"}"解析成功,追加原始欄位是在解析後日誌的基礎上再增加一個欄位,欄位名為重新命名的原始欄位(如果不填則預設為原始欄位名),欄位值為原始日誌{"request_method":"GET", "request_time":"200"}

          image

  6. 建立索引預覽資料,然後單擊下一步。Log Service預設開啟全文索引。您也可以根據採集到的日誌,手動建立欄位索引,或者單擊自動產生索引,Log Service將自動產生欄位索引。更多資訊,請參見建立索引

    重要

    如果需要查詢日誌中的所有欄位,建議使用全文索引。如果只需查詢部分欄位、建議使用欄位索引,減少索引流量。如果需要對欄位進行分析(SELECT語句),必須建立欄位索引。

  7. 單擊查詢日誌,系統將跳轉至Logstore查詢分析頁面。

    您需要等待1分鐘左右,待索引生效後,才能在原始日誌頁簽中,查看已採集到的日誌。更多資訊,請參見查詢和分析日誌

環境變數

1. 建立服務時配置Log Service

您可以在建立Knative服務時參見下方YAML模板配置日誌採集。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Knative

  3. 單擊服務管理頁簽,選擇命名空間後單擊使用模組建立,選擇樣本模板為自訂模板,按照頁面指引參見以下YAML檔案完成建立。

    YAML模板的文法同Kubernetes文法,但是為了給容器指定採集配置,需要使用env來為容器增加採集配置自訂Tag,並根據採集配置,建立對應的volumeMountsvolumes。以下是一個簡單的Pod樣本。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go-log
    spec:
      template:
        spec:
          containers:
          - name: my-demo-app
            image: 'registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest'
            env:
            # 配置環境變數
            - name: aliyun_logs_log-stdout
              value: stdout
            - name: aliyun_logs_log-varlog
              value: /var/demo/*.log
            - name: aliyun_logs_mytag1_tags
              value: tag1=v1
            # 配置volume mount
            volumeMounts:
            - name: volumn-sls-mydemo
              mountPath: /var/demo
            # 如果Pod不斷重啟,啟動參數可以添加sleep
            command: ["sh", "-c"]  # 使用shell來運行命令
            args: ["sleep 3600"]   # 設定休眠時間為1小時(3600秒)
          volumes:
          - name: volumn-sls-mydemo
            emptyDir: {}

    根據您的需求,按照以下順序進行配置。

    說明

    如果您有更多的日誌採集需求,請參見(可選)2. 配置環境變數的進階參數

    1. 通過環境變數來建立您的採集配置自訂Tag,所有與配置相關的環境變數都採用aliyun_logs_作為首碼。

      • 建立採集配置的規則如下:

        - name: aliyun_logs_log-stdout
          value: stdout
        - name: aliyun_logs_log-varlog
          value: /var/demo/*.log                        

        樣本中建立了兩個採集配置,格式為aliyun_logs_{key},對應的{key}分別為log-stdoutlog-varlog

        • aliyun_logs_log-stdout:該env表示建立一個名為log-stdoutLogstore,日誌採集路徑為stdout的配置,對應的Log Service採集配置名稱也是log-stdout,目的是將容器的標準輸出採集到log-stdout這個Logstore中。

        • aliyun_logs_log-varlog:該env表示建立一個Logstore名為log-varlog,日誌採集路徑為/var/demo/*.log的配置,對應的Log Service採集配置名稱也是log-varlog,目的是將容器的/var/demo/*.log檔案內容採集到log-varlog這個Logstore中。

      • 建立自訂Tag的規則如下:

        - name: aliyun_logs_mytag1_tags
          value: tag1=v1                       

        配置Tag後,當採集到該容器的日誌時,會自動附加對應的欄位到Log Service。其中mytag1任意不包含'_'的名稱

    2. 如果您的採集配置中指定了非stdout的採集路徑,需要在此部分建立相應的volumeMounts

      樣本中採集配置添加了對/var/demo/*.log的採集,因此相應地添加了/var/demo的volumeMounts

  4. 當YAML編寫完成後,單擊建立,即可將相應的配置交由Kubernetes叢集執行。

(可選)2. 配置環境變數的進階參數

通過容器環境變數配置採集支援多種配置參數。您可以根據實際需求設定進階參數,以滿足日誌採集的特殊需求。

重要

通過容器環境變數配置採集日誌的方式不適用於邊緣情境。

欄位

說明

樣本

注意事項

aliyun_logs_{key}

  • 必選項。{key}只能包含小寫字母、數字和-。

  • 若不存在aliyun_logs_{key}_logstore,則預設建立並採集到名為{key}的logstore。

  • 當值為stdout時表示採集容器的標準輸出;其他值為容器內的日誌路徑。

  • - name: aliyun_logs_catalina
    
      value: stdout
  • - name: aliyun_logs_access-log
    
      value: /var/log/nginx/access.log

aliyun_logs_{key}_tags

可選。值為{tag-key}={tag-value}類型,用於對日誌進行標識。

- name: aliyun_logs_catalina_tags

  value: app=catalina

不涉及。

aliyun_logs_{key}_project

可選。值為指定的Log ServiceProject。當不存在該環境變數時,為您安裝時所選的Project。

- name: aliyun_logs_catalina_project

  value: my-k8s-project

Project需與您的Logtail工作所在的Region一致。

aliyun_logs_{key}_logstore

可選。值為指定的Log ServiceLogstore。當不存在該環境變數時,Logstore和{key}一致。

- name: aliyun_logs_catalina_logstore

  value: my-logstore

不涉及。

aliyun_logs_{key}_shard

可選。值為建立Logstore時的shard數,取值範圍為[1 , 10]。當不存在該環境變數時,值為2。

說明

若logstore已經存在,則該參數不生效。

- name: aliyun_logs_catalina_shard

  value: '4'

不涉及。

aliyun_logs_{key}_ttl

可選。值為指定的日誌儲存時間,取值範圍為[1 , 3650]。

  • 當取值為3650時,指定日誌的儲存時間為永久儲存。

  • 當不存在該環境變數時,預設指定日誌的儲存時間為90天。

說明

若Logstore已經存在,則該參數不生效。

- name: aliyun_logs_catalina_ttl

  value: '3650'

不涉及。

aliyun_logs_{key}_machinegroup

可選。值為應用的機器組。當不存在該環境變數時與安裝Logtail的預設機器組一致。關於該參數的詳細使用方法,請參見下文的定製需求2:將不同應用資料擷取到不同的Project

- name: aliyun_logs_catalina_machinegroup

  value: my-machine-group

不涉及。

aliyun_logs_{key}_logstoremode

可選。值為指定的Log ServiceLogstore的類型,不指定該參數的話,預設值為standard,取值:

說明

若Logstore已經存在,則該參數不生效。

  • standard:支援Log Service一站式資料分析功能,適用於即時監控、互動式分析以及構建完整的可觀測性系統等情境。

  • query:支援高效能查詢,索引流量費用約為standard的一半,但不支援SQL分析,適用於資料量大、儲存周期長(周、月層級以上)、無日誌分析的情境。

  • - name: aliyun_logs_catalina_logstoremode
      value: standard 
  • - name: aliyun_logs_catalina_logstoremode
      value: query 

該參數需要logtail-ds鏡像版本>=1.3.1。

步驟三:查詢分析日誌

Logtail採集到的容器日誌會儲存在SLS Logstore中。您可以在Log Service控制台查看,也可以在ACK控制台查看。查詢文法的介紹,請參見查詢概述

ACK控制台

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 日誌中心

  3. 日誌中心頁面,單擊應用日誌頁簽,設定檢索條件後單擊選擇日誌庫,查看應用程式容器的相關日誌。

SLS控制台

  1. 安裝成功後,進入Log Service控制台

  2. 在進入控制台後,在Project列表地區選取項目Kubernetes叢集對應的Project(預設為k8s-log-{Kubernetes叢集ID}),進入日誌庫列表頁簽。

  3. 在列表中找到相應的Logstore(採集配置中指定),將滑鼠懸浮在相應的Logstore名稱的右側,單擊button表徵圖,並單擊查詢分析

    本例中,在日誌查詢頁面,您可以查看Tomcat應用的標準輸出日誌和容器內文本日誌,並可以發現自訂tag附加到日誌欄位中。

容器日誌文本預設欄位

每條容器文本日誌預設包含的欄位如下表所示。

欄位名稱

說明

__tag__:__hostname__

容器宿主機的名稱。

__tag__:__path__

容器內記錄檔的路徑。

__tag__:_container_ip_

容器的IP地址。

__tag__:_image_name_

容器使用的鏡像名稱。

__tag__:_pod_name_

Pod的名稱。

__tag__:_namespace_

Pod所屬的命名空間。

__tag__:_pod_uid_

Pod的唯一識別碼(UID)。

相關文檔