in_http插件允許使用HTTP協(xié)議來采集日志事件。這個插件會建立一個支持REST風(fēng)格的HTTP端點,來接收日志事件請求。
<source> @type http port 9880 bind 0.0.0.0 body_size_limit 32m keepalive_timeout 10s</source>如果已經(jīng)建立了一個使用in_http插件的Fluentd節(jié)點,我們可以通過發(fā)送post請求向這個節(jié)點發(fā)送日志記錄。比如:# Post a record with the tag "app.log"$ curl -X POST -d 'json={"foo":"bar"}' http://localhost:9880/app.log這里,通過uri來指定日志事件的tag,通過post消息體來傳遞日志數(shù)據(jù),默認(rèn)情況下,日志事件的時間戳字段會在in_http收到日志數(shù)據(jù)后被添加上??梢酝ㄟ^在url中指定time參數(shù)來設(shè)置時間戳。比如:# Overwrite the timestamp to 2018-02-16 04:40:37.3137116$ curl -X POST -d 'json={"foo":"bar"}' \ http://localhost:9880/test.tag?time=1518756037.3137116下邊是另一個示例,使用js來發(fā)送日志記錄。// Post a record using XMLHttpRequestvar form = new FormData();form.set('json', JSON.stringify({"foo": "bar"}));
var req = new XMLHttpRequest();req.open('POST', 'http://localhost:9880/debug.log');req.send(form);我們可以看到,通過這種方式,任何基于HTTP的應(yīng)用程序都可以使用Fluentd作為日志服務(wù)。
@type 插件類型,取值為http。
port 監(jiān)聽端口,默認(rèn)為9880. bind 監(jiān)聽的網(wǎng)卡地址,默認(rèn)為0.0.0.0,監(jiān)聽所有網(wǎng)卡。 body_size_limit POST消息體(即日志數(shù)據(jù))最大字節(jié)數(shù),默認(rèn)為32MB。 keepalive_timeout HTTP keepalive超時時長,默認(rèn)為10秒。 add_http_headers 是否向日志記錄中添加HTTP_為前綴的頭部信息,默認(rèn)不添加。 add_remote_addr 是否向日志記錄中添加REMOTE_ADDR字段,默認(rèn)不添加。 如果添加,該字段的值為客戶端的ip地址。 如果HTTP請求頭部中設(shè)置了多個X-Forwarded-For字段,in_http采用第一個X-Forwarded-For的值作為REMOTE_ADDR的值。比如: X-Forwarded-For: host1, host2X-Forwarded-For: host3這個HTTP請求頭包含了3個X-Forwarded-For,in_http取host1作為REMOTE_ADDR的值。 cors_allow_origins 設(shè)置CORS域名白名單,默認(rèn)不可跨域。 如果設(shè)置白名單,其值為一個數(shù)組,比如["domain1", "domain2"]。 對于白名單之外的域名,in_http會返回403錯誤。 從Fluentd v1.2.6版本,該參數(shù)取值支持通配符*,以允許接收任何域名發(fā)來的請求。比如: <source> @type http port 9880 cors_allow_origins ["*"]</source>respond_with_empty_img 是否使用1×1大小的圖片作為響應(yīng)消息。 默認(rèn)使用空字符串作為響應(yīng)消息。 <transport>配置項 用于配置是否使用TLS傳輸。 <transport tls> cert_path /path/to/fluentd.crt # other parameters</transport><parse>指令 設(shè)置用于解析輸入日志的解析器插件。 比如:
<source> @type http port 9880 <parse> @type regexp expression /^(?<field1>\d+):(?<field2>\w+)$/ </parse></source>
這里使用regexp來解析輸入日志。相應(yīng)的,POST消息體中的日志格式不再是json格式。 可以使用如下命令發(fā)送日志記錄:
# This will be parsed into {"field1":"123456","field2":"awesome"}$ curl -X POST -d '123456:awesome' http://localhost:9880/app.log
如何以MessagePack格式發(fā)送數(shù)據(jù)到in_http? 可以在post消息體中增加"msgpack="前綴,來指明日志數(shù)據(jù)格式為MessagePack。比如: # Send data in msgpack format$ msgpack=`echo -e "\x81\xa3foo\xa3bar"`$ curl -X POST -d "msgpack=$msgpack" http://localhost:9880/app.log如何使用HTTP Content-Type消息頭? in_http可以識別日志請求中的Content-Type消息頭,從而識別日志的封裝格式。 比如,可以通過在HTTP消息頭中指定Content-Type為json,來發(fā)送json格式的日志而不使用"json="前綴。 $ curl -X POST -d '{"foo":"bar"}' -H 'Content-Type: application/json' http://localhost:9880/app.log同樣,也可以設(shè)置Content-Type為"application/msgpack"來發(fā)送MessagePack格式的日志。
$ msgpack=`echo -e "\x81\xa3foo\xa3bar"`$ curl -X POST -d "$msgpack" -H 'Content-Type: application/msgpack' http://localhost:9880/app.log
使用批處理模式處理大量數(shù)據(jù) 可以將多條日志組合為數(shù)組,通過一次HTTP請求發(fā)送到in_http接收節(jié)點 比如: # Send multiple events as a JSON array$ curl -X POST -d 'json=[{"foo":"bar"},{"abc":"def"},{"xyz":"123"}]' http://localhost:9880/app.log這樣通過減少HTTP請求次數(shù)提高系統(tǒng)的吞吐量。 壓縮數(shù)據(jù)以減少帶寬占用 從v1.2.3開始,F(xiàn)luentd支持處理gzip格式的壓縮數(shù)據(jù)。 可以在HTTP消息頭中通過Content-Encoding來指定數(shù)據(jù)編碼(壓縮)方式。
# Send gzip-compressed payload$ echo 'json={"foo":"bar"}' | gzip > json.gz$ curl --data-binary @json.gz -H "Content-Encoding: gzip" http://localhost:9880/app.log僅此即可,不需要對Fluentd進行額外配置。 多worker進程環(huán)境 如果在多worker進程模式下使用in_http插件,這些worker進程將會監(jiān)聽相同的端口。
<system> workers 3</system><source> @type http port 9880</source>這個配置中,3個worker進程會同時監(jiān)聽9880端口,輸入數(shù)據(jù)會自動在worker進程間路由。
【錯誤排查】
為何日志中的"+"號被in_http刪除了? 這是HTTP規(guī)范所致,并非Fluentd所為。 應(yīng)用程序需要使用合適的編碼方式,或使用multipart請求,來避免這種情況。 比如,可以通過如下方式發(fā)送帶"+"號的日志。 # OKcurl -X POST -H 'Content-Type: multipart/form-data' -F 'json={"message":"foo+bar"}' http://localhost:9880/app.log
# Badcurl -X POST -F 'json={"message":"foo+bar"}' http://localhost:9880/app.log
【如果本文對您有幫助,希望可以分享轉(zhuǎn)發(fā),或者點下“在看”】
|