【问题标题】:Logstash multiline failing with custom json parsingLogstash 多行因自定义 json 解析而失败
【发布时间】:2015-09-21 19:12:57
【问题描述】:

我有一个带有 json 对象的 Kafka 队列。我正在用一个基于 java 的离线生产者填充这个队列。 json对象的结构示例:

{ 
    "key": "999998", 
    "message"  : "dummy \n Messages \n Line 1 ", 
    "type"  : "app_event", 
    "stackTrace" : "dummyTraces", 
    "tags" : "dummyTags" 

}

注意“消息”中的\n

我在队列中加载了数百万个对象,并使用以下脚本启动了 logstash:

input {
        kafka {
                zk_connect => "localhost:2181"
                topic_id => "MemoryTest"
                type => "app_event"
                group_id => "dash_prod"
        } 
}

filter{
        if [type] == "app_event" {
                multiline {
                         pattern => "^\s"
                         what => "previous"
                }
        }
}

output {
    if [type] == "app_event" {
        stdout { 
         codec => rubydebug 
         }

          elasticsearch {
                  host => "localhost"
                  protocol => "http"
                  port => "9200"
                  index => "app_events"
                  index_type => "event"     
          }
    }
}

多行过滤器预计会从消息字段中删除\n。当我启动 logstash 时,我开始遇到两个问题:

  1. 没有任何事件被推送到 Elastic 中。我收到错误:_jsonparsefailure。另请注意,一个事件的消息会“吞噬”连续的事件。

    { "message" => "{ \n\t\"key\": \"146982\", \n\t\"message\" : \"dummy \n Messages \n Line 1 \", \n\t \"type\" : \"app_event\", \n\t\"stackTrace\" : \"dummyTraces\", \n\t\"tags\" : \"dummyTags\" \n \t \n} \n{ \n\t\"key\": \"146983\", \n\t\"message\" : \"dummy \n Messages \n Line 1 \", \n\t\"type\ " : \"app_event\", \n\t\"stackTrace\" : \"dummyTraces\", \n\t\"tags\" : \"dummyTags\" \n \t \n}\n{ \ n\t\"key\": \"146984\", \n\t\"message\" : \"dummy \n Messages \n Line 1 \", \n\t\"type\" : \" app_event\", \n\t\"stackTrace\" : \"dummyTraces\", \n\t\"tags\" : \"dummyTags\" \n \t \n}, “标签” => [ [0] "_jsonparsefailure", 1“多行” ], "@version" => "1", "@timestamp" => "2015-09-21T18:38:32.005Z", “类型” => “app_event” }

  2. 几分钟后,可用堆内存达到上限,logstash 停止。

此问题附有内存配置文件。 13 分钟后,logstash 达到内存上限并停止响应。

我正在尝试了解如何让多行在这种情况下工作以及导致内存崩溃的原因。

【问题讨论】:

  • 您希望您的“消息”字段变成什么?
  • 我希望将 \n 从消息中删除。

标签: elasticsearch logstash apache-kafka multiline


【解决方案1】:

要替换字符串的一部分,请使用mutate->gsub{}

filter {
  mutate {
    gsub => [
      # replace all forward slashes with underscore
      "fieldname", "/", "_",
      # replace backslashes, question marks, hashes, and minuses
      # with a dot "."
      "fieldname2", "[\\?#-]", "."
    ]
  }
}

正如您所发现的,多行用于将多个事件合并为一个。

【讨论】:

    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多