在 fluentd 中使用正则表达式解析 json 数据时出错

Error parsing the json data using regex in fluentd

我的工作非常流畅,能够将数据发布到弹性搜索。我修改了 fluentd 配置文件以跟踪文件、获取数据并发布。以下是来源:

<source>
  @type tail
  format /^\[(?<logtime>[^\]]*)\] (?<name>[^ ]*) (?<title>[^ ]*) (?<id>\d*)$/
  time_key logtime
  time_format %Y-%m-%d %H:%M:%S %z
  path /home/user/file
  tag first
</source>

如果输入低于数据:

[2013-02-28 12:00:00 +0900] alice engineer 1

这被 fluentd 完美阅读并且也发布到 elasticsearch。

然后我修改了正则表达式模式以接受 json 数据:

<source>
  @type tail
  format /(?:"Name":")(.*?)(?:")/ #CHANGE HERE
  time_key logtime
  time_format %Y-%m-%d %H:%M:%S %z
  path /home/user/file
  tag first
</source>

所以如果输入是:

{
    "Name":"Logger",
    "Type":"Logging"
}

然后elasticsearch上没有数据。即使是 fluentd 的日志也没有显示任何错误或警告消息。正则表达式模式是否错误。我该如何解决?

谢谢

您似乎想从 json 中获取数据到 elasticsearch。您可以使用 JSON 解析器为您完成繁重的工作,请参阅 Getting Data From Json Into Elasticsearch Using Fluentd 了解必要的详细信息以帮助您入门。

如果您想修复现有的正则表达式方法,请使用

format /"Name"\s*:\s*"(?<name>[^"]*)"/

请注意,(?<name>...) 是一个 命名捕获组 ,它在 Elastic Search 中用于创建具有相同名称的字段。模式匹配

  • "Name" - 文字 "Name" 子串
  • \s*:\s* - 用 0+ 个空白字符括起来的冒号
  • " - 双引号
  • (?<name>[^"]*) - 组 "name" 匹配除 "
  • 以外的 0+ 个字符
  • " - 双引号(虽然不是必需的)。

如果你想在同一字段中也有 Type,你可以使用

format /"(?:Name|Type)"\s*:\s*"(?<name>[^"]*)"/

其中 (?:Name|Type) 是匹配 NameType 子字符串的非捕获组(| 是交替运算符)。