在 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)
是匹配 Name
或 Type
子字符串的非捕获组(|
是交替运算符)。
我的工作非常流畅,能够将数据发布到弹性搜索。我修改了 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)
是匹配 Name
或 Type
子字符串的非捕获组(|
是交替运算符)。