在流利的情况下使用正则表达式解析json数据时出错

时间:2018-05-14 07:53:47

标签: regex elasticsearch fluentd

我流利地工作得非常好,能够将数据发布到弹性搜索。我修改了流利的配置文件来拖尾文件,获取数据并发布。以下是来源:

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

如果输入低于数据:

<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>

这是完全流利的阅读,也发表在elasticsearch上。

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

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

所以如果输入是:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_printnotprintdailyexpenses`(
in i_localBodyId varchar(10),
in i_epId int(20),

out printed INT(20),
out notprinted INT(20)


)
BEGIN
set printed=(select count(isPrinted) from tbl_dailyExpenses 
where  date((curdate() - 7)) and date(curdate())and
localBodyId =i_localBodyId and epId=i_epId and isPrinted=1 group by CURDATE()-7 );
set notprinted=(select count(isPrinted) from tbl_dailyExpenses 
where date((curdate() - 7 )) and date(curdate())and
localBodyId =i_localBodyId and epId=i_epId and isPrinted=0 group by CURDATE()-7 );
END

然后没有关于elasticsearch的数据。即使是流利的日志也不会显示任何错误或警告信息。正则表达式模式是错误的吗?我该如何解决呢?

由于

1 个答案:

答案 0 :(得分:2)

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

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

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

请注意(?<name>...)名为捕获组,在弹性搜索中用于创建具有相同名称的字段。模式匹配

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

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

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

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