我正在尝试从外部系统中流利地接收数据,如下所示: 数据= {"版本":" 0.0&#34 ;;"秘密":空}
回应是: 400错误请求 ' JSON'或者' msgpack'参数是必需的
如果我用" json"发送(不能改变真实来源)相同的字符串而不是"数据" (比如json = {"版本":" 0.0&#34 ;;"秘密":null}),一切正常。我如何配置流利地接受它同样的方式?感谢。
fluent.conf的例子:
<source>
@type http
port 24224
bind 0.0.0.0
# accept "{"key":"value"} input
format json
# accept "json={"key":"value"} input
#format default
</source>
<match **>
@type file
@id output1
path /fluentd/log/data.*.log
symlink_path /fluentd/log/data.log
format json
append true
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
</match>
我尝试过使用正则表达式或者通过nginx修改数据。由于编码和复杂数据而无法使用正则表达式,并且没有找到如何使用nginx修改POST数据的方法(这也是不好的方法)。
答案 0 :(得分:1)
我回答自己。在尝试了很多配置(以及阅读流利/ nginx和博客的官方文档的几个小时后)后,我决定创建插件(http://docs.fluentd.org/articles/plugin-development#parser-plugins)。我已经用这个解决方案结束了:
分析器插件
module Fluent
class TextParser
class CMXParser < Parser
# Register this parser
Plugin.register_parser("parser_CMX", self)
config_param :format_hash, :string, :default => "data" # delimiter is configurable with " " as default
def configure(conf)
super
end
# This is the main method. The input "text" is the unit of data to be parsed.
def parse(text)
text = WEBrick::HTTPUtils.parse_query(text)
record = JSON.parse(text[@format_hash])
yield nil, record
end
end
end
end
配置为流利
<source>
@type http
port 24224
bind 0.0.0.0
body_size_limit 32m
keepalive_timeout 5s
format parser_CMX
</source>
<match **>
@type file
@id output1
path /fluentd/log/data.*.log
symlink_path /fluentd/log/data.log
format json
append true
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
</match>
我认为有足够的空间来实现核心代码,因为基本的in_http脚本做同样的事情,除了它只使用硬编码的字符串&#34; params [&#39; json&#39;]&#34;。它可以使用新的变量,如&#34; format_hash&#34; /&#34; format_map&#34;可以包含用于此目的的地图。
答案 1 :(得分:0)
http://docs.fluentd.org/articles/in_http
本文介绍了可接受的格式。
我如何配置流利的同样接受它?
这是否意味着您要使用data={"k":"v"}
解析format json
?
如果是这样,它就不能。