全部產品
Search
文件中心

Simple Log Service:通過Kubernetes CRD採集叢集容器日誌(標準輸出/檔案)

更新時間:Nov 05, 2025

為了統一管理阿里雲Container ServiceACK叢集或自建 Kubernetes 叢集在多環境、多叢集情境下的日誌採集配置,避免因手動設定導致的不一致、效率低下及變更不可追溯等問題,可採用Kubernetes 的自訂資源(CRD)方式定義採集配置。通過該方式,無論是 ACK 叢集還是自建 Kubernetes 叢集,均可使用 kubectl 或 CI/CD 流水線實現配置的版本化管理、環境差異化部署和自動化發布。結合 LoongCollector 的熱載入能力,配置變更後可立即生效,無需重啟採集組件,提升營運效率與系統的可維護性。

舊版CRD-AliyunLogConfig的配置方式已停止維護,請使用新版AliyunPipelineConfig,新舊版的能力對比請參見CRD類型
重要

對於通過自訂資源(CRD)建立的採集配置,只能通過更新對應的CRD進行修改。在Log Service控制台上所做的更改不會同步至CRD,也不會生效。

適用範圍

  • 運行環境:

    • 支援阿里雲Container ServiceACK(託管與專有版)和自建Kubernetes 叢集。

    • Kubernetes為1.16.0及以上版本且支援Mount propagation: HostToContainer

    • 容器運行時(僅支援Docker與Containerd)

      • Docker:

        • 需具備訪問docker.sock的許可權。

        • 標準輸出採集僅支援JSON類型的日誌驅動。

        • 儲存驅動僅支援overlay、overlay2兩種儲存驅動(其他類型需手動掛載日誌目錄)。

      • Containerd:需具備訪問containerd.sock的許可權。

  • 資源要求:LoongCollector(Logtail)以system-cluster-critical高優先順序運行,叢集資源不足時請勿部署,否則可能驅逐節點上原有的Pod。

    • CPU:至少預留0.1 Core

    • 記憶體:採集組件至少150MB,控制器組件至少100MB

    • 實際使用量與採集速率、監控目錄和檔案數量、發送阻塞程度有關,請保證實際使用率低於限制值的80%。

  • 許可權要求:部署使用的阿里雲主帳號或子帳號需具備AliyunLogFullAccess許可權。

    如需自訂權限原則,請參考AliyunCSManagedLogRolePolicy系統策略,將其包含的許可權內容複寫並賦予目標 RAM 使用者或角色,以實現精細化的許可權配置。

採集配置建立流程

  1. 安裝LoongCollector通過DaemonSet模式部署LoongCollector確保叢集中每個節點均運行一個採集容器,統一採集該節點上所有容器的日誌。

  2. 建立LogstoreLogstore是日誌資料的儲存單元,用於儲存日誌。一個 Project 內可建立多個 Logstore。

  3. 建立採集配置YAML檔案:使用kubectl串連叢集,您可以通過以下兩種方式建立採集設定檔:

    • 方式一:使用採集配置產生器

      通過Log Service控制台的採集配置產生器,可視化填寫參數,自動產生標準YAML檔案。

    • 方式二:手動編寫YAML

      結合本文檔提供的典型情境樣本與配置流程,根據實際業務需求手動編寫 YAML 檔案。建議按本文結構逐步構建配置:從極簡配置起步 → 添加處理邏輯 → 啟用進階功能。

      對於本文未覆蓋的複雜情境或需要深度定製的欄位,可進一步參考AliyunPipelineConfig參數說明,擷取完整欄位列表、取值規則及外掛程式能力詳情。

    一個完整的採集配置通常包含以下部分:

    • 極簡配置(必選):構建從叢集到Log Service的資料通道。包含兩部分:

      • 輸入(inputs):定義日誌的來源。容器內日誌包含以下兩種日誌源,如需採集其他類型日誌(如MySQL查詢結果)請參考輸入外掛程式

        • 容器標準輸出(stdout與stderr):容器程式列印到控制台的日誌內容。

        • 文本記錄檔:容器內部寫入指定路徑下的記錄檔。

      • 輸出(flushers):定義日誌發送目標,將採集的日誌發送至指定的Logstore。

        若目標Project或Logstore不存在,系統將自動建立。您也可以選擇提前手動建立 ProjectLogstore
    • 常用處理配置(可選):通過定義processors欄位,對原始日誌進行結構化解析(如正則解析、分隔字元解析)或脫敏、過濾處理等。

      本文僅介紹原生處理外掛程式,覆蓋常見Tlog情境,如需更多功能,請參考擴充處理外掛程式
    • 其他進階配置(可選):實現多行文本日誌的採集、日誌標籤富化等,滿足更精細化的採集需求。

    結構樣本:

    apiVersion: telemetry.alibabacloud.com/v1alpha1 # 使用預設值,無需修改。
    kind: ClusterAliyunPipelineConfig               # 使用預設值,無需修改。
    metadata:
      name: test-config                             # 設定資源名,在當前Kubernetes叢集內唯一。
    spec:
      project:                                      # 設定目標Project名稱。
        name: k8s-your-project                      
      config:                                       # 設定Logtail採集配置。
        inputs:                                     # 設定Logtail採集配置裡的輸入外掛程式
          ...
        processors:                                 # 設定Logtail採集配置的處理外掛程式
          ...
        flushers:                                   # 設定Logtail採集配置裡的輸出外掛程式
          ...
  4. 應用配置

    kubectl apply -f <your_yaml>

安裝LoongCollector(Logtail)

LoongCollector 是阿里雲Log Service(SLS)推出的新一代日誌採集 Agent,是 Logtail 的升級版,二者不能同時存在,如需安裝Logtail,請參考Logtail安裝與配置

本文僅介紹LoongCollector的基礎安裝步驟,如需瞭解詳細參數請參考LoongCollector安裝(Kubernetes)。如果您已安裝LoongCollector或Logtail,可跳過此步驟,直接建立儲存採集日誌的Logstore

