Logtail從入門到精通(六):工作原理簡介
檔案採集原理
Logtail檔案採集的流程包括:檔案監聽、檔案讀取、日誌處理、日誌過濾、日誌聚合和資料傳送6個環節。下面將分別進行介紹:

- 注意:本節只介紹正常執行模式中Logtail的檔案採集原理,該模式下不支援採集歷史檔案,如有采集歷史檔案需求,請參考 ofollow,noindex" target="_blank">採集歷史檔案 。
檔案監聽
- 當Logtail獲取到採集配置後,根據配置的日誌路徑、檔名、最大監控目錄深度遞迴掃描目錄下符合檔名規則的日誌目錄和檔案。
- 為保證日誌採集時效性以及穩定性,Logtail會對採集目錄註冊事件監聽(Linux下 Inotify 、Windows下使用 ReadDirectoryChangesW )以及定期輪詢。
- 當第一次應用配置時,對於目錄下存量的日誌檔案不會進行採集,直到檔案在配置應用後產生修改事件才會採集。
- 當監聽到檔案修改後,會進入檔案讀取環節。
檔案讀取
- 每次Logtail讀取會從該檔案上一次讀取的偏移處開始。
- 若該檔案首次讀取,會檢查該檔案大小,若檔案小於1MB,則從檔案頭開始讀取,否則從檔案尾1MB處開始讀取。
- 每次讀取最多512KB資料,因此一條日誌最大支援512KB。
日誌處理
- 對於讀取的資料塊,會根據行首配置進行分行,切分成多條日誌。
- 對於每條日誌內容執行對應的解析,例如正則、分隔符、JSON等。
- 若未配置時間欄位,則日誌時間為當前解析時間;若配置了時間提取欄位,則從解析的日誌欄位中提取時間,若時間距離當前時間超過12小時,則丟棄該日誌並上傳錯誤資訊。
- 若該日誌可以被正確解析,則進入日誌過濾環節。
- 若該日誌解析失敗且開啟 高階配置 中的 丟棄解析失敗日誌 ,則直接丟棄該日誌,並上報解析失敗的報錯資訊
- 若該日誌解析失敗,但未開啟 高階配置 中的 丟棄解析失敗日誌 ,則將解析失敗的原始日誌上傳,其中Key為__raw_log__、Value為日誌內容
日誌過濾
- 若使用者未設定 高階配置 中的 過濾器配置 ,則跳過日誌過濾環節。
- 若使用者已經設定 過濾器配置 ,則會對每條日誌中的所有欄位進行遍歷並驗證。
- 只有過濾器中配置的所有欄位都在該日誌出現,且所有對應的欄位全部符合過濾器配置時,日誌才會被採集,否則丟棄該日誌。
日誌聚合
- 為降低網路請求次數,當日志處理、過濾完畢後,會在Logtail內部快取一段時間再進行傳送。
-
快取規則有3條,任一一條滿足則觸發傳送:
- 日誌聚合時間超過3秒
- 日誌聚合條數超過4096條
- 日誌聚合總大小超過1MB
日誌傳送
- 日誌傳送前會進行壓縮,目前Logtail採用的是LZ4壓縮演算法。
- 日誌傳送受限於
max_bytes_per_sec
和send_request_concurrency
限制,Logtail會保證傳送速率以及併發不超過配置值,具體引數請參考 啟動引數配置 。 -
若資料傳送失敗,則根據錯誤資訊選擇重試還是丟棄資料:
- 401錯誤,說明沒有許可權採集資料,直接丟棄。
- 404錯誤,說明project或logstore不存在,直接丟棄。
- 403錯誤,Quota超限,等待3秒後重試。
- 500錯誤,等待3秒後重試。
- 網路超時,等待3秒後重試。
外掛採集原理
Logtail的外掛採集流程主要包括以下環節:外掛資料採集、資料處理、日誌聚合和日誌傳送。
外掛資料採集
外掛資料採集的原理在每個外掛的文件中都有介紹,具體請參見各個外掛的幫助文件。
資料處理
外掛資料處理邏輯請參考 外掛-資料處理 。
日誌聚合
外掛的日誌聚合邏輯和檔案採集的日誌聚合邏輯一致。
日誌傳送
外掛的日誌傳送邏輯和檔案採集的日誌傳送邏輯一致。
資源限制
Logtail會根據配置檔案中的資源限制進行工作,若資源佔用長時間(5分鐘)超過限定值,則Logtail會進行強制重啟。重啟後可能會產生一定的資料重複。
資料採集可靠性
Logtail在採集資料時,會定期將採集的點位(CheckPoint)資訊儲存到本地,若遇到宕機、Crash等異常時,Logtail再次啟動會從上一次記錄的位置處開始採集資料,儘可能保證資料不丟失。
Logtail內部採用了很多機制提升日誌採集可靠性,但並不能保證日誌絕對不會丟失。以下情況可能造成日誌丟失:
- Logtail未執行且日誌輪轉多次。
- 日誌輪轉速度極快,例如1秒輪轉1次。
- 日誌採集速度長期無法達到日誌產生速度。