我的工作非常流畅,能够将数据发布到 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/