You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为你的实际计算公式;
  • 可选删除原始十六进制字段,优化数据存储。

三、验证配置

  1. 测试Grok解析:运行telegraf --config your_config.conf --input-filter tail --test,检查日志是否能被正确解析;
  2. 验证计算结果:启动Telegraf后,查看输出目标(如InfluxDB)中的数据,确认combined_decimal和custom_calculation字段值是否符合预期。

内容的提问来源于stack exchange,提问作者oryble

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:37:01