ACK叢集

通過Container Service控制台安裝LoongCollector,預設將日誌發送到當前阿里雲帳號的Log ServiceProject中。

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

  2. 叢集列表頁面,單擊目的地組群名稱,進入叢集詳情頁。

  3. 在左側導覽列,單擊組件管理

  4. 日誌與監控頁簽中,找到loongcollector,單擊安裝

    說明

    對於建立叢集,在組件配置頁面,勾選使用Log Service,支援建立新Project使用已有Project

    安裝完成後,Log Service會自動在ACK所屬地區下建立相關資源,您可登入Log Service控制台查看

    資源類型

    資源名稱

    作用

    Project

    k8s-log-${cluster_id}

    資源嵌入式管理單元,隔離不同業務日誌。

    如需自行建立Project以實現更靈活的日誌資源管理,請參考建立Project

    機器組

    k8s-group-${cluster_id}

    日誌採集節點集合。

    Logstore

    config-operation-log

    重要

    請不要刪除該Logstore。

    用於儲存loongcollector-operator組件的日誌,其計費方式與普通Logstore相同,詳見按寫入資料量計費模式計費項目建議不要在此Logstore下建立採集配置。

自建叢集

  1. 串連Kubernetes叢集,並根據地區選擇對應命令,下載LoongCollector及其相依元件:

    中國地區:

    wget https://aliyun-observability-release-cn-shanghai.oss-cn-shanghai.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh

    海外地區:

    wget https://aliyun-observability-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh
  2. 進入loongcollector-custom-k8s-package目錄,修改設定檔./loongcollector/values.yaml

    # ===================== 必需要補充的內容 =====================
    # 管理採集日誌的Project名,例如 k8s-log-custom-sd89ehdq。
    projectName: ""
    # Project所屬地區,例如上海:cn-shanghai
    region: ""
    # Project所屬主帳號uid,請用引號包圍,例如"123456789"
    aliUid: ""
    # 使用網路,選擇性參數:公網Internet,內網Intranet,預設使用公網
    net: Internet
    # 主帳號或者子帳號的AK,SK,需具備AliyunLogFullAccess系統策略許可權
    accessKeyID: ""
    accessKeySecret: ""
    # 自訂叢集ID,命名只支援大小寫,數字,短劃線(-)。
    clusterID: ""
  3. loongcollector-custom-k8s-package目錄下執行如下命令,安裝LoongCollector及其他相依元件:

    bash k8s-custom-install.sh install
  4. 安裝完成後,查看組件運行狀態。

    若Pod未成功啟動,請確認values.yaml配置是否正確,相關鏡像拉取是否成功。
    # 檢查Pod狀態
    kubectl get po -n kube-system | grep loongcollector-ds

    同時,Log Service會自動建立如下資源,可登入Log Service控制台查看

    資源類型

    資源名稱

    作用

    Project

    values.yaml檔案中自訂的projectName的值

    資源嵌入式管理單元,隔離不同業務日誌。

    機器組

    k8s-group-${cluster_id}

    日誌採集節點集合。

    Logstore

    config-operation-log

    重要

    請不要刪除該Logstore。

    儲存loongcollector-operator組件的日誌,其計費方式與普通Logstore相同,詳見按寫入資料量計費模式計費項目。建議不要在此Logstore下建立採集配置。

建立Logstore

若您已提前建立好Logstore,可直接跳過此步驟,進行採集配置

  1. 登入Log Service控制台,單擊目標Project名稱。

  2. 在左側導覽列,選擇image日誌儲存,單擊+

  3. 在建立Logstore頁面,完成以下核心配置:

    • Logstore名稱:設定一個在Project內唯一的名稱。該名稱建立後不可修改。

    • Logstore類型:根據規格對比選擇標準型或查詢型。

    • 計費模式

      • 按使用功能計費:按儲存、索引、讀寫次數等各項資源獨立計費。適合小規模或功能使用不確定的情境。

      • 按寫入資料量計費:僅按原始寫入資料量計費,並提供30天的免費儲存周期及免費的資料加工、投遞等功能。成本模型簡單,適合儲存周期接近30天或資料處理鏈路複雜的情境。

    • 資料儲存時間:設定日誌的保留天數,取值範圍為1~3650天(3650天表示永久儲存)。預設為30天。

  4. 其他配置保持預設,單擊確定。如需瞭解其他配置資訊,請參考管理Logstore

極簡配置

spec.config中,通過配置輸入(inputs)與輸出(flushers)外掛程式,定義日誌採集的核心路徑:從哪裡採集日誌,以及日誌要發送到哪裡。

容器標準輸出-新版

用途:採集直接列印到控制台的容器標準輸出日誌(stdout/stderr)。

inputs 輸入外掛程式

採集配置的起點,定義日誌來源。目前只允許配置1個輸入外掛程式。

  • Type String (必選)

    外掛程式類型,固定為input_container_stdio

  • IgnoringStderr boolean (可選)

    是否忽略標準錯誤流(stderr),預設為false

    • true:不採集stderr

    • false:採集stderr

  • IgnoringStdout boolean (可選)

    是否忽略標準輸出資料流(stdout),預設為false

    • true:不採集stdout

    • false:採集stdout

樣本

apiVersion: telemetry.alibabacloud.com/v1alpha1
kind: ClusterAliyunPipelineConfig
metadata:
  # 設定資源名,在當前Kubernetes叢集內唯一,也是建立出的Logtail採集配置名。
  name: new-stdio-config
