15. Fluentd輸入插件:in_tail用法詳解


in_tail輸入插件內置於Fluentd中,無需安裝。

它允許fluentd從文本文件尾部讀取日志事件,其行為類似linux的tail -F命令(按文件名來tail)。

這幾乎是最常用的一個輸入插件了。

  1. 示例配置
<source>
  @type tail
  path /var/log/httpd-access.log
  pos_file /var/log/td-agent/httpd-access.log.pos
  tag apache.access
  <parse>
    @type apache2
  </parse>
</source>

這個示例用於tail Apache的日志。

  1. 工作原理
    當Fluentd首次配置使用in_tail插件時,它會從path指定的日志文件尾部讀取數據。

一旦日志文件被輪轉重寫,Fluentd則開始從新文件頭部讀取數據。Fluentd會持續追蹤文件當前的inode編號。

當td-agent重啟時,它會從重啟前的位置開始讀取數據,這個位置保存在pos_file指定的文件中。

  1. 插件參數
  • @type(必需)插件類型,取值為tail

  • tag(必需,0.14.0(最低版本要求,下同))指定生成的事件的tag,取值為一個字符串。可以使用作為占位符,會將日志文件路徑中的/替換為.號,
    比如:

path /path/to/file
tag foo.*

上邊這個配置會產生foo.path.to.file這樣的tag。

  • path(必需,0.14.0)
    指定日志文件路徑,可使用逗號(,)作為分隔符指定多個路徑。
    路徑中可包含*和strftime格式時間字符串,用以動態增刪文件。
    Fluentd會定期刷新監控文件列表。
path /path/to/%Y/%m/%d/*

這個示例監控時間字符串指定的目錄,比如若日期為20140401,Fluentd會監控/path/to/2014/04/01路徑下的所有文件。

path /path/to/a/*,/path/to/b/c.log

這個示例監控多個目錄。
需要注意的是,*不能用於存在日志文件輪轉的情況,這會導致日志重復。這種情況建議使用單獨的in_tail配置。

  • path_timezone(1.8.1)若path參數中包含strftime時間字符串,可通過path_timezone設置采用的時區。in_tail默認使用系統時區,可通過如下配置來設置:
path_timezone "+00"
  • exclude_path(0.14.0)指定從監控文件列表中排除哪些文件,這是一個字符串數組。
path /path/to/*
exclude_path ["/path/to/*.gz", "/path/to/*.zip"]

這個示例會排除path中的gz和zip壓縮文件。

  • refresh_interval(0.14.0)指定監控列表刷新間隔,默認為60秒。當path中包含*時生效。

  • limit_recently_modified(0.14.13)只監控指定修改時間范圍內的文件。該參數取值為time類型的時間,且當path中包含*時生效。

  • skip_refresh_on_startup(0.14.13)設置程序啟動時是否刷新文件列表,默認為false。不刷新,可在path中包含*時減少啟動耗時。

  • read_from_head(0.14.0)從文件頭部讀取數據,默認為false。當取值true時,in_tail會在啟動階段讀取文件,若文件太大會很耗時,且會阻塞其他插件的啟動。

  • encoding, from_encoding(0.14.0)設置in_tail輸出數據的編碼,默認采用ASCII-8BIT編碼。

  • read_lines_limit(0.14.0)設置每次從文件中讀取的行數,默認為1000.如果在日志中發現“chunk bytes limit exceeds for an emittedevent stream”這樣的錯誤,應該減小此參數值。

  • multiline_flush_interval(0.14.0)多行處理模式下的緩存輸出間隔,默認不啟用此配置。該參數配合format_firstline使用。

  • pos_file(強烈推薦配置,0.14.0)Fluentd使用pos_file保存文件讀取位置。pos_file可在一個文件中保存多個位置,每個source中配置一個pos_file即可。需要注意的是,多個in_tail不能共用一個pos_file配置,這可能導致未知的行為,比如pos_file
    文件損壞。

  • pos_file_compaction_interval(1.9.2)設置pos_file的壓縮間隔,被壓縮的內容包含: 已移出監控列表的文件、 無法解析的文件、 重復文件行。可在設置pos_file的情況下設置此參數。

pos_file /var/log/td-agent/tmp/access.log.pos
pos_file_compaction_interval 72h
  • <parse>指令(必需)用於配置解析文件內容使用的解析器。我們會在后續的文章中了解到解析器的使用。這里有一個例子:
# json
<parse>
  @type json
</parse>

# regexp
<parse>
  @type regexp
  expression ^(?<name>[^ ]*) (?<user>[^ ]*) (?<age>\d*)$
</parse>
  • path_key(0.14.0)可以將監控文件路徑添加到生成的日志事件中,path_key用於指定事件中path的key名稱。
path /path/to/access.log
path_key tailed_path

使用上邊這個配置,會生成如下的日志事件:

{"tailed_path":"/path/to/access.log","k1":"v1",...,"kN":"vN"}
  • rotate_wait(0.14.0)文件輪轉等待時間。在監控文件存在輪轉的情況下,Fluentd會在監測到文件輪轉時,再監控老文件一段時間,以避免數據丟失。默認的等待時間為5秒。

  • enable_watch_timer(0.14.0)是否啟用監控定時器,默認開啟一個間隔1秒的定時器,關閉后會降低CPU和IO消耗。用於解決某些系統監控不准確的問題,未來版本會禁用此功能。

  • enable_stat_watcher(1.0.1)是否啟用額外的基於inotify的監控器。默認為true,關閉后會禁用inotify事件,僅通過定時監控器來追蹤文件。

  • emit_unmatched_lines 是否輸出無法解析的文件行信息,默認為false。

3.常見問題
3.1 當 無法匹配日志時會如何處理
若emit_unmatched_lines設為true,in_tail會打印出告警信息。
比如, <parse>指定的解析器為json,而日志中包含“123,456,str,true”這樣的記錄,那么在fluentd運行日志中就會看到如下輸出:

2018-04-19 02:23:44 +0900 [warn]: #0 pattern not match: "123,456,str,true"

3.2 in_tail為何沒有開始讀取日志 可能監控文件確實沒有產生新的數據,試着追加一條數據看看。

3.3 in_tail輸出“/path/to/file unreadable”,這是什么導致的若在運行日志中發現如下信息,可能是fluentd沒有監控文件的讀權限。

/path/to/file unreadable. It is excluded and would be examined next time.

3.4 如何避免監控大量文件時in_tail停止運行 可設置enable_stat_watcher為false。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM