文档文档

Grok 输入数据格式

使用 grok 数据格式通过类正则表达式语言解析行分隔数据。

有关 grok 模式的介绍,请参阅 Logstash 文档中的 Grok 基础知识。grok 解析器使用 Logstash grok 模式的轻微修改版本,格式如下:

%{<capture_syntax>[:<semantic_name>][:<modifier>]}

capture_syntax 定义用于解析输入行的 grok 模式,semantic_name 用于命名字段或标签。扩展名 modifier 控制 parsed item 被转换为的数据类型或其他特殊处理。

默认情况下,所有命名捕获都会转换为字符串字段。如果模式没有语义名称,它将不会被捕获。时间戳修饰符可用于将捕获转换为 parsed metric 的时间戳。如果没有解析时间戳,metric 将使用当前时间创建。

每行至少必须捕获一个字段。

  • 可用修饰符
    • string(如果未指定,则为默认值)
    • int
    • float
    • duration(例如,5.23ms 会被转换为 int 纳秒)
    • tag(将字段转换为标签)
    • drop(完全丢弃字段)
    • measurement(使用匹配的文本作为 measurement 名称)
  • 时间戳修饰符
    • ts(这将自动学习时间戳格式)
    • ts-ansic(“Mon Jan _2 15:04:05 2006”)
    • ts-unix(“Mon Jan _2 15:04:05 MST 2006”)
    • ts-ruby(“Mon Jan 02 15:04:05 -0700 2006”)
    • ts-rfc822(“02 Jan 06 15:04 MST”)
    • ts-rfc822z(“02 Jan 06 15:04 -0700”)
    • ts-rfc850(“Monday, 02-Jan-06 15:04:05 MST”)
    • ts-rfc1123(“Mon, 02 Jan 2006 15:04:05 MST”)
    • ts-rfc1123z(“Mon, 02 Jan 2006 15:04:05 -0700”)
    • ts-rfc3339(“2006-01-02T15:04:05Z07:00”)
    • ts-rfc3339nano(“2006-01-02T15:04:05.999999999Z07:00”)
    • ts-httpd(“02/Jan/2006:15:04:05 -0700”)
    • ts-epoch(自 Unix 纪元以来的秒数,可能包含小数)
    • ts-epochnano(自 Unix 纪元以来的纳秒数)
    • ts-epochmilli(自 Unix 纪元以来的毫秒数)
    • ts-syslog(“Jan 02 15:04:05”,解析的时间设置为当前年份)
    • ts-“CUSTOM”

CUSTOM 时间布局必须用引号括起来,并且是“参考时间”的表示形式,即 Mon Jan 2 15:04:05 -0700 MST 2006。要匹配逗号小数,可以使用句点。例如,%{TIMESTAMP:timestamp:ts-"2006-01-02 15:04:05.000"} 可用于匹配 "2018-01-02 15:04:05,000"。要在模式字符串中匹配逗号小数,可以使用句点。有关更多详细信息,请参阅 https://golang.ac.cn/pkg/time/#Parse 。

Telegraf 拥有许多自己的 内置模式,以及对 Logstash 核心模式 中大部分的支持。Golang 正则表达式不支持前瞻后顾。依赖这些的 Logstash 模式不受支持。

有关构建和测试模式的帮助,请参阅 创建模式的技巧

配置

[[inputs.file]]
  ## Files to parse each interval.
  ## These accept standard unix glob matching rules, but with the addition of
  ## ** as a "super asterisk". ie:
  ##   /var/log/**.log     -> recursively find all .log files in /var/log
  ##   /var/log/*/*.log    -> find all .log files with a parent dir in /var/log
  ##   /var/log/apache.log -> only tail the apache log file
  files = ["/var/log/apache/access.log"]

  ## The dataformat to be read from files
  ## Each data format has its own unique set of configuration options, read
  ## more about them here:
  ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
  data_format = "grok"

  ## This is a list of patterns to check the given log file(s) for.
  ## Note that adding patterns here increases processing time. The most
  ## efficient configuration is to have one pattern.
  ## Other common built-in patterns are:
  ##   %{COMMON_LOG_FORMAT}   (plain apache & nginx access logs)
  ##   %{COMBINED_LOG_FORMAT} (access logs + referrer & agent)
  grok_patterns = ["%{COMBINED_LOG_FORMAT}"]

  ## Full path(s) to custom pattern files.
  grok_custom_pattern_files = []

  ## Custom patterns can also be defined here. Put one pattern per line.
  grok_custom_patterns = '''
  '''

  ## Timezone allows you to provide an override for timestamps that
  ## don't already include an offset
  ## e.g. 04/06/2016 12:41:45 data one two 5.43µs
  ##
  ## Default: "" which renders UTC
  ## Options are as follows:
  ##   1. Local             -- interpret based on machine localtime
  ##   2. "Canada/Eastern"  -- Unix TZ values like those found in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  ##   3. UTC               -- or blank/unspecified, will return timestamp in UTC
  grok_timezone = "Canada/Eastern"

  ## When set to "disable" timestamp will not incremented if there is a
  ## duplicate.
  # grok_unique_timestamp = "auto"

  ## Enable multiline messages to be processed.
  # grok_multiline = false

时间戳示例

此示例输入和配置使用自定义时间戳转换解析文件

2017-02-21 13:10:34 value=42
[[inputs.file]]
  grok_patterns = ['%{TIMESTAMP_ISO8601:timestamp:ts-"2006-01-02 15:04:05"} value=%{NUMBER:value:int}']

