通过流利的方式将收到的数据解析为json

时间:2015-12-10 17:34:02

标签: fluentd

我正在尝试从外部系统中流利地接收数据,如下所示: 数据= {"版本":" 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数据的方法(这也是不好的方法)。

2 个答案:

答案 0 :(得分:1)

我回答自己。在尝试了很多配置(以及阅读流利/ nginx和博客的官方文档的几个小时后)后,我决定创建插件(http://docs.fluentd.org/articles/plugin-development#parser-plugins)。我已经用这个解决方案结束了:

  1. 分析器插件

    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
    
  2. 配置为流利

    <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>                    
    
  3. 我认为有足够的空间来实现核心代码,因为基本的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? 如果是这样,它就不能。