我正在尝试截断通过我的logstash转发器传入的消息。我的数据可以截断,没有截断,它在我的日志提供程序中被切断,导致json损坏。
我已经将以下配置添加到我的logstash配置
filter {
mutate {
rename => { "message" => "@message" }
}
mutate {
gsub => ["@message", "^.{1000}(.*)$", "..."]
}
}
我的假设是gsub regex将从第1001个字符直到字段值结束,并将其替换为"…"
我还必须将字段message重命名为@message以保持一致性。
但它似乎根本不想修剪。
任何想法,我可能做错了或另一种过滤器类型,我应该使用做截断?
您可以使用ruby过滤器:
ruby {
code => "event['@message'] = event['@message'][0...1000]+'...'"
}
这将用@message
字段中的前1000个字符替换@message
字段,然后是...
。
Update:它可能不能在所有版本的Logstash上工作。它是在2.4版本上测试的(我认为),不会在最新版本的Logstash上工作;使用gsub
的其他解决方案应该可以在所有版本中工作。
这对我有用:
mutate {
gsub => [
"message", "(^.{1,1000}).*$", "1..."
]
}
我最初尝试了@baudsp的ruby过滤器建议,但无法让它工作
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个点