spec:
  project:
    name: test-not-exist
  logstores:
    - name: new-stdio-logstore

  # 定義LoongCollector(Logtail)採集與處理配置。
  config:
    # --- 輸入外掛程式:定義從哪裡採集日誌 ---
    inputs:
      # 使用input_file外掛程式採集容器內文本日誌
      - Type: input_container_stdio
        IgnoringStderr: false
        IgnoringStdout: false

    # --- 處理外掛程式(可選):定義如何解析和處理日誌 ---
    processors: []

    # --- 輸出外掛程式:定義將日誌發送到哪裡 ---
    flushers:
      - Type: flusher_sls    # 指定使用SLS輸出外掛程式
        Logstore: new-stdio-logstore   

flushers 輸出外掛程式

通過配置flusher_sls 外掛程式,將採集到的日誌發送至指定Project下的Logstore。目前只允許配置1個輸出外掛程式。

  • Type String (必選)

    外掛程式類型,固定為flusher_sls

  • Logstore String (必選)

    目標Logstrore 名稱,決定日誌的實際儲存位置。

    說明

    指定Logstore必須存在或已在 spec.logstores 中聲明。

採集容器內文字檔

用途:採集寫入到容器內特定檔案路徑的日誌,如傳統的access.log或app.log。

inputs輸入外掛程式

採集配置的起點,定義日誌來源。目前只允許配置1個輸入外掛程式。

  • Type String (必選)

    外掛程式類型,固定為input_file

  • FilePaths String (必選)

    待採集的記錄檔路徑列表。

    • 目前僅支援配置1個路徑。

    • 支援萬用字元:

      • *:匹配單層目錄中的檔案名稱

      • **:遞迴匹配多級子目錄(僅能出現一次,且必須位於檔案名稱前)

  • MaxDirSearchDepth integer (可選)

    當路徑中包含**時,指定通最大目錄深度,預設為0,取值範圍:0~1000。

  • FileEncoding String (可選)

    檔案編碼格式,預設為utf8。可選值:

    • utf8

    • gbk

  • EnableContainerDiscovery boolean (可選)

    是否啟用容器發現功能,預設為true

    說明

    僅當LoongCollector(Logtail)以Daemonset模式運行,且採集檔案路徑為容器內路徑時有效。

樣本

apiVersion: telemetry.alibabacloud.com/v1alpha1
kind: ClusterAliyunPipelineConfig
metadata:
  name: easy-row-config
spec:
  # 指定日誌要發送到的目標Project。
  project:
    name: test-not-exist
  logstores:
    - name: easy-row-logstore

  # 定義LoongCollector(Logtail)採集與處理配置。
  config:
    # 日誌範例(可不填寫)
    sample: ''
    # --- 輸入外掛程式:定義從哪裡採集日誌 ---
    inputs:
      # 使用input_file外掛程式採集容器內文本日誌
      - Type: input_file         
        # ... 此處為輸入外掛程式的具體配置 ...
        # 容器內的檔案路徑
        FilePaths:
          - /var/log/text1.log
        # 最大目錄監控深度  
        MaxDirSearchDepth: 0
        FileEncoding: utf8  
        # 啟用容器發現功能。
        EnableContainerDiscovery: true
        

    # --- 處理外掛程式(可選):定義如何解析和處理日誌 ---
    processors: []    

    # --- 輸出外掛程式:定義將日誌發送到哪裡 ---
    flushers:
      - Type: flusher_sls        # 指定使用SLS輸出外掛程式
        Logstore: easy-row-logstore

flushers輸出外掛程式

通過flusher_sls 外掛程式,將採集到的日誌發送至指定Project下的Logstore。目前只允許配置1個輸出外掛程式。

  • Type String (必選)

    外掛程式類型,固定為flusher_sls

  • Logstore String (必選)

    目標Logstore 名稱,決定日誌的實際儲存位置。

    說明

    指定Logstore必須存在或已在 spec.logstores 中聲明。

常用處理配置

在完成極簡配置後,您可以通過添加processors外掛程式進行處理配置,將原始日誌進行結構化解析或脫敏、過濾處理。

核心配置:在spec.config中添加processors,配置處理外掛程式,支援同時啟用多個外掛程式。

此處僅介紹原生處理外掛程式,覆蓋常見Tlog情境,如需更多功能,請參考擴充處理外掛程式
重要

對於Logtail 2.0及以上版本以及LoongCollector組件,推薦遵循以下外掛程式組合規則:

  • 優先使用原生外掛程式。

  • 當原生外掛程式無法滿足需求時,可在原生外掛程式後配置擴充外掛程式。

  • 原生外掛程式只能在擴充外掛程式之前使用。

結構化配置

正則解析

通過Regex提取日誌欄位,並將日誌解析為索引值對形式。

關鍵字段

樣本

Type String (必選)

