使用gsub强制使用Logstash消息字段

时间:2016-06-30 04:46:49

标签: logging logstash

我试图通过我的logstash转发器截断我的消息。我的数据可以截断,没有截断,它在我的日志提供程序中被切断,导致json破坏。

我已将以下配置添加到我的logstash配置

filter {
  mutate {
    rename => { "message" => "@message" }
  }
  mutate {
    gsub => ["@message", "^.{1000}(.*)$", "..."]
  }
}

我的假设是gsub正则表达式将从第1001个字符到字段值结束并将其替换为“...”

我还必须将字段消息重命名为@message以保持一致。

但它似乎根本不想修剪。这是使用logstash 2.3。

关于我可能做错了什么或者我应该用来截断的其他过滤器类型的任何想法?

3 个答案:

答案 0 :(得分:3)

你可以使用ruby过滤器:

ruby {
    code => "event['@message'] = event['@message'][0...1000]+'...'"
  }

这会将@message字段替换为@message字段中的前1000个字符,然后是...

更新:它可能无法在所有版本的Logstash上运行。它在2.4版本上进行了测试(我认为),并且不适用于更新版本的Logstash;使用gsub的其他解决方案应适用于所有版本。

答案 1 :(得分:1)

这对我有用:

    mutate {
        gsub => [             
            "message", "(^.{1,1000}).*$", "\1..."
        ]
    }   

我最初尝试过来自@baudsp的ruby过滤器建议,但无法让它工作。

答案 2 :(得分:0)

5.1 logstash后有一个截断过滤器:https://www.elastic.co/guide/en/logstash/5.1/plugins-filters-truncate.html

truncate {
  length_bytes => ...
}

在此之前,我认为最好的选择是使用范围过滤器进行变异:

range {
    ranges => [ "message", 1000, 100000, "tag:longmessage"]
  }

if "longmessage" in [tags] {
  mutate {
    #truncate long messages
    gsub => [ "message", "(^.{1,1000}).*$", "\1..."]
  }
}

上一个答案有效,但在每封邮件的末尾设置了3个点。