將多個日誌檔案聚合到一個目錄中

將多個日誌檔案聚合到一個目錄中

我在一台機器上運行 k3s 單節點叢集。我還沒有設置任何日誌記錄基礎設施,我暫時將其作為未來的學習經驗。

在該 k3 上,我執行一些 cron 作業,這些作業將每個作業的日誌建立到單獨的檔案中。我可以/var/log/containers/cron-job-*在主機上觀察它們。這些日誌會在一段時間後消失(successfulJobsHistoryLimit:3)。新的作業實例會建立新的日誌檔案。

我無法找到一個簡單的工具來監視該日誌目錄,最好使用檔案名稱模式,並將這些小型作業日誌串流/加入到單一日誌檔案中,包括正在建立的新檔案。我不介意檔案名稱是否遺失,我只是希望日誌行最終出現在一個檔案中,作為所有作業運行的存檔。

我考慮了什麼?

我可以添加一個腳本來捕獲這些文件,並以一定的間隔附加到目標文件中,但我必須跟踪已插入的文件,以防作業不同步或 cron 間隔發生變化。另外,我可能想為「長時間運行」的 Pod 擴展此功能,在這種情況下,我必須開始追蹤日誌中更新的行。

我發現的所有範例都涉及螢幕上的即時拖尾,這不是我需要的。我需要將多重尾部寫入目標日誌檔案中。

有任何想法嗎? (我也接受某種簡單的 Kubernetes 日誌掛鉤範例)

答案1

我提供了一種我現在為自己選擇的解決方案。這不是我一直在尋找的答案,而是一個似乎順其自然的答案。我仍然好奇這是否可以透過一些常見的 Unix 命令來處理。

無論如何,這就是我所做的:

常見的方法似乎是使用一個名為流利的,它允許您從各種來源收集日誌並將它們傳輸到您認為合適的任何地方 - 一種日誌的 ETL。

我選擇將日誌發送到系統日誌伺服器,因為我已經運行了一個,但您可以從這裡選擇任何輸出插件:輸出插件。還有大量附加插件:所有插件

步驟1

取得安裝了 Remote_syslog 插件的 Fluentd 設定。它不附帶官方 docker 映像,但您可以自行設定。

FROM fluent/fluentd:v1.14.0-1.0
USER root

# https://github.com/fluent-plugins-nursery/fluent-plugin-remote_syslog
RUN fluent-gem install fluent-plugin-remote_syslog

USER fluent

建立鏡像並推送到您的註冊表。

第2步

接下來設定 Fluentd 部署清單,其中包含唯讀卷聲明以存取 pod 日誌。實際檔案駐留在 /var/log/pods/* 中,而 /var/log/containers 實際上包含符號連結。我們需要實際的文件。這些日誌由主機上的 root 使用者擁有,普通使用者無權讀取它們。我們需要設定一些安全上下文。為了讓事情正常運作,我使用了 fsGroup 的 root 群組。請隨意深入挖掘並找到/評論安全方面的最佳解決方案。

apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
    spec:
      securityContext:
        fsGroup: 0
      volumes:
        - name: varlogpods-pv
          persistentVolumeClaim:
            claimName: pvc-var-log-pods
            ...
      containers:
        - name: fluentd
          image: your/fluentd-image

請參閱我的完整清單:流暢的部署

步驟3

在部署之前,您還需要在那裡設定fluent.conf並描述一些規則。

我的設定為匹配這樣的日誌行:

2022-04-26T20:05:00.847016854+03:00 stderr F time="2022-04-26 17:05:00" level=info msg="processing 3 records ..."

有關尾部插件的更多信息,請參閱:尾巴

    <source>
      @type tail
      @id in_tail_container_logs
      path "/var/log/pods/default_cron-*/*/*.log"
      pos_file "/tmp/cron_.log.pos"
      read_from_head true
      tag cron
      <parse>
        @type regexp
        expression /^(?<logtime>[^ ]*) .* level=(?<level>[^ ]*) msg="(?<message>[^"]*)"$/ 
        time_key logtime
        time_format %FT%T.%N%:z
      </parse>
    </source>
    
    <match cron>
     @type remote_syslog
     host 172.16.3.10
     port 514
     protocol udp
     severity info
     program "fluentd"
     hostname "k3sserver"
     
     <buffer>
     </buffer>
     
     <format>
      @type single_value
      message_key message
     </format>
    </match>

這裡一個重要的配置屬性是read_from_head true從頂部讀取日誌檔案。對於這種情況來說這是必要的,因為 pod 日誌會輪換,我們希望 Fluentd 讀取完整的 pod 日誌,而不僅僅是最後的幾行更新行。對於短 cron 作業,日誌檔案只會出現,而 tail 不會報告其中的任何初始行。

步驟4

擺弄配置並嘗試,再試一次。更新 configMap 中的設定後,請不要忘記重新啟動部署。

搜尋線索中的一些內容:

相關內容