外掛程式類型,固定為processor_parse_regex_native

 # ...在 spec.config下...
 processors:
  # 使用Regex解析外掛程式解析日誌內容
  - Type: processor_parse_regex_native
    # 指定原始日誌欄位來源,通常為 content
    SourceKey: content

    # Regex用於匹配並提取日誌欄位
    Regex: >-
      (\S+)\s-\s(\S+)\s$$([^]]+)$$\s"
      (\w+)\s(\S+)\s([^"]+)"
      \s(\d+)\s(\d+)\s"
      ([^"]+)"\s"
      ([^"]+).*

    # 提取欄位列表,按正則分組順序對應
    Keys:
      - remote_addr
      - remote_user
      - time_local
      - request_method
      - request_uri
      - request_protocol
      - status
      - body_bytes_sent
      - http_referer
      - http_user_agent

    # 解析失敗時是否保留原始欄位
    KeepingSourceWhenParseFail: true

    # 解析成功時是否保留原始欄位
    KeepingSourceWhenParseSucceed: true

    # 如果保留原始欄位,可以指定重新命名後的欄位名
    RenamedSourceKey: fail

SourceKey String (必選)

源欄位名。

Regex String (必選)

匹配日誌的Regex。

Keys String (必選)

提取的欄位列表。

KeepingSourceWhenParseFail boolean (可選)

解析失敗時,是否保留源欄位,預設為false

KeepingSourceWhenParseSucceed boolean (可選)

解析成功時,是否保留源欄位,預設為false

RenamedSourceKey String (可選)

保留源欄位時,用於儲存源欄位的欄位名,預設不改名。

分隔字元解析

通過分隔字元將日誌內容結構化,解析為多個索引值對形式。支援單字元分隔字元和多字元分隔字元。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,固定值processor_parse_delimiter_native

# ...在 spec.config下...
processors:
  # 分隔字元解析外掛程式配置
  - Type: processor_parse_delimiter_native
    # 原始欄位來源,通常為 content
    SourceKey: content

    Separator: ','

    Quote: '"'

    # 按順序定義提取後的欄位名
    Keys:
      - time
      - ip
      - request
      - status
      - size
      - user_agent

SourceKey String (必選)

源欄位名。

Separator String (必選)

欄位分隔符號,例如 CSV 使用逗號 (,)。

Keys [String] (必選)

提取的欄位列表。

Quote String (可選)

引用符,用於包裹包含特殊字元(如逗號)的欄位內容。

AllowingShortenedFields boolean (可選)

是否允許提取的欄位數量小於 Keys 的數量,預設為true。若不允許,則此情景會被視為解析失敗。

OverflowedFieldsTreatment String (可選)

當提取的欄位數量大於 Keys 的數量時的行為,預設為extend。可選值包括:

  • extend:保留多餘的欄位,且每個多餘的欄位都作為單獨的一個欄位加入日誌,多餘欄位的欄位名為_column$i_,其中$i 代表額外欄位序號,從 0 開始計數。

  • keep:保留多餘的欄位,但將多餘內容作為一個整體欄位加入日誌,欄位名為_column0_

  • discard:丟棄多餘的欄位。

KeepingSourceWhenParseFail boolean (可選)

解析失敗時,是否保留源欄位,預設為false

KeepingSourceWhenParseSucceed boolean (可選)

解析成功時,是否保留源欄位,預設為false

RenamedSourceKey String (可選)

保留源欄位時,用於儲存源欄位的欄位名,預設不改名。

標準JSON解析

將Object類型的JSON日誌結構化,解析為索引值對形式。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,固定值為processor_parse_json_native

# ...在 spec.config下...
processors:
  # JSON 解析外掛程式配置
  - Type: processor_parse_json_native
    # 原始日誌欄位來源
    SourceKey: content

SourceKey String (必選)

源欄位名。

KeepingSourceWhenParseFail boolean (可選)

解析失敗時,是否保留源欄位,預設為false

KeepingSourceWhenParseSucceed boolean (可選)

解析成功時,是否保留源欄位,預設為false

RenamedSourceKey String (可選)

保留源欄位時,用於儲存源欄位的欄位名,預設不改名。

嵌套JSON解析

通過指定展開深度,將嵌套的JSON日誌解析為索引值對形式。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,固定值processor_json

# ...在 spec.config下...
processors:
  # 配置 JSON 欄位展開外掛程式
  - Type: processor_json
    # 指定需要解析的原始欄位名
    SourceKey: content
    
    ExpandDepth: 0

    ExpandConnector: '_'

    Prefix: expand

    IgnoreFirstConnector: false

    # 是否展開數組元素為獨立欄位
    ExpandArray: false

    # 是否保留原始欄位內容
    KeepSource: true

    # 當原始欄位缺失時是否報錯
    NoKeyError: true

    # 是否將原始欄位名作為展開欄位名的首碼
    UseSourceKeyAsPrefix: false

    # 如果 JSON 解析失敗,是否保留原始日誌資料
    KeepSourceIfParseError: true

SourceKey String (必選)

源欄位名。

ExpandDepth integer (可選)

JSON 展開深度,預設值為0。

  • 0:表示展開到能解析成功的最深層級;

  • 1:表示僅展開當前層級,以此類推。

ExpandConnector String (可選)

JSON 展開時欄位名的串連符,預設為底線(_)。

Prefix String (可選)

指定 JSON 展開後欄位名的首碼。

IgnoreFirstConnector String (可選)

是否忽略第一個串連符,即是否在頂級欄位前添加串連符,預設為false

ExpandArray boolean (可選)

是否展開數群組類型,預設為false

  • false(預設值):不展開。

  • true:展開。例如{"k":["1","2"]}展開為{"k[0]":"1","k[1]":"2"}

說明

Logtail 1.8.0 及以上版本支援該參數。

KeepSource boolean (可選)

被解析後的日誌中是否保留原始欄位,預設為true

  • true:保留

  • false:丟棄

NoKeyError boolean (可選)

原始日誌中沒有指定的原始欄位時,系統是否報錯,預設為true

  • true:報錯

  • false:不報錯

UseSourceKeyAsPrefix boolean (可選)

是否將原始欄位名作為所有 JSON 展開欄位名的首碼。

KeepSourceIfParseError boolean (可選)

解析日誌失敗時,是否保留原始日誌,預設為true

  • true:保留

  • false:丟棄

JSON數組解析

使用json_extract函數,從JSON數組中提取JSON對象,更多json函數請參考JSON函數

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,SPL外掛程式類型為processor_spl

# ...在 spec.config下...
processors:
  # 使用 SPL 指令碼處理日誌欄位
  - Type: processor_spl
    # 指令碼逾時時間(單位:毫秒)
    TimeoutMilliSeconds: 1000

    # SPL 指令碼內容,用於從 content 欄位中提取 JSON 數組中的元素
    Script: >-
      * | extend
        json1 = json_extract(content, '$[0]'),
        json2 = json_extract(content, '$[1]')

Script String (必選)

SPL 指令碼內容,用於從 content 欄位中提取 JSON 數組中的元素。

TimeoutMilliSeconds integer (可選)

指令碼逾時時間,取值範圍0~10000,單位為毫秒,預設1000。

Nginx日誌解析

根據log_format中的定義將日誌內容結構化,解析為多個索引值對形式。如預設內容不符合您的需求,可使用自訂格式。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,Nginx日誌解析的外掛程式類型為processor_parse_regex_native

# ...在 spec.config下...
processors:
  # NGINX 日誌解析外掛程式配置
  - Type: processor_parse_regex_native
    # 原始日誌欄位來源
    SourceKey: content
    
    # Regex解析規則
    Regex: >-
      (\S*)\s*-\s*(\S*)\s*\[
      (\d+/\S+/\d+:\d+:\d+:\d+)\s+\S+\]
      \s*"(\S+)\s+(\S+)\s+\S+"
      \s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*)
      \s*"([^"]*)"\s*"([^"]*)".*
    
    # 提取欄位對應
    Keys:
      - remote_addr
      - remote_user
      - time_local
      - request_method
      - request_uri
      - request_time
      - request_length
      - status
      - body_bytes_sent
      - http_referer
      - http_user_agent
    
    # NGINX 特定配置
    Extra:
      Format: >-
        log_format main  '$remote_addr - $remote_user [$time_local]
        "$request" ''$request_time $request_length ''$status
        $body_bytes_sent "$http_referer" ''"$http_user_agent"';
      LogType: NGINX

SourceKey String (必選)

源欄位名。

Regex integer (必選)

Regex。

Keys String (必選)

提取的欄位列表。

Extra

  • Format String (必選)

    Nginx設定檔中的日誌配置部分,以log_format開頭。

    生產環境中,此處的log_format必須與Nginx設定檔(通常位於  /etc/nginx/nginx.conf檔案中)中的定義保持一致。
  • LogType String (必選)

    解析日誌類型,固定值為NGINX

KeepingSourceWhenParseFail boolean (可選)

解析失敗時是否保留原始欄位,預設為false

KeepingSourceWhenParseSucceed boolean (可選)

解析成功時是否保留原始欄位,預設為false

RenamedSourceKey String (可選)

保留原始欄位時,用於儲存原始的欄位名,預設不改名。

Apache日誌解析

根據Apache日誌設定檔中的定義將日誌內容結構化,解析為多個索引值對形式。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,固定值為processor_parse_regex_native

# ...在 spec.config下...
processors:
  # 配置 Apache Combined 日誌解析外掛程式(基於Regex)
  - Type: processor_parse_regex_native
    # 原始日誌欄位來源,通常為 content
    SourceKey: content

    # Regex用於匹配並提取 Apache combined 格式日誌
    Regex: >-
      ([0-9.-]+)\s                          # remote_addr
      ([\w.-]+)\s                           # remote_ident
      ([\w.-]+)\s                           # remote_user
      (\[[^\[\]]+\]|-)\s                    # time_local
      "((?:[^"]|\")+)"\s                     # request_method + request_uri + request_protocol
      "((?:[^"]|\")+)"\s                     # request_uri(重複捕獲?需注意邏輯)
      "((?:[^"]|\")+)"\s                     # request_protocol
      (\d{3}|-)\s                           # status
      (\d+|-)\s                             # response_size_bytes
      "((?:[^"]|\")+)"\s                     # http_referer
      "((?:[^"]|\"|')+)"                     # http_user_agent

    # 提取欄位列表,按正則分組順序對應
    Keys:
      - remote_addr
      - remote_ident
      - remote_user
      - time_local
      - request_method
      - request_uri
      - request_protocol
      - status
      - response_size_bytes
      - http_referer
      - http_user_agent

    # 外掛程式附加資訊(非必須,用於說明日誌格式)
    Extra:
      Format: >-
        LogFormat "%h %l %u %t \"%r\" %>s %b
        \"%{Referer}i\" \"%{User-Agent}i\"" combined
      LogType: Apache
      SubType: combined

