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

标签 regex elasticsearch fluentd

我的工作非常流畅,能够将数据发布到 Elasticsearch 。我修改了 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>[^"]*) - 匹配除 " 以外的 0+ 个字符的组“名称”
  • " - 双引号(虽然不是必需的)。

如果你想要Type同样在同一领域,你可以使用

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

哪里(?:Name|Type)是匹配 Name 的非捕获组或 Type子字符串(| 是一个交替运算符)。

关于regex - 在 fluentd 中使用正则表达式解析 json 数据时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50325485/

相关文章:

Python:在正则表达式匹配之间提取多行

javascript - 使用正则表达式限制字段中的帐户 ID 输入

elasticsearch - 如何汇总结果并在某些字段上创建数组

logging - Fluentd + golang 日志记录应用程序出错

google-kubernetes-engine - 在 GKE 上启用 Stackdriver 结构化日志记录

regex - FluentD 日期时间格式不匹配

JavaScript 正则表达式拆分以&符号分隔的字符串

ruby - 在 Ruby 中 - 如何获取 gsub!(bang) 如果不匹配则不返回 nil 并使其表现得像 .gsub

elasticsearch - Elasticsearch 6.0.0 中的 "_doc"

elasticsearch - Elasticsearch:为什么id突然以AV开头?