此示例输入和配置使用 Unix 时间戳解析文件

1466004605 value=42
1466004605.123456789 value=42
[[inputs.file]]
  grok_patterns = ['%{NUMBER:timestamp:ts-epoch} value=%{NUMBER:value:int}']

此示例使用内置转换和自定义模式解析文件

Wed Apr 12 13:10:34 PST 2017 value=42
[[inputs.file]]
  grok_patterns = ["%{TS_UNIX:timestamp:ts-unix} value=%{NUMBER:value:int}"]
  grok_custom_patterns = '''
    TS_UNIX %{DAY} %{MONTH} %{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND} %{TZ} %{YEAR}
  '''

此示例输入和配置使用不匹配任何特定标准的自定义时间戳转换解析文件

21/02/2017 13:10:34 value=42
[[inputs.file]]
  grok_patterns = ['%{MY_TIMESTAMP:timestamp:ts-"02/01/2006 15:04:05"} value=%{NUMBER:value:int}']

  grok_custom_patterns = '''
    MY_TIMESTAMP (?:\d{2}.\d{2}.\d{4} \d{2}:\d{2}:\d{2})
  '''

对于时间戳本身没有偏移量的情况,可以使用 timezone 配置变量来表示偏移量。默认情况下(当 timezone 被省略、为空或设置为 "UTC" 时),时间将按 UTC 时区处理。如果设置为 timezone = "Local",时间戳将根据当前机器时区配置进行处理。最后,如果使用 Unix 时区列表中的时区,grok 将相应地调整时间戳。

TOML 转义

将模式保存到配置文件时,请牢记 TOML 的不同 字符串 类型及其各自的转义规则。这些转义规则必须应用于 grok 语法所需的转义之外。使用 ''' 的多行字面量语法可能很有用。

以下配置示例将解析此输入文件

|42|\uD83D\uDC2F|'telegraf'|

由于 | 在 grok 语言中是特殊字符,我们必须对其进行转义才能获得字面量 |。使用基本的 TOML 字符串时,必须转义反斜杠等特殊字符,这要求我们第二次转义反斜杠。

[[inputs.file]]
  grok_patterns = ["\\|%{NUMBER:value:int}\\|%{UNICODE_ESCAPE:escape}\\|'%{WORD:name}'\\|"]
  grok_custom_patterns = "UNICODE_ESCAPE (?:\\\\u[0-9A-F]{4})+"

我们不能为模式使用字面量 TOML 字符串,因为我们无法在其内部匹配 '。但是,它对自定义模式效果很好。

[[inputs.file]]
  grok_patterns = ["\\|%{NUMBER:value:int}\\|%{UNICODE_ESCAPE:escape}\\|'%{WORD:name}'\\|"]
  grok_custom_patterns = 'UNICODE_ESCAPE (?:\\u[0-9A-F]{4})+'

多行字面量字符串允许我们对模式进行编码

[[inputs.file]]
  grok_patterns = ['''
    \|%{NUMBER:value:int}\|%{UNICODE_ESCAPE:escape}\|'%{WORD:name}'\|
  ''']
  grok_custom_patterns = 'UNICODE_ESCAPE (?:\\u[0-9A-F]{4})+'

创建模式的技巧

复杂的模式可能难以阅读和编写。有关构建和调试 grok 模式的帮助,请参阅以下工具

我们建议在 Telegraf 和您的数据中使用以下步骤来构建和测试新模式

  1. 在 Telegraf 配置中,执行以下操作以帮助您隔离和查看捕获的 metric

    • 配置一个将数据写入 stdout 的文件输出

      [[outputs.file]]
        files = ["stdout"]
    • 测试时禁用其他输出。

    请记住,文件输出仅在每个 flush_interval 打印一次。

  2. 对于输入,从包含一行数据的样本文件开始,然后删除除第一段或第一个标记之外的所有内容。

  3. 在 Telegraf 配置中,添加模式中匹配上一步数据段的部分。

  4. 运行 Telegraf 并验证 metric 是否成功解析。

  5. 如果成功,将下一个标记添加到数据文件,更新 Telegraf 中的模式配置,然后重新测试。

  6. 一次一个标记地继续,直到整个行都成功解析。

性能

性能在很大程度上取决于您使用的正则表达式,但有一些技术可以提供帮助

  • 避免使用 %{DATA} 这样的模式,它们总是会匹配。

  • 如果可能,在模式中添加 ^$ 锚点

    [[inputs.file]]
      grok_patterns = ["^%{COMBINED_LOG_FORMAT}$"]

此页面是否有帮助?

感谢您的反馈!


InfluxDB 3.8 新特性

InfluxDB 3.8 和 InfluxDB 3 Explorer 1.6 的主要增强功能。

查看博客文章

InfluxDB 3.8 现已适用于 Core 和 Enterprise 版本,同时发布了 InfluxDB 3 Explorer UI 的 1.6 版本。本次发布着重于操作成熟度,以及如何更轻松地部署、管理和可靠地运行 InfluxDB。

更多信息,请查看

InfluxDB Docker 的 latest 标签将指向 InfluxDB 3 Core

在 **2026 年 2 月 3 日**,InfluxDB Docker 镜像的 latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。

如果使用 Docker 来安装和运行 InfluxDB,latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。例如,如果使用 Docker 运行 InfluxDB v2,请将 latest 版本标签替换为 Docker pull 命令中的特定版本标签 — 例如

docker pull influxdb:2