SourceKey String (必選)

源欄位名。

Regex integer (必選)

Regex。

Keys String (必選)

提取的欄位列表。

Extra

  • Format String (必選)

    Apache設定檔中的日誌配置部分,通常以LogFormat開頭。

  • LogType String (必選)

    解析日誌類型,固定值為Apache

  • SubType String (必選)

    日誌格式。

    • common

    • combined

    • 自訂

KeepingSourceWhenParseFail boolean (可選)

解析失敗時是否保留原始欄位,預設為false

KeepingSourceWhenParseSucceed boolean (可選)

解析成功時是否保留原始欄位,預設為false

RenamedSourceKey String (可選)

保留原始欄位時,用於儲存原始的欄位名,預設不改名。

資料脫敏

使用 processor_desensitize_native 外掛程式對日誌中的敏感性資料進行脫敏處理。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,固定值processor_desensitize_native

# ...在 spec.config下...
processors:
  # 配置原生日誌脫敏外掛程式
  - Type: processor_desensitize_native

    # 原始欄位名
    SourceKey: content

    # 脫敏方式:const 表示用固定字串替換敏感內容
    Method: const

    # 替換敏感內容的目標字串
    ReplacingString: '********'

    # 被替換內容前的內容運算式
    ContentPatternBeforeReplacedString: 'password'':'''

    # 敏感內容本身的Regex,匹配要被替換的內容
    ReplacedContentPattern: '[^'']*'

    # 是否替換所有匹配項,預設為 true
    ReplacingAll: true

SourceKey String (必選)

源欄位名。

Method String (必選)

脫敏方式。可選值包括:

  • const:用常量替換敏感內容。

  • md5:用敏感內容的 MD5 值替換相應內容。

ReplacingString String (可選)

用於替換敏感內容的常量字串。當Method取值為const時必選。

ContentPatternBeforeReplacedString String (必選)

敏感內容的首碼Regex。

ReplacedContentPattern String (必選)

敏感內容的Regex。

ReplacingAll boolean (可選)

解析成功時是否保留原始欄位,預設為true

內容過濾

通過配置 processor_filter_regex_native 外掛程式,基於Regex匹配日誌欄位值,僅保留滿足條件的日誌。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,固定值processor_filter_regex_native

# ...在 spec.config下...
processors:
  # 配置Regex過濾外掛程式(可用於日誌脫敏或敏感詞過濾)
  - Type: processor_filter_regex_native

    # 定義Regex列表,用於匹配日誌欄位的內容
    FilterRegex:
      # 樣本:匹配日誌欄位值中包含 "WARNING" 或 "ERROR" 的內容
      - WARNING|ERROR

    # 指定需要匹配的日誌欄位名,樣本為對 level 欄位進行過濾
    FilterKey:
      - level

FilterRegex String (必選)

匹配日誌欄位的Regex。

FilterKey String (必選)

匹配的日誌欄位名。

時間解析

配置 processor_parse_timestamp_native 外掛程式對日誌中的時間欄位進行解析,並將解析結果設定為日誌的__time__欄位。

關鍵字段詳解

樣本

Type String (必選)

外掛程式類型,固定值processor_parse_timestamp_native

# ...在 spec.config下...
processors:
  # 配置原生時間解析外掛程式
  - Type: processor_parse_timestamp_native
    # 原始日誌欄位來源,通常為 content
    SourceKey: content

    # 時間格式定義,需與日誌中的時間欄位格式完全符合
    SourceFormat: '%Y-%m-%d %H:%M:%S'
    
    SourceTimezone: 'GMT+00:00'

SourceKey String (必選)

源欄位名。

SourceFormat String (必選)

時間格式,需與日誌中的時間欄位格式完全符合。

SourceTimezone String (可選)

日誌時間所屬時區,預設使用機器時區,即LoongCollector進程所在環境的時區。

格式:

  • GMT+HH:MM:東區

  • GMT-HH:MM:西區

其他進階配置

在完成極簡配置後,您可以參考下述操作採集多行日誌、配置日誌主題類型等,以滿足更精細化的日誌採集需求。以下是常見進階配置及其功能:

  • 配置多行日誌採集:當一條日誌內容(如異常堆棧資訊)佔用多行時,需啟用多行模式,並配置行首Regex以匹配日誌的起始行,將佔用多行的日誌作為一條日誌採集並儲存到Log Service的Logstore中。

  • 配置日誌主題類型:為不同的日誌流設定不同的主題(Topic),可用於組織和分類日誌資料,更好地管理和檢索相關日誌。

  • 指定容器採集(過濾與黑名單):指定特定容器與路徑採集,包括白名單與黑名單配置。

  • 日誌標籤富化:將環境變數、Pod標籤相關的元資訊添加到日誌中,作為日誌的擴充欄位。

配置多行日誌採集

Log Service預設為單行模式,按行進行日誌的切分與儲存,導致含堆棧資訊的多行日誌被逐行切分,每一行作為獨立日誌儲存和展示,不利於分析。

針對上述問題,可通過開啟多行模式來改變Log Service的切分方式,並通過配置Regex匹配日誌起始行,從而將原始日誌按照起始行規則進行切分和儲存。

核心配置:在spec.config.inputs配置中添加Multiline參數。

關鍵字段詳解

樣本

Multiline

開啟多行日誌採集功能。

  • Mode

    模式選擇,預設值為custom

    • custom:表示自訂Regex匹配行首。

    • JSON:多行JSON。

  • StartPattern

    行首Regex,Mode 取值為custom時必填

# ...在 spec.config下...
inputs:
  - Type: input_file
    # 開啟多行日誌採集功能
    Multiline:
      # 模式選擇:custom 表示自訂Regex匹配行首
      Mode: custom
      # Regex匹配每條日誌的起始行(即新日誌開始的標誌)
      StartPattern: '\d+-\d+-\d+\s\d+:\d+:\d+'

配置日誌主題類型

核心配置:在spec.config中增加global參數以設定Topic。

關鍵字段詳解

樣本

TopicType

topic類型,可選值:

  • machine_group_topic:機器組topic,用於區分來自不同機器組的日誌。

  • filepath:檔案路徑提取,用於區分不同使用者或應用產生的日誌資料。

  • custom:自訂,使用自訂的靜態日誌主題。

機器組Topic

spec: 
  config:
    global: 
    #將應用該配置的機器組 Topic 作為 Topic
      TopicType: machine_group_topic              

檔案路徑提取

spec:  
  config:
    global: 
      TopicType: filepath
    # Topic 格式。當 TopicType 取值為 filepath 或 custom 時必填。
    # 提取結果為__topic__: userA,__topic__: userB,__topic__: userC
      TopicFormat: \/data\/logs\/(.*)\/serviceA\/.*

自訂

spec:  
  config:
    global: 
      TopicType: custom
    # Topic 格式。當 TopicType 取值為 filepath 或 custom 時必填。
      TopicFormat: customized:// + 自訂佈景主題名

TopicFormat

Topic 格式。當 TopicType 取值為 filepath 或 custom 時必填。

指定容器採集(過濾與黑名單)

過濾

只採集合格容器,多個條件之間為“且”的關係,任意條件為空白表示忽略該條件;條件支援使用Regex。

核心配置:在spec.config.inputs中配置ContainerFilters容器過濾相關參數。

關鍵字段詳解

樣本

ContainerFilters

容器過濾

  • Pod標籤黑/白名單

    • IncludeK8sLabel

      K8s Pod標籤白名單,指定需要採集日誌的容器。

    • ExcludeK8sLabel

      K8s Pod標籤黑名單:排除符合特定條件的容器日誌採集。

  • 環境變數黑白名單

    • IncludeEnv

      環境變數白名單

    • ExcludeInv

      環境變數黑名單

  • Pod/Namespace/容器名稱正則匹配

    • K8sNamespaceRegex

      Namespace 正則匹配

    • K8sPodRegex

      Pod 名稱正則匹配

    • K8sContainerRegex

      容器名稱正則匹配

