Fluentd輸入插件(input)

1、輸入插件(Input Plugin)概述

Fluentd有6種插件Input, Parser, Filter, Output, Formatter and Buffer.

本文概述了輸入(input)插件。

1.1、概述

輸入插件擴展了Fluentd來從外部檢索和拉事件日誌。一個輸入插件通常會創建一個線程套接字和一個監聽套接字。它也可以被寫入定期從數據源提取數據。

1.2、輸入插件列表

  • in_forward

  • in_unix

  • in_http

  • in_tail

  • in_exec

  • in_syslog

1.3、其他輸入(Input)插件

請參閱此插件列表,以了解其他輸入插件。

  • Fluentd plugins

2、UDP 輸入(Input)插件

Advertisements

in_udp輸入插件使Fluentd能夠接受UDP有效載荷(payload)。

2.1、示例配置

in_udp包含在Fluentd的core中。 不需要額外的安裝過程。

<source>@type udptag mytag # requiredformat /^(?<field1>\d+):(?<field2>\w+)$/ # requiredport 20001 # optional. 5160 by defaultbind 0.0.0.0 # optional. 0.0.0.0 by defaultbody_size_limit 1MB # optional. 4096 bytes by default</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

Advertisements

2.2、參數

  • @type (required必須)

    該值必須是udp。

  • tag (required必須)

    輸出事件tag(標籤)。

  • port埠

    監聽埠。默認值= 5160

  • bind(綁定)

    要綁定的地址。 默認值= 0.0.0.0

source_hostname_key

客戶端主機名的欄位名稱。 如果設置該值,客戶端的主機名將被設置為其密鑰。 默認值為nil(不添加主機名)。

如果設置以下配置:

source_hostname_key client_host

那麼客戶端的主機名設置為client_host欄位。

{..."foo": "bar","client_host": "client.hostname.org"}
  • 格式 (required必須)

    UDP有效載荷的格式。 in_udp使用解析器插件來解析有效載荷。 有關詳細信息,請參閱解析器文章。

    UDP payload的格式。 in_udp使用解析器插件 parser article來解析有效載荷。 有關詳細信息,請參閱解析器文章。

  • 日誌級別參數

    log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

    有關詳細信息,請參閱日誌文章。

2.3、常見問題

如何防止請求刪除?

如果in_udp在1秒內大量發送數據包,則會刪除一些數據包。例如,你可以通過netstat - su看到更大的RcvbufErrors號碼。

這意味著使用一個進程的in_udp無法處理這樣的流量。嘗試使用fluent -plugin- multiprocess來解決這個問題。參見第1334號問題,了解更多細節。

3、TCP 輸入(Input)插件

in_tcp輸入插件使Fluentd能夠接受TCP有效載荷(payload)。

不要使用此插件從客戶端庫接收日誌。 對於這種情況使用in_forward。

3.1、示例配置

in_tcp包含在Fluentd的核心中。 不需要額外的安裝過程。

<source>@type tcptag tcp.events # requiredformat /^(?<field1>\d+):(?<field2>\w+)$/ # requiredport 20001 # optional. 5170 by defaultbind 0.0.0.0 # optional. 0.0.0.0 by defaultdelimiter \n # optional. \n (newline) by default</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

3.2、參數

  • @type (required必須)

    該值必須是tcp。

  • tag (required必須)

    輸出事件tag(標籤)。

  • port埠

    監聽埠。默認值= 5170

  • bind(綁定)

    要綁定的地址。 默認值= 0.0.0.0

  • 分隔符(delimiter)

    payload被讀取到這個字元。默認情況下,它是「\ n」。

source_hostname_key

客戶端主機名的欄位名稱。 如果設置該值,客戶端的主機名將被設置為其密鑰。 默認值為nil(不添加主機名)。

如果設置以下配置:

source_hostname_key client_host

那麼客戶端的主機名設置為client_host欄位。

{..."foo": "bar","client_host": "client.hostname.org"}

3.3、格式format(必須)

TCP有效載荷的格式。 這是正則表達式的例子。(\d是匹配數字 \w是匹配字母)

format /^(?<field1>\d+):(?<field2>\w+)$/

如果你執行下面的命令:

$ echo '123456:awesome' | netcat 0.0.0.0 5170

然後得到如下解析結果:

