td-agent使用record_transformer脱敏无message字段报错如何解决
Fluentd record_transformer 无message字段报错解决方案
报错的核心原因是当日志记录不存在message字段时,record["message"]返回nil空值,调用gsub字符串替换方法时触发空指针异常,可通过以下两种方案解决:
方案1:修改脱敏表达式,兼容无message字段场景(推荐)
直接在现有的替换逻辑中加入空值判断即可,无需调整其他配置,有两种常用写法:
- 写法1:使用Ruby安全导航运算符
&.
把你原来的record["message"].gsub(...)全部替换成record["message"]&.gsub(...),&.会在调用对象为nil时直接返回nil,不会触发方法调用报错,配置示例如下:
<filter **> @type record_transformer <record> message ${record["message"]&.gsub(/[Pp]assword*([^,]*)/,'******')&.gsub(/([Aa]uthorization\s*.\s*[Bb]earer\s)[\w\.\-^]+/,'******')&.gsub(/([Aa]uthorization_ml\s*.\s*[Bb]earer\s)[\w\.\-^]+/,'******')} </record> </filter>
- 写法2:显式判断字段是否存在
如果对安全导航运算符的兼容性有顾虑,可以用三元运算符显式判断字段是否存在:
message ${record.key?('message') ? record["message"].gsub(/[Pp]assword*([^,]*)/,'******').gsub(/([Aa]uthorization\s*.\s*[Bb]earer\s)[\w\.\-^]+/,'******').gsub(/([Aa]uthorization_ml\s*.\s*[Bb]earer\s)[\w\.\-^]+/,'******') : nil}
方案2:前置过滤,仅处理存在message字段的日志
可以在record_transformer前面加一个grep过滤器,只放行存在message字段的日志进入脱敏流程,没有该字段的日志直接跳过处理:
<filter **> @type grep <regexp> key message pattern .+ </regexp> </filter> <filter **> @type record_transformer <record> message ${record["message"].gsub(/[Pp]assword*([^,]*)/,'******').gsub(/([Aa]uthorization\s*.\s*[Bb]earer\s)[\w\.\-^]+/,'******').gsub(/([Aa]uthorization_ml\s*.\s*[Bb]earer\s)[\w\.\-^]+/,'******')} </record> </filter>
注意:该方案会过滤掉所有没有message字段的日志,如果需要保留这些日志请选择方案1
内容的提问来源于stack exchange,提问作者Aswath Murugan
相关产品推荐
相关产品推荐