所有正則匹配均基於 Go 語言的 RE2 正則引擎,功能較 PCRE 等引擎有所限制,請遵循附錄:Regex使用限制(容器過濾)編寫Regex。
# ...在 spec.config下...
inputs:
  - Type: input_file # 或 input_container_stdio
    # 當輸入外掛程式類型為input_file時,需配置:啟用容器發現功能為true。
    EnableContainerDiscovery: true
    # 容器過濾
    ContainerFilters:
      # K8s Pod標籤白名單:指定需要採集日誌的容器
      IncludeK8sLabel:
        # 樣本:匹配所有包含 app 標籤且標籤值為 nginx 或 redis 的 Pod。
        app: ^(nginx|redis)$

      # K8s Pod標籤黑名單:排除符合特定條件的容器日誌採集
      ExcludeK8sLabel:
        # 樣本:排除所有包含 app:test 標籤的 Pod
        app: test
      
      # 環境變數白名單
      IncludeEnv:
        # 匹配所有包含 NGINX_SERVICE_PORT=80 或 NGINX_SERVICE_PORT=6379 的容器。
        NGINX_SERVICE_PORT: ^(80|6379)$

      # 環境變數黑名單
      ExcludeEnv:
        # 排除所有 ENVIRONMENT=test 的容器。
        ENVIRONMENT: test
      
      # Namespace 正則匹配,樣本為匹配 default 和 nginx 命名空間下的所有容器。
      K8sNamespaceRegex: ^(default|nginx)$
      # Pod 名稱正則匹配,樣本為匹配所有以 nginx-log-demo 開頭的 Pod 下的容器。
      K8sPodRegex: ^(nginx-log-demo.*)$
      # 容器名稱正則匹配,樣本為匹配所有名為 container-test 的容器
      K8sContainerRegex: ^(container-test)$

黑名單

排除指定條件的檔案。需要在YAML的config.inputs下按需使用如下參數:

關鍵字段詳解

樣本

