【问题标题】:Using logstash to strip XSSI prefix from JSON response使用 logstash 从 JSON 响应中去除 XSSI 前缀
【发布时间】:2016-12-13 09:58:26
【问题描述】:

我有一个相当简单的问题,但它让我感到困惑。我正在尝试使用 Logstash 通过 rest api 获取 Gerrit 数据。我正在使用 http_poller 并且我的配置得到了正确的响应,所以我快到了。

现在我需要从 Gerrits JSON 响应的开头去除 XSSI 前缀 )]}'。问题是,怎么做?如何剥离或分裂或变异它,或者我应该如何进行?

我的输入配置:

input {
  http_poller {
    urls => {
      gerrit_projects => {
        method => get
        url => "http://url.to/gerrit/a/projects/"
        headers => { Accept => "application/json" }
        auth => { user => "userid" password => "supresecret" }
      }
    }
    target => "http_poller_data"
    metadata_target => "http_poller_metadata"
    request_timeout => 60
    interval => 60
  }
}
filter {
  if [http_poller_metadata] {
    mutate { 
      add_field => {
        "http_poller_host" => "%{http_poller_metadata[host]}"
        "http_poller" => "%{http_poller_metadata[name]}"
      }
    }
  }
  if [http_poller_metadata][runtime_seconds] and [http_poller_metadata][runtime_seconds] > 0.5 {
    mutate { add_tag => "slow_request" }
  }
  if [http_request_failure] or [http_poller_metadata][code] != 200 {
    mutate { add_tag => "bad_request" }
  }
}

output {
  stdout { codec => rubydebug }
}

以及部分回复:

Pipeline main started
JSON parse failure. Falling back to plain-text {:error=>#<LogStash::Json::ParserError: Unexpected character (')' (code 41)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at ... (bunch of lines)...
    {
            "http_poller_data" => {
               "message" => ")]}'\n{\"All-Users\":{\"id\":\"All-Users\",....(more valid JSON)...",
     "tags" => [
                [0] "_jsonparsefailure"
            ],
              "@version" => "1",
            "@timestamp" => "2016-12-13T09:48:25.397Z"
        },
                    "@version" => "1",
                  "@timestamp" => "2016-12-13T09:48:25.397Z",
        "http_poller_metadata" => { ... }

这是我对 StackOverflow 的第一个问题。感谢您的回答!

【问题讨论】:

    标签: json logstash gerrit


    【解决方案1】:

    您可以使用带有 gsub 选项 (link) 的 mutate 过滤器来删除 )]}

    mutate {
      gsub => [
        "message", "\)]}'", ""   
      ]
    }
    

    但是 gsub 替换了所有出现的正则表达式,所以你必须确保模式只出现一次。

    【讨论】:

    • 谢谢,这有助于解决我的问题!我在过滤器部分添加了以下几行: mutate { gsub => [ "message", "^)]}'\n", "" ] } json { source => "message" } 现在响应看起来应该.
    • @Leicha 没问题,很高兴它有帮助!
    【解决方案2】:

    我使用“sed 1d”来删除“)]}'”前缀和“jq”来处理 JSON 输出。例如,要获取我执行的 Gerrit 项目的状态:

    curl -s --header 'Content-Type:application/json' --request GET --netrc https://<GERRIT-SERVER>/a/projects/?r=<GERRIT-PROJECT> | sed 1d | jq --raw-output ".[] | .state"
    
    ACTIVE
    

    【讨论】:

    • 感谢您的评论,但我正在寻找一种 logstash 方式来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多