如何在Logstash中配置按message长度触发的truncate插件并添加标签
Logstash truncate 插件按消息长度触发的正确配置
你之前的两种写法报错是因为不符合 Logstash 配置的DSL语法规范:
- Logstash 中访问事件字段不需要加
event.或field.前缀,直接用[字段名]格式取值即可 - 你用的
.length统计的是字符数,和truncate插件length_bytes参数的字节统计单位不一致,处理多字节字符(比如中文、emoji)时会出现判断偏差,要匹配字节长度需要用.bytesize方法 - 缺少字段存在性判断,如果事件不存在
message字段,直接调用长度方法会触发运行时错误
适用7.x及以上版本的最简配置
直接在filter块中使用如下条件即可:
filter { # 先判断message存在,且字节长度大于2000再执行截断 if [message] and ([message].bytesize > 2000) { truncate { fields => "message" length_bytes => 2000 add_tag => [ "truncated_msg" ] } } }
这种写法下只有满足长度条件的事件才会执行truncate插件,truncated_msg标签也只会在实际发生截断时添加,完全符合你的需求。
低版本Logstash兼容方案
如果使用的是6.x及更早版本,不支持在条件语句中直接调用.bytesize,可以先通过ruby过滤器计算长度存入临时字段再判断:
filter { # 计算message的字节长度存入临时字段 ruby { code => 'event.set("[@msg_byte_len]", event.get("message").bytesize) if event.get("message")' } if [@msg_byte_len] > 2000 { truncate { fields => "message" length_bytes => 2000 add_tag => [ "truncated_msg" ] } } # 清理临时字段避免输出冗余内容 mutate { remove_field => [ "@msg_byte_len" ] } }
内容的提问来源于stack exchange,提问作者Erwan Le Tutour
相关产品推荐
相关产品推荐