{"field1":"123456","field2":"awesome}

in_tcp使用解析器(parser)插件解析負載。有關詳細信息,請參見解析器文章。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

4、forward Input Plugin(轉發輸入插件)

in_forward輸入插件偵聽TCP套接字以接收事件流。它還偵聽一個UDP套接字來接收heartbeat消息。

此插件主要用於接收來自其他Fluentd實例、fluent-cat命令或客戶端庫的事件日誌。這是迄今為止檢索記錄的最有效的方法。

在沒有安全連接的情況下,不要使用這個插件進行交流或公共互聯網數據傳輸。為了提供可靠/低延遲傳輸,我們假設這個插件只在私有網路中使用。

如果您打開這個插件的埠到internet,攻擊者可以使用特定的數據包輕鬆地崩潰。如果需要在節點之間建立安全連接,請考慮使用in_secure_forward。

4.1、實例配置

in_forward包含在Fluentd的core中。 不需要額外的安裝過程。

<source>@type forwardport 24224bind 0.0.0.0</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

4.2、參數

  • @type (required必須)

    該值必須是forward。

  • port埠

    監聽埠。默認值= 24224

  • bind(綁定)

    要綁定的地址。 默認值= 0.0.0.0

  • linger_timeout(延遲超時)

    用於設置linger選項的超時時間。 默認值為0

  • chunk_size_limit(塊大小限制)

    接收塊的大小限制。如果塊大小大於該值,則接收到的塊被丟棄。默認值為nil(無限制)。

  • chunk_size_warn_limit(塊大小警告限制)

    接收到的塊的警告大小限制。如果塊大小大於此值,將發送一條警告消息。默認值為nil(無警告)。

  • skip_invalid_event (v0.12.20 or later)(跳過無效事件(v0.12.20或更高版本)

    如果傳入事件無效,跳過事件。 默認值為false。

    這個選項在forwarder上是有用的,而不是aggragator。v0.12.20或更高版本。

  • source_hostname_key源主機名密鑰(v0.12.28或更高版本)

    客戶機主機名的欄位名。如果設置值,將設置客戶機的主機名。默認值為nil(沒有添加主機名)。

    這個迭代傳入的事件。因此,如果向in_forward發送較大的塊,則需要額外的處理時間。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

4.3、協議

此插件接受JSON或MessagePack消息,並自動檢測使用哪個消息。 在內部,Fluent使用MessagePack,因為它比JSON更有效率。

時間值是平台特定的整數,它基於Ruby的Time.now.to_i函數的輸出。 在Linux,BSD和MAC系統上,這是1970年以來的秒數。

可以在同一連接中發送多個消息。

stream:message...message:[tag, time, record]or[tag, [[time,record], [time,record], ...]]example:["myapp.access", 1308466941, {"a":1}]["myapp.messages", 1308466942, {"b":2}]["myapp.access", [[1308466941, {"a":1}], [1308466942, {"b":2}]]]

4.4、常見問題

為什麼in_forward沒有標籤(tag)參數?

in_forward使用傳入事件的標籤(tag),因此沒有固定的標籤參數。 見上文「協議」部分。

如何解析(parse)傳入的事件?

in_forward不像in_tail或in_tcp那樣提供解析(parse)機制,因為in_forward主要是為了有效的日誌傳輸。 如果要解析傳入事件,請在管道中使用解析器過濾器。

參見Docker日誌記錄驅動程序usecase:Docker Logging

我收到MessagePack::UnknownExtTypeError錯誤。 為什麼?

當轉發器(forward)的Fluentd為v0.14且接收者的Fluentd為0.12時,會出現此錯誤。為了避免此問題,請在v0.14Fluentd中將time_as_integer設置為out_forward設置。

5、in_secure_forward(安全的轉發輸入插件)

in_secure_forward輸入插件通過身份驗證通過SSL接受消息(參見out_secure_forward)。

本文檔不描述所有參數。 如果您想了解全部功能,請查看「進一步閱讀」部分。

5.1、安裝

in_secure_forward不包括在td-agent包或fluentd gem中。為了安裝它,請參閱插件管理文章。

5.2、實例配置

本節提供了in_secure_forward的一些示例配置。

極簡配置

首先,通過secure-forward-ca-generate生成私有CA文件,然後以安全的方式(scp或其他方式)將該文件複製到輸出插件端.

<source>@type secure_forwardshared_key secret_stringself_hostname server.fqdn.local # This fqdn is used as CN (Common Name) of certificatessecure trueca_cert_path /path/to/certificate/ca_cert.pemca_private_key_path /path/to/certificate/ca_key.pemca_private_key_passphrase passphrase_for_private_CA_secret_key</source>

從客戶端檢查用戶名/密碼

<source>@type secure_forwardshared_key secret_stringself_hostname server.fqdn.localsecure trueca_cert_path /path/to/certificate/ca_cert.pemca_private_key_path /path/to/certificate/ca_key.pemca_private_key_passphrase passphrase_for_private_CA_secret_keyauthentication yes # Deny clients without valid username/password<user>username tagomorispassword foobar012</user><user>username frsyukipassword yakiniku</user></source>

拒絕未知的源IP /主機

<source>@type secure_forwardshared_key secret_stringself_hostname server.fqdn.localsecure trueca_cert_path /path/to/certificate/ca_cert.pemca_private_key_path /path/to/certificate/ca_key.pemca_private_key_passphrase passphrase_for_private_CA_secret_keyallow_anonymous_source no # Allow to accept from nodes of <client><client>host 192.168.10.30# network address (ex: 192.168.10.0/24) NOT Supported now</client><client>host your.host.fqdn.local# wildcard (ex: *.host.fqdn.local) NOT Supported now</client></source>

您可以一起使用用戶名/密碼檢查和客戶端檢查:

<source>@type secure_forwardshared_key secret_stringself_hostname server.fqdn.localsecure trueca_cert_path /path/to/certificate/ca_cert.pemca_private_key_path /path/to/certificate/ca_key.pemca_private_key_passphrase passphrase_for_private_CA_secret_keyallow_anonymous_source no # Allow to accept from nodes of <client>authentication yes # Deny clients without valid username/password<user>username tagomorispassword foobar012</user><user>username frsyukipassword sukiyaki</user><user>username repeatedlypassword sushi</user<client>host 192.168.10.30 # allow all users to connect from 192.168.10.30</client><client>host 192.168.10.31users tagomoris,frsyuki # deny repeatedly from 192.168.10.31</client><client>host 192.168.10.32shared_key less_secret_string # limited shared_key for 192.168.10.32users repeatedly # and repeatedly only</client></source>

安全Sender-Receiver設置

請參考安全的發送者設置示例文檔。

5.3、參數

@type

此參數是必需的。它的值必須secure_forward。

port (integer整數)

默認值為24284

bind (string)

默認值是0.0.0.0

secure (bool)

表示已發布的連接是安全的。如果需要安全加密,請指定yes(或true)。

self_hostname (string)

自動生成的證書的默認值(CN)。

shared_key (string)

節點之間共享密鑰。

allow_keepalive (bool)

接受keepalive連接。默認值為true。

allow_anonymous_source (bool)

接受來自未知主機的連接。

authentication (bool)

需要密碼身份驗證。默認值為false。

ca_cert_path (string)

私有CA證書文件的路徑,這是使用私有CA所需的。 (對於安全的yes配置,需要其中一個參數或cert_path。)

ca_private_key_path (string)

私有CA證書密鑰文件的私鑰路徑。

ca_private_key_passphrase (string)

私有密鑰文件的passphrase字元串,由ca_private_key_path指定。

read_length (size)

每個非阻塞讀取的位元組數。默認值為8MB = 810241024位元組。

read_interval_msec (integer)

非阻塞讀取之間的間隔,以毫秒為單位。默認值是50。

socket_interval_msec (integer)

SSL之間的間隔以毫秒為單位。默認值是200。

進一步的閱讀

fluent-plugin-secure-forward repository

6、http Input Plugin

in_http輸入插件可以使Fluentd從HTTP POST中檢索記錄。 URL路徑成為Fluentd事件日誌的標籤(tag),所發布(POSTed)的body元素將成為記錄本身。

6.1、示例配置

in_http包含在Fluentd的core中。 不需要額外的安裝過程。

<source>@type httpport 8888bind 0.0.0.0body_size_limit 32mkeepalive_timeout 10s</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

使用示例

下面的示例使用curl命令發布一個記錄。

$ curl -X POST -d 'json={"action":"login","user":2}'http://localhost:8888/test.tag.here;

6.2、參數

@type (required)

這個值必須是http

port

埠監聽,默認是9880

bind

地址綁定 默認是0.0.0.0

body_size_limit

POSTed元素的大小限制。 默認值= 32MB

keepalive_timeout

保持連接活動的超時限制。 默認值= 10秒

add_http_headers

在記錄中添加http_prefix頭。默認的是假的

add_remote_addr

添加REMOTE_ADDR欄位到記錄。REMOTE_ADDR的值是客戶機的地址。默認的是假的

如果您的系統在請求中設置了多個X-Forwarded-For,那麼in_http將使用第一個。例如:

X-Forwarded-For: host1, host2X-Forwarded-For: host3

如果發送到多個header,REMOTE_ADDR值是host1。

cors_allow_origins

CORS的白名單域名。 默認是沒有檢查。

如果您將[「domain1」,「domain2」]設置為cors_allow_origins,則in_http將返回403以從該域訪問。

format格式

HTTP主體的格式。預設值是默認。

  • default

    接受records使用json= / msgpack= style

  • regexp

    通過正則表達式指定主體格式。

format /^(?<field1>\d+):(?<field2>\w+)$/

如果執行以下命令:

$ curl -X POST -d '123456:awesome' "http://localhost:8888/test.tag.here"

然後解析結果如下面:

{"field1":"123456","field2":"awesome}

還支持json,ltsv,tsv,csv和none。 檢查解析器插件概述了解更多詳細信息。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

6.3、附加特性

時間查詢參數

如果要從應用程序傳遞事件時間,請使用time query參數。

$ curl -X POST -d 'json={"action":"login","user":2}'"http://localhost:8888/test.tag.here?time=1392021185"

批處理模式

如果使用默認格式,則可以將json / msgpack的數組類型發送到in_http。

$ curl -X POST -d 'json=[{"action":"login","user":2,"time":1392021185},{"action":"logout","user":2,"time":1392027356}]'http://localhost:8888/test.tag.here;

這通過減少HTTP訪問來提高輸入性能。非默認格式還不支持批處理模式。這是一個簡單的bechmark結果,在MacBook Pro與ruby 2.3:

jsonmsgpackmsgpack array(10 items)
2100 events/sec2400 events/sec10000 events/sec

測試的配置和ruby腳本在這裡。

6.4、常見問題

為什麼in_http從我的日誌中刪除「+」?

這是HTTP規範,不是Fluentd的問題。 您需要正確編碼您的有效載荷或使用多部分請求。 這是ruby的例子:

# OKURI.encode_www_form({json: {"message" => "foo+bar"}.to_json})# NG"json=#{{"message" => "foo+bar"}.to_json}"

curl命令示例:

# OKcurl -X POST -H 'Content-Type: multipart/form-data' -F 'json={"message":"foo+bar"}' http://localhost:8888/test.tag.here# NGcurl -X POST -F 'json={"message":"foo+bar"}' http://localhost:8888/test.tag.here

7、Unix Domain Socket Input Plugin

in_unix輸入插件可以使Fluentd從Unix域套接字中檢索記錄。 有線協議與in_forward相同,但傳輸層不同。

7.1、示例配置

in_unix被包括在Fluentd的core中。不需要額外的安裝過程。

<source>@type unixpath /path/to/socket.sock</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

7.2、參數

@type (required)

這個值必須是unix

path (required)

您的Unix域套接字的路徑。

backlog

Unix域套接字的backlog。默認值是1024。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

8、tail Input Plugin

in_tail輸入插件允許Fluentd從文本文件的尾部讀取事件。 它的行為類似於tail -F命令。

8.1、示例配置

in_tail包含在Fluentd的core中。 不需要額外的安裝過程。

<source>@type tailpath /var/log/httpd-access.logpos_file /var/log/td-agent/httpd-access.log.postag apache.accessformat apache2</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

它是如何工作的

  • 當Fluentd第一次配置為in_tail時,它將從該日誌的尾部開始讀取,而不是從開始讀取。

  • 一旦日誌被輪轉(rotated),Fluentd從一開始就開始讀取新文件。它跟蹤當前的inode號。

  • 如果td-agent重新啟動,它將從重啟前的最後一個位置的td代理讀取開始讀取。這個位置記錄在pos_file參數指定的位置文件中。

8.2、參數

@type (required)

這個值必須是tail

tag (required)

事件的標籤

*可以作為一個佔位符,擴展到實際的文件路徑,替換「/」和「.」例如,如果您有以下配置

path /path/to/filetag foo.*

in_tail使用'foo.path.to.file'標籤發出解析事件。

path (required)

讀的路徑。可以指定多條路徑,由「,」分隔。

*和strftime格式可以包括動態添加/刪除表文件。在refresh_interval的間隔期間,Fluentd刷新了表文件。

path /path/to/%Y/%m/%d/*

如果日期是20140401,Fluentd將開始觀看 /path/to/2014/04/01目錄中的文件。 另請參見read_from_head參數。

您不應該使用「*」來進行日誌輪轉(rotation),因為它可能導致日誌複製。在這種情況下,應該分離in_tail插件配置。

exclude_path

從觀察者列表中排除文件的路徑。 例如,如果要刪除壓縮文件,可以使用以下模式。

path /path/to/*exclude_path ["/path/to/*.gz", "/path/to/*.zip"]

refresh_interval

查看文件列表刷新的間隔。默認是60秒。

limit_recently_modified

這個參數從v0.12.33開始。

在path參數中使用*時,限制修改時間在指定時間範圍內的查看文件。

skip_refresh_on_startup

這個參數從v0.12.33開始。

在啟動時跳過看列表的刷新。這減少了在路徑中使用*的啟動時間。

read_from_head

開始從文件頭讀取日誌,而不是底部。 默認值為false。

如果要使用或strftime動態路徑拖尾所有內容,請將此參數設置為true。 相反,您應該保證在目錄中不會發生日誌輪換。

當這是真的時,in_tail會嘗試在啟動階段讀取文件。如果目標文件很大,則需要很長時間,並且在讀取文件完成之前不會執行其他插件。

encoding, from_encoding

指定讀取行的編碼。預設值是ASCII-8BIT。

默認情況下,in_tail會釋放字元串值作為ascii-8bit編碼。這些選項改變它。

  • 如果只指定編碼,那麼in_tail會改變字元串到編碼。這個用#force_encoding ruby的字元串

  • 如果指定編碼和from_encoding,in_tail嘗試將字元串從from_編碼編碼到編碼。它使用ruby的字元串#編碼

    您可以通過鍵入以下命令獲得支持的編碼列表:

$ ruby -e 'p Encoding.name_list.sort'

read_lines_limit

每個IO上的讀取行數。默認是1000行。

如果您看到「發出的數據的大小超過buffer_chunk_limit」,則使用in_tail記錄,設置較小的值。

multiline_flush_interval

為多行格式刷新緩衝區的間隔。默認是禁用的。

如果您設置了multiline_flush_interval 5s,in_tail會在5秒后刷新該事件。當使用format_firstline選項時,此選項非常有用。自從v0.12.20或更高版本。

pos_file (highly recommended強烈推薦)

這個參數非常推薦。Fluentd將記錄它最後讀到這個文件的位置。

pos_file /var/log/td-agent/tmp/access.log.pos

pos_file處理一個文件中的多個位置,因此每個源不需要多個pos_file參數。

不要在in_tail配置之間共享pos_file。 它會導致意外的行為,例如 損壞的pos_file內容。

in_tail在啟動階段刪除未跟蹤的文件位置。 這意味著當您使用動態路徑設置拖尾大量文件時,pos_file的內容正在增長,直到重新啟動。 我將來會解決這個問題。 檢查這個問題。

format (required)

日誌的格式。in_tail使用解析器插件解析日誌。有關詳細信息,請參見解析器文章。

path_key

將觀察文件路徑添加到path_key欄位。

path /path/to/access.logpath_key tailed_path

使用這個配置,生成的事件就像

{"tailed_path":"/path/to/access.log","k1":"v1",...,"kN":"vN"}.

rotate_wait

in_tail實際上比tail -F本身有點多。替換(rotating)文件時,有些數據可能仍然需要寫入舊文件,而不是新文件。

in_tail通過保留對舊文件的引用(即使在它已經被替換(rotating)之後)一段時間,完全轉換到新文件來處理這一點。 這有助於防止為舊文件指定的數據丟失。 默認情況下,此時間間隔為5秒。

rotate_wait參數接受一個整數代表你想要這個時間間隔的秒數。

enable_watch_timer

啟用額外的時鐘計時器。將此參數設置為false將顯著減少CPU和I / O消耗,因為在系統中跟蹤大量支持inotify的文件。默認值為true,將使用額外的1秒計時器。

in_tail(通過cool. io)在支持它的系統上使用inotify。早期版本的libev在某些平台上(如Mac OS X)沒有正常工作;因此,使用顯式的1秒計時器。即使在支持inotify的系統中,這也會導致每秒額外的I/O,因為每個文件都被跟蹤。

早期測試表明,現代Cool.io和in_tail正常工作,無需額外的計時器。 在將來的某個時候,根據反饋和測試,默認情況下可能會禁用附加的監視定時器。

ignore_repeated_permission_error

如果您很難將非permision文件排除在監視列表中,則將該參數設置為true。它會抑制重複的許可權錯誤日誌。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

8.3、常見問題

in_tail沒有開始讀取日誌文件,為什麼?

在默認情況下,in_tail會遵循tail - f命令行為,因此in_tail只讀取較新的日誌。如果要讀取批用例的現有行,請將read_from_head設置為true。

logrotate 設置

logrotate具有nocreate參數,並且在觸發日誌輪換后不創建新文件。 這意味著in_tail找不到新的文件尾。

此參數不適合典型的應用程序日誌情況,因此請檢查不包括nocreate參數的logrotate設置。

當in_tail接收BufferQueueLimitError時發生了什麼?

in_tail停止讀取新的行和pos文件更新,直到解決了BufferQueueLimitError。在解決了BufferQueueLimitError之後,重新開始發出新的行和pos文件更新。

9、exec Input Plugin

in_exec輸入插件執行外部程序來接收或拉事件日誌。然後它將從程序的stdout讀取TSV(tab分隔值)、JSON或MessagePack。

您可以定期或永久運行程序。要定期運行,請使用run_interval參數。

9.1、示例

in_exec包含在Fluentd的core中。 不需要額外的安裝過程。

<source>@type execcommand cmd arg argkeys k1,k2,k3tag_key k1time_key k2time_format %Y-%m-%d %H:%M:%Srun_interval 10s</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

9.2、參數

@type (required)

這個值必須是exec

command (required)

執行命令(程序)。

格式

用於將程序輸出映射到傳入事件的格式。

支持以下格式:

  • tsv (default)

  • json

  • msgpack

  • parser plugin formats, e.g. ltsv, none.

使用tsv格式時,請同時指定逗號分隔的鍵參數。

keys k1,k2,k3

當使用json格式時,此插件使用Yajl庫來解析程序輸出。 Yajl內部緩衝數據,因此輸出並不總是瞬時的。

tag(如果未指定tag_key,則為必填欄位)

輸出事件的tag。

tag_key

作為事件標記使用的key鍵,而不是事件記錄中的value值。如果未指定此參數,則將使用tag參數。

time_key

作為事件時間使用的key鍵,而不是事件記錄中的值value。如果未指定此參數,則將使用當前時間。

time_format

事件時間的格式用於time_key參數。默認情況是UNIX時間(整數)。

run_interval

周期程序運行之間的間隔時間。如果沒有指定值,命令腳本只運行一次。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

9.3、真實世界用例:使用in_exec來獲取Hacker News的頂部頁面

如果您已經有了一個定期運行的腳本(比如通過cron),您希望將輸出存儲到多個後端系統(HDFS、AWS、彈性搜索等),in_exec是一個不錯的選擇。

腳本的惟一要求是輸出TSV、JSON或MessagePack。

例如,下面的腳本刮掉了Hacker News的首頁,並收集了關於每個帖子的信息:

require 'nokogiri'require 'open-uri'require 'json'class HNParseError < RuntimeError; end$stdout.sync = trueurl = "https://news.ycombinator.com"parsed = Nokogiri::HTML(open(url))titles = parsed.css("td.title > a:first")subtexts = parsed.css("td.subtext")if titles.length != 31 or subtexts.length != 30raise HNParseErrorendtitles = titles[0..29]capture_time = Time.now.to_ititles = titles.each_with_index.map { |title, ii|{ "time" => capture_time,"rank" => ii + 1,"title" => title.text}}subtexts = subtexts.map { |subtext|subtext_text = subtext.texthiring_notice = falsebeginunique_id = subtext.css("a:last").attr('href')rescueunique_id = ""hiring_notice = trueendmatch = /(?<points>\d+) points? by (?<user_name>[^ ]+) (?<duration>[^|]+)[^\d]*(?<num_comments>\d+) comments?/.match(subtext_text)match = /(?<points>\d+) points? by (?<user_name>[^ ]+) (?<duration>[^|]+)/.match(subtext_text) if not matchif matchpoints = match["points"]user_name = match["user_name"]duration = match["duration"]beginnum_comments = match["num_comments"]rescuenum_comments = 0endelsepoints = user_name = duration = num_comments = ""end{ "points" => points.to_i,"user_name" => user_name,"duration" => duration,"num_comments" => num_comments.to_i,"unique_id" => unique_id,"hiring_notice" => hiring_notice}}for ii in 0..29puts (titles[ii].merge subtexts[ii]).to_jsonend

假設該腳本被稱為hn.rb。 然後,您可以使用以下配置每5分鐘運行一次

<source>@type execformat jsontag hackernewscommand ruby /path/to/hn.rbrun_interval 5m # don't hit HN too frequently!</source><match hackernews>@type stdout</match>

如果您運行Fluentd,您將看到以下輸出(如果您不耐煩,ctrl-C刷新stdout緩衝區)

2014-05-26 21:51:35 +0000 hackernews: {"time":1401141095,"rank":1,"title":"Rap Genius Co-Founder Moghadam Fired","points":128,"user_name":"obilgic","duration":"2 hours ago ","num_comments":108}2014-05-26 21:51:35 +0000 hackernews: {"time":1401141095,"rank":2,"title":"Whitewood Under Siege: Wooden Shipping Pallets","points":128,"user_name":"drjohnson","duration":"3 hours ago ","num_comments":20}2014-05-26 21:51:35 +0000 hackernews: {"time":1401141095,"rank":3,"title":"Organic Cat Litter Chief Suspect In Nuclear Waste Accident","points":55,"user_name":"timr","duration":"2 hours ago ","num_comments":12}2014-05-26 21:51:35 +0000 hackernews: {"time":1401141095,"rank":4,"title":"Do We Really Know What Makes Us Healthy? (2007)","points":27,"user_name":"gwern","duration":"1 hour ago ","num_comments":9}

當然,您可以使用Fluentd的許多輸出插件將數據存儲到各種後端系統,如Elasticsearch,HDFS,MongoDB,AWS等。

10、syslog Input Plugin

in_syslog輸入插件使Fluentd可以通過UDP或TCP上的syslog協議檢索記錄。

10.1、示例

in_syslog包含在Fluentd的core中。 不需要額外的安裝過程。

<source>@type syslogport 5140bind 0.0.0.0tag system</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

使用示例

檢索的數據組織如下。 Fluentd的標籤由tag參數(標籤前綴),設備級別和優先順序生成。 該記錄由正則表達式解析。

tag = "#{@tag}.#{facility}.#{priority}"record = {"pri": "0","time": 1353436518,"host": "host","ident": "ident","pid": "12345","message": "text"}

10.2、參數

@type (required)

這個值必須是syslog

tag (required)

tag的前綴。 標籤本身由標籤前綴,設備級別和優先順序生成。

port

埠監聽,默認是5140

bind

監聽的地址,默認是0.0.0.0

protocol_type

用於接收日誌的傳輸協議。 支持「udp」和「tcp」。 「udp」默認。

message_length_limit

syslog消息的最大位元組數。 默認值為2048.如果發送較大的消息,請更改此參數。

message_format

此參數自v0.12.33可用。

指定協議格式。 支持的值為rfc3164,rfc5424和auto。 默認值為rfc3164。 如果您的系統日誌使用rfc5424,請改用rfc5424。

這是一個消息的例子:

# rfc3164<6>Feb 28 12:00:00 192.168.0.1 fluentd[11111]: [error] Hello!# rfc5424<16>1 2017-02-28T12:00:00.009Z 192.168.0.1 fluentd - - - Hello!

當in_syslog收到每個源的rfc3164和rfc5424消息時,auto是有用的。 in_syslog通過使用消息前綴檢測消息格式並進行解析。

格式

日誌的格式。 此選項用於使用解析器(parse)插件解析非標準的syslog格式

<source>@type syslogtag systemformat FORMAT_PARAMETER</source>

您的format正則表達式不應該考慮日誌的'priority'前綴。 例如,如果在syslog中收到以下日誌:

<1>Feb 20 00:00:00 192.168.0.1 fluentd[11111]: [error] hogehoge

那麼格式解析器會收到以下日誌:

Feb 20 00:00:00 192.168.0.1 fluentd[11111]: [error] hogehoge

如果缺少format參數,則假定日誌數據具有規範的syslog格式(請參閱with_priority)。

with_priority

此選項僅在格式不存在時有效。 如果with_priority為true,則假定syslog消息以「<3>」為優先標記。 存在此選項,因為某些syslog守護程序在消息正文之前輸出沒有優先順序標籤的日誌。

如果要解析任意格式的syslog消息,建議使用in_tcp或in_udp。

include_source_host

如果為true,請將源主機添加到事件記錄。 默認值為false。 這是不推薦的。 使用source_hostname_key。

source_hostname_key

客戶機主機名的欄位名。如果設置值,將設置客戶機的主機名。默認值為nil(沒有添加主機名)。

priority_key

優先順序的欄位名稱。 如果設置該值,則優先順序將被設置為其鍵key。 默認值為nil(不添加優先順序)。

facility_key

設備的欄位名稱。如果設置該值,則該設施將設置為其鍵。預設值為nil(沒有添加功能)。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

10.3、TCP協議和消息分隔符

此插件假定\ n在一個TCP連接中的syslog消息之間的分隔符字元。 如果您使用protocol_type tcp在應用程序中使用syslog庫,請將\ n添加到您的syslog消息中。

See also [rfc6587.](https://tools.ietf.org/html/rfc6587#section-3.4.2

11、scribe Input Plugin

in_scribe輸入插件使Fluentd可以通過Scribe協議檢索記錄。 Scribe是Facebook開源的另一個日誌收集器守護進程。

由於Scribe最近沒有得到很好的維護,所以這個插件對於想要使用Fluentd和現有Scribe基礎架構的現有Scribe用戶很有用。

11.1、安裝

in_scribe默認包含在td-agent中。 Fluentd gem用戶將需要使用以下命令安裝流暢插件刻錄寶石。

$ fluent-gem install fluent-plugin-scribe

11.2、示例配置

<source>@type scribeport 1463bind 0.0.0.0msg_format json</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

使用示例

我們假設您已經熟悉了Scribe協議。 這個Ruby示例代碼將日誌發送到in_scribe。

Scribe的類別欄位成為Fluentd事件日誌的標籤,Scribe的消息欄位成為記錄本身。 msg_format參數指定消息欄位的格式。

11.3、參數

type (required)

這個值必須是scribe

port

埠監聽 默認是1463

bind

地址綁定默認是0.0.0.0

msg_format

消息格式可以是'text','json'或'url_param'(默認值:text)

對於json來說,Fluentd的記錄組織如下。 Scribe的消息欄位必須是表示Hash的有效JSON字元串; 否則記錄被忽略。

tag: $categoryrecord: $message

對於文本,Fluentd的記錄組織如下。 Scribe的消息可以是任意字元串,但建議使用JSON以便隨後使用分析管道。

tag: $categoryrecord: {'message': $message}

對於url_param,Fluentd的記錄組織如下。 Scribe的消息欄位必須包含具有URL編碼的URL參數樣式鍵值對(例如key1 = val1&key2 = val2)。

tag: $url_paramrecord: {$key1: $val1, $key2: $val2, ...}

is_framed

指定是否使用Thrift的框架協議(默認值為true)。

server_type

選擇伺服器架構。 選項是「simple」,「threaded」,「thread_pool」或「nonblocking」(默認值:nonblocking)。

add_prefix

將始終添加到標籤的前綴字元串(默認值:nil)。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

12、Multiprocess Input Plugin

默認情況下,Fluentd僅在系統上使用單個CPU內核。 in_multiprocess輸入插件使Fluentd能夠通過產生多個子進程來使用多個CPU內核。 一個Fluentd用戶正在使用此插件來處理每天超過10億條記錄。

12.1、安裝

默認情況下,in_multiprocess不包含在td-agent中。 td-agent用戶必須手動安裝流暢插件多進程。

  • Fluentd: fluent-gem install fluent-plugin-multiprocess

  • td-agent v2: /usr/sbin/td-agent-gem install fluent-plugin-multiprocess

  • td-agent v1: /usr/lib/fluent/ruby/bin/fluent-gem install fluent-plugin-multiprocess

12.2、示例配置

<source>@type multiprocess<process>cmdline -c /etc/fluent/fluentd_child1.conf --log /var/log/fluent/fluentd_child1.logsleep_before_start 1ssleep_before_shutdown 5s</process><process>cmdline -c /etc/fluent/fluentd_child2.conf --log /var/log/fluent/fluentd_child2.logsleep_before_start 1ssleep_before_shutdown 5s</process><process>cmdline -c /etc/fluent/fluentd_child3.conf --log /var/log/fluent/fluentd_child3.logsleep_before_start 1ssleep_before_shutdown 5s</process></source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

特別是對於守護進程的Fluentd(例如:td-agent),必須指定--log選項來放置子進程的日誌。

12.3、參數

@type (required)

這個值必須是multiprocess

graceful_kill_interval

該間隔發送信號以優雅地關閉進程(默認值:2sec)。

graceful_kill_interval_increment

當優雅的關機失敗,增加的時間(默認:3sec)。

graceful_kill_timeout

確定優雅關閉失敗的超時時間(default: 60sec).

process (required)

進程部分設置子進程的命令行參數。 此插件為每個部分創建一個子進程。

cmdline (required)

一段必須的cmdline參數

sleep_before_start

此參數設置開始進程之前的等待時間(默認值:0sec)。

sleep_before_shutdown

此參數在關閉進程之前設置等待時間(默認值:0sec)。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

13、dummy Input Plugin

in_dummy輸入插件生成虛擬事件。 它對Fluentd的測試,調試,基準測試和開始使用非常有用。

13.1、示例配置

in_dummy包含在Fluentd的core中。 不需要額外的安裝過程。

<source>@type dummydummy {"hello":"world"}</source>

請參閱配置文件文章,了解配置文件的基本結構和語法。

13.2、參數

@type (required)

這個值必須是dummy

tag (required)

該值是分配給生成的事件的標籤。

dummy (optional)

要生成的虛擬數據。 它應該是一組JSON散列或單個JSON散列。 如果它是一個數組的JSON散列,則數組中的散列按順序循環。 默認情況下,值為[{「message」:「dummy」}](即,它繼續生成具有記錄{「message」:「dummy」}的事件)。

auto_increment_key (optional, string type可選,字元串類型)

如果指定,每個生成的事件都有一個自動遞增的密鑰欄位。 例如,使用auto_increment_key foo_key,前幾個事件看起來像

2014-12-14 23:23:38 +0000 test: {"message":"dummy","foo_key":0}2014-12-14 23:23:38 +0000 test: {"message":"dummy","foo_key":1}2014-12-14 23:23:38 +0000 test: {"message":"dummy","foo_key":2}

rate (optional, integer type)

它配置每秒生成多少事件。 默認值為1。

日誌級別參數

log_level選項允許用戶為每個插件設置不同級別的日誌記錄。 支持的日誌級別有:fatal, error, warn, info, debug, and trace.

有關詳細信息,請參閱日誌文章。

14、Other Input Plugins

請參閱此可用插件列表,了解其他輸入插件。

  • Fluentd plugins

Advertisements

你可能會喜歡