# ...在 spec.config下...
inputs:
  - Type: input_file
    # 檔案路徑黑名單,排除指定條件的檔案。路徑必須為絕對路徑,支援使用 * 萬用字元。
    ExcludeFilePaths:
      - /var/log/*.log

    # 檔案名稱黑名單,排除指定條件的檔案。支援使用 * 萬用字元。
    ExcludeFiles:
      - test

    # 目錄黑名單,排除指定條件的檔案。路徑必須為絕對路徑,支援使用 * 萬用字元。
    ExcludeDirs:
      - /var/log/backup*               

ExcludeFilePaths

檔案路徑黑名單,排除指定條件的檔案。路徑必須為絕對路徑,支援使用 * 萬用字元。

ExcludeFiles

檔案名稱黑名單,排除指定條件的檔案。支援使用 * 萬用字元。

ExcludeDirs

目錄黑名單,排除指定條件的檔案。路徑必須為絕對路徑,支援使用 * 萬用字元。

日誌標籤富化

核心配置:通過在spec.config.inputs中配置ExternalEnvTag 和 ExternalK8sLabelTag,向日誌中添加與容器環境變數、Pod標籤相關的tag。

關鍵字段詳解

樣本

ExternalEnvTag

將指定的環境變數值對應為 tag 欄位,格式為:<環境變數名>: <tag名>

# ...在 spec.config下...
inputs:
  - Type: input_file # 或 input_container_stdio
    ExternalEnvTag:
      <環境變數名>: <tag名>
    
    ExternalK8sLabelTag:
      <Pod標籤名>: <tag名>          

ExternalK8sLabelTag

將 Kubernetes Pod 的標籤值對應為 tag 欄位,格式為:<Pod標籤名>: <tag名>

常見情境完整配置樣本

情境一:採集Nginx Access log並解析為結構化欄位

解析Nginx日誌,根據log_format中的定義將日誌內容結構化,解析為多個索引值對形式。

完整YAML樣本

apiVersion: telemetry.alibabacloud.com/v1alpha1
kind: ClusterAliyunPipelineConfig
metadata:
  name: nginx-config
spec:
  config:
    aggregators: []
    global: {}
    inputs:
      - Type: input_file
        FilePaths:
          - /root/log/text1.log
        MaxDirSearchDepth: 0
        FileEncoding: utf8
        EnableContainerDiscovery: true
    processors:
      - Type: processor_parse_regex_native
        SourceKey: content
        Regex: >-
          (\S*)\s*-\s*(\S*)\s*\[(\d+/\S+/\d+:\d+:\d+:\d+)\s+\S+\]\s*"(\S+)\s+(\S+)\s+\S+"\s*(\S*)\s*(\S*)\s*(\S*)\s*(\S*)\s*"([^"]*)"\s*"([^"]*)".*
        Keys:
          - remote_addr
          - remote_user
          - time_local
          - request_method
          - request_uri
          - request_time
          - request_length
          - status
          - body_bytes_sent
          - http_referer
          - http_user_agent
        Extra:
          Format: >-
            log_format main  '$remote_addr - $remote_user [$time_local]
            "$request" ''$request_time $request_length ''$status
            $body_bytes_sent "$http_referer" ''"$http_user_agent"';
          LogType: NGINX
    flushers:
      - Type: flusher_sls
        Logstore: my-log-logstore
    sample: >-
      192.168.*.* - - [15/Apr/2025:16:40:00 +0800] "GET /nginx-logo.png
      HTTP/1.1" 0.000 514 200 368 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
      AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.*.* Safari/537.36"
  project:
    name: my-log-project
  logstores:
    - name: my-log-logstore
    

情境二:採集並處理多行日誌

Log Service預設為單行模式,按行進行日誌的切分與儲存,導致含堆棧資訊的多行日誌被逐行切分,每一行作為獨立日誌儲存和展示,不利於分析。

針對上述問題,可通過開啟多行模式來改變Log Service的切分方式,並通過配置Regex匹配日誌起始行,從而將原始日誌按照起始行規則進行切分和儲存。樣本如下:

完整YAML樣本

apiVersion: telemetry.alibabacloud.com/v1alpha1
kind: ClusterAliyunPipelineConfig
metadata:
  name: multiline-config
spec:
  config:
    aggregators: []
    global: {}
    inputs:
      - Type: input_file
        FilePaths:
          - /root/log/text1.log
        MaxDirSearchDepth: 0
        FileEncoding: utf8
        Multiline:
          StartPattern: '\[\d+-\d+-\w+:\d+:\d+,\d+]\s\[\w+]\s.*'
          Mode: custom
          UnmatchedContentTreatment: single_line
        EnableContainerDiscovery: true
    processors: []
    flushers:
      - Type: flusher_sls
        Logstore: my-log-logstore
    sample: |-
      [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)
  project:
    name: my-log-project
  logstores:
    - name: my-log-logstore

常見問題

如何將ACK叢集日誌傳輸到另一個阿里雲帳號的Project?

通過在ACK叢集中手動安裝Log Service LoongCollector(Logtail) 組件,並為其配置目標帳號的主帳號ID或訪問憑證(AccessKey),即可實現將容器日誌發送到另一個阿里雲帳號的Log ServiceProject中。

情境描述:當因為組織架構、許可權隔離或統一監控等原因,需要將某個ACK叢集的日誌資料擷取到另一個獨立的阿里雲帳號的Log ServiceProject時,可通過手動安裝 LoongCollector(Logtail)進行跨帳號配置。

操作步驟:此處以手動安裝LoongCollector為例,如需瞭解如何安裝Logtail,請參考Logtail安裝與配置

  1. 串連Kubernetes叢集,並根據地區選擇對應命令,下載LoongCollector及其相依元件:

    中國地區:

    wget https://aliyun-observability-release-cn-shanghai.oss-cn-shanghai.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh

    海外地區:

    wget https://aliyun-observability-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/loongcollector/k8s-custom-pkg/3.0.12/loongcollector-custom-k8s-package.tgz; tar xvf loongcollector-custom-k8s-package.tgz; chmod 744 ./loongcollector-custom-k8s-package/k8s-custom-install.sh
  2. 進入loongcollector-custom-k8s-package目錄,修改設定檔./loongcollector/values.yaml

    # ===================== 必需要補充的內容 =====================
    # 管理採集日誌的Project名,例如 k8s-log-custom-sd89ehdq。
    projectName: ""
    # Project所屬地區,例如上海:cn-shanghai
    region: ""
    # Project所屬主帳號uid,請用引號包圍,例如"123456789"
    aliUid: ""
    # 使用網路,選擇性參數:公網Internet,內網Intranet,預設使用公網
    net: Internet
    # 主帳號或者子帳號的AK,SK,需具備AliyunLogFullAccess系統策略許可權
    accessKeyID: ""
    accessKeySecret: ""
    # 自訂叢集ID,命名只支援大小寫,數字,短劃線(-)。
    clusterID: ""
  3. loongcollector-custom-k8s-package目錄下執行如下命令,安裝LoongCollector及其他相依元件:

    bash k8s-custom-install.sh install
  4. 安裝完成後,查看組件運行狀態。

    若Pod未成功啟動,請確認values.yaml配置是否正確,相關鏡像拉取是否成功。
    # 檢查Pod狀態
    kubectl get po -n kube-system | grep loongcollector-ds

    同時,Log Service會自動建立如下資源,可登入Log Service控制台查看

    資源類型

    資源名稱

    作用

    Project

    values.yaml檔案中自訂的projectName的值

    資源嵌入式管理單元,隔離不同業務日誌。

    機器組

    k8s-group-${cluster_id}

    日誌採集節點集合。

    Logstore

    config-operation-log

    重要

    請不要刪除該Logstore。

    儲存loongcollector-operator組件的日誌,其計費方式與普通Logstore相同,詳見按寫入資料量計費模式計費項目。建議不要在此Logstore下建立採集配置。

如何讓同一個記錄檔或容器標準輸出被多個採集配置同時採集?

預設情況下,Log Service為了防止資料重複,限制了每個日誌源只能被一個採集配置採集:

  • 一個 文本記錄檔只能匹配一個 Logtail 採集配置;

  • 一個 容器的標準輸出(stdout) 也只能被一個標準輸出採集配置採集。

  1. 登入Log Service控制台,進入目標Project。

  2. 在左側導航選擇image日誌庫,找到目標Logstore。

  3. 單擊其名稱前的image展開Logstore。

  4. 單擊Logtail配置,在配置列表中,找到目標Logtail配置,單擊操作列的管理Logtail配置

  5. 在Logtail配置頁面,單擊編輯,下滑至輸入配置地區:

    • 採集文字檔日誌:開啟允許檔案多次採集

    • 採集容器標準輸出:開啟允許標準輸出多次採集

附錄:Regex使用限制(容器過濾)

容器過濾時所使用的Regex基於Go語言的RE2引擎,與PCRE等其他引擎相比存在部分文法限制。請在編寫Regex時注意以下事項:

1. 命名分組文法差異

Go語言使用 (?P<name>...) 文法定義命名分組,不支援 PCRE中的 (?<name>...) 文法。

  • 正確樣本:(?P<year>\d{4})

  • 錯誤寫法:(?<year>\d{4})

2. 不支援的正則特性

以下常見但複雜的正則功能在RE2中不可用,請避免使用:

  • 斷言:(?=...)(?!...)(?<=...)(?<!...)

  • 條件運算式:(?(condition)true|false)

  • 遞迴匹配:(?R)(?0)

  • 子程式引用:(?&name)(?P>name)

  • 原子組:(?>...)

3. 使用建議

推薦使用 Regex101等工具調試Regex時,選擇 Golang (RE2) 模式進行驗證,以確保相容性。若使用了上述不支援的文法,外掛程式將無法正確解析或匹配。