当前位置: 首页 > 面试题库 >

输入json到logstash-配置问题?

汤弘文
2023-03-14
问题内容

我有以下我要转储到logstash的json输入(并最终在elasticsearch / kibana中搜索/仪表板)。

{"vulnerabilities":[
    {"ip":"10.1.1.1","dns":"z.acme.com","vid":"12345"},
    {"ip":"10.1.1.2","dns":"y.acme.com","vid":"12345"},
    {"ip":"10.1.1.3","dns":"x.acme.com","vid":"12345"}
]}

我正在使用以下logstash配置

input {
  file {
    path => "/tmp/logdump/*"
    type => "assets"
    codec => "json"
  }
}
output {
  stdout { codec => rubydebug }
  elasticsearch { host => localhost }
}

输出

{
       "message" => "{\"vulnerabilities\":[\r",
      "@version" => "1",
    "@timestamp" => "2014-10-30T23:41:19.788Z",
          "type" => "assets",
          "host" => "av12612sn00-pn9",
          "path" => "/tmp/logdump/stack3.json"
}
{
       "message" => "{\"ip\":\"10.1.1.30\",\"dns\":\"z.acme.com\",\"vid\":\"12345\"},\r",
      "@version" => "1",
    "@timestamp" => "2014-10-30T23:41:19.838Z",
          "type" => "assets",
          "host" => "av12612sn00-pn9",
          "path" => "/tmp/logdump/stack3.json"
}
{
       "message" => "{\"ip\":\"10.1.1.31\",\"dns\":\"y.acme.com\",\"vid\":\"12345\"},\r",
      "@version" => "1",
    "@timestamp" => "2014-10-30T23:41:19.870Z",
          "type" => "shellshock",
          "host" => "av1261wag2sn00-pn9",
          "path" => "/tmp/logdump/stack3.json"
}
{
            "ip" => "10.1.1.32",
           "dns" => "x.acme.com",
           "vid" => "12345",
      "@version" => "1",
    "@timestamp" => "2014-10-30T23:41:19.884Z",
          "type" => "assets",
          "host" => "av12612sn00-pn9",
          "path" => "/tmp/logdump/stack3.json"
}

显然logstash将每一行都视为一个事件,它认为这{"vulnerabilities":[是一个事件,我猜测两个后续节点上的尾随逗号使解析混乱,并且最后一个节点显得正确。我如何告诉Logstash解析漏洞数组内的事件,并忽略行尾的逗号?

更新日期:2014-11-05 遵循Magnus的建议,我添加了json过滤器,它运行良好。但是,如果未start_position => "beginning"在文件输入块中指定,则无法正确解析json的最后一行。任何想法为什么不呢?我知道它默认情况下会自下而上解析,但是可以预期mutate
/ gsub会顺利处理吗?

file {
    path => "/tmp/logdump/*"
    type => "assets"
    start_position => "beginning"
  }
}
filter {
  if [message] =~ /^\[?{"ip":/ {
    mutate {
      gsub => [
        "message", "^\[{", "{",
        "message", "},?\]?$", "}"
      ]
    }
    json {
      source => "message"
      remove_field => ["message"]
    }
  }
}
output {
  stdout { codec => rubydebug }
  elasticsearch { host => localhost }
}

问题答案:

您可以跳过json编解码器,并使用多行过滤器将邮件加入单个字符串中,然后将其输入到json过滤器中。

filter {
  multiline {
    pattern => '^{"vulnerabilities":\['
    negate => true
    what => "previous"
  }
  json {
    source => "message"
  }
}

但是,这会产生以下不良结果:

{
            "message" => "<omitted for brevity>",
           "@version" => "1",
         "@timestamp" => "2014-10-31T06:48:15.589Z",
               "host" => "name-of-your-host",
               "tags" => [
        [0] "multiline"
    ],
    "vulnerabilities" => [
        [0] {
             "ip" => "10.1.1.1",
            "dns" => "z.acme.com",
            "vid" => "12345"
        },
        [1] {
             "ip" => "10.1.1.2",
            "dns" => "y.acme.com",
            "vid" => "12345"
        },
        [2] {
             "ip" => "10.1.1.3",
            "dns" => "x.acme.com",
            "vid" => "12345"
        }
    ]
}

除非漏洞数组中有固定数量的元素,否则我认为我们无法做很多事情(无需求助于ruby过滤器)。

仅将json过滤器应用于看起来像我们想要的行,然后丢弃其余的行呢?您的问题不清楚所有日志是否都像这样,因此可能没有太大用处。

filter {
  if [message] =~ /^\s+{"ip":/ {
    # Remove trailing commas
    mutate {
      gsub => ["message", ",$", ""]
    }
    json {
      source => "message"
      remove_field => ["message"]
    }
  } else {
    drop {}
  }
}


 类似资料:
  • 问题内容: 在Logstash文档中找不到关系数据库的任何输入插件。 用logstash从一个关系数据库表中导入数据的最佳方法是什么?是否使用JDBC将Elastic Search直接连接到数据库? 问题答案: 您将需要使用JDBC River(https://github.com/jprante/elasticsearch-river- jdbc )将JDBC数据加载到elasticsearch

  • 链接 input配置 codec配置 filter配置 output配置

  • 我试图在logstash 5.1.2上运行插件,并得到错误:直接事件字段引用(即event['field']='value')已被禁用,以支持使用event get和set方法(例如event.set('field','value'))。有关更多详细信息,请参阅Logstash 5.0破坏性更改文档。 19:20:09.456[LogStash::Runner]信息LogStash。输入。mong

  • 我正在尝试设置logstash input mongodb插件,以便从我的数据库中读取审计,但所有解析策略似乎都有问题,我不知道如何定制任何内容。 “flatte”parse_方法工作得很好,但它忽略了mongodb对象ID,并且除了在log_输入字段中之外,不会在任何地方输出它们。 “简单”parse_method包括对象标识,但以我无法弄清楚如何使用日期过滤器解析日期的方式输出日期(例如,“2

  • 问题内容: 我正在尝试使用Logstash将XML转换为ElasticSearch的JSON。我能够读取值并将其发送到ElasticSearch。问题是所有值都以数组形式出现。我想让它们像字符串一样出来。我知道我可以为每个字段分别执行操作,但是随后遇到了一个问题,嵌套字段的深度为3级。 XML格式 Logstash配置 示例输出 如您所见,输出是每个元素的数组(我替换为的locationId除外)

  • 问题内容: 这是我另一个问题的跟进:Logstash中的JSON解析器忽略数据了吗? 但是这次我觉得问题比上次更清楚了,可能更容易回答。 我正在使用JSON解析器,如下所示: logstash.stdout中一个日志的输出部分看起来像这样: 当我删除JSON代码时,有一堆字段就像上面的字段一样工作。当我添加JSON过滤器时,由于某种原因,整个日志只会从elasticserach / kibana中