Telegraf Tail插件Grok格式报错及十六进制数据转换需求求助
解决Telegraf Tail插件Grok解析错误及十六进制转换计算问题
一、修复Grok解析错误
你的配置出现Invalid data format: Grok错误,核心原因有两个:
- 字段名不符合存储规则:
01hexa、02hexa这类以数字开头的字段名,不符合InfluxDB的标识符命名规范(不能以数字开头),导致解析失败。 - 时间格式匹配错误:第二种配置用
TIMESTAMP_ISO8601匹配非标准格式的dd/MM/yyyy HH:mm:ss,自然无法匹配成功。
修正后的Tail插件配置
[[inputs.tail]] files = ["/mnt/cle/*a.*.log"] from_beginning = true max_undelivered_lines = 300 character_encoding = "utf-8" data_format = "grok" grok_patterns = ['%{DATE_EU:date} %{TIME:time} %{WORD:my1id} %{WORD:my2id} %{BASE16NUM:hexa01} %{BASE16NUM:hexa02} %{BASE16NUM:hexa03} %{BASE16NUM:hexa04} %{BASE16NUM:hexa05} %{BASE16NUM:hexa06} %{BASE16NUM:hexa07} %{BASE16NUM:hexa08} %{BASE16NUM:hexa09} %{BASE16NUM:hexa10} %{BASE16NUM:hexa11}']
如果需要直接将日期时间合并为timestamp字段,可替换为以下grok_pattern:
grok_patterns = ['%{DATA:timestamp:ts-"02/01/2006 15:04:05"} %{WORD:my1id} %{WORD:my2id} %{BASE16NUM:hexa01} %{BASE16NUM:hexa02} %{BASE16NUM:hexa03} %{BASE16NUM:hexa04} %{BASE16NUM:hexa05} %{BASE16NUM:hexa06} %{BASE16NUM:hexa07} %{BASE16NUM:hexa08} %{BASE16NUM:hexa09} %{BASE16NUM:hexa10} %{BASE16NUM:hexa11}']
这里ts-"02/01/2006 15:04:05"是Go语言的时间布局,完全匹配你的日志时间格式。
二、十六进制合并转换与自定义计算
使用Telegraf的starlark处理器实现十六进制字段的合并、转十进制及自定义计算,完整配置如下:
1. 添加starlark处理器
[[processors.starlark]] source = ''' def apply(metric): # 提取所有十六进制字段值 hex_fields = [ metric.fields.get("hexa01"), metric.fields.get("hexa02"), metric.fields.get("hexa03"), metric.fields.get("hexa04"), metric.fields.get("hexa05"), metric.fields.get("hexa06"), metric.fields.get("hexa07"), metric.fields.get("hexa08"), metric.fields.get("hexa09"), metric.fields.get("hexa10"), metric.fields.get("hexa11") ] # 过滤空值并合并为完整十六进制字符串 combined_hex = "".join([h for h in hex_fields if h is not None]) # 转换为十进制整数 decimal_value = int(combined_hex, 16) # 替换为你的自定义计算公式(示例:十进制值*2+10) custom_result = decimal_value * 2 + 10 # 添加计算结果到指标 metric.fields["combined_decimal"] = decimal_value metric.fields["custom_calculation"] = custom_result # 可选:删除原始十六进制字段,减少数据量 for key in metric.fields.copy(): if key.startswith("hexa"): del metric.fields[key] return metric '''
2. 配置说明
- 先提取所有
hexaXX字段的值,合并成完整的十六进制字符串; - 通过
int(combined_hex, 16)将十六进制字符串转为十进制; - 修改
custom_result = decimal_value * 2 + 10为你的实际计算公式; - 可选删除原始十六进制字段,优化数据存储。
三、验证配置
- 测试Grok解析:运行
telegraf --config your_config.conf --input-filter tail --test,检查日志是否能被正确解析; - 验证计算结果:启动Telegraf后,查看输出目标(如InfluxDB)中的数据,确认
combined_decimal和custom_calculation字段值是否符合预期。
内容的提问来源于stack exchange,提问作者oryble
相关产品推荐
相关产品推荐

