postgresql和log之间的字符串比较

时间:2013-12-05 09:34:37

标签: database postgresql logging comparison bacula

我们有一个数据库,其中包含以下类型的字符串:

  

不能写块。 EOM的设备。 dev = $ device($ device_path)

然后,我们的程序会生成日志条目,例如

  

2013-10-10 15:37:07program-sd JobId 50345:致命错误:block.c:434   不能写块。 EOM的设备。 dev =“st0”(/ dev / st0)

所以,我们可以使用SELECT * FROM X WHERE Y LIKE="%LOG%"但是,字符串不一样,在我们的数据库中,我们有一个干净的字符串,而在我们的日志中,我们有时间戳,更多信息以及{{的数据1}}和$device,因此查询将返回0结果,因为两者都不匹配...

我们正在尝试根据数据库中的内容返回错误代码,对于此示例,如果查询结果不为0,则为$device_path ...

有没有办法使用正则表达式或其他方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

假设您的错误消息模板表如下所示:

create table error_templates(id serial primary key, template text);

然后你可以使用这样的查询:

select id 
from error_templates 
where $1 like '%' || regexp_replace(template, '\$\w+', '%', 'g') || '%';

$ 1是您要查找的错误日志的占位符。

regex_replace用%替换消息中的变量。它假设变量由一个美元符号后跟一个或多个单词字符(a-zA-Z0-9_)组成 - 您可能需要根据实际变量名称进行调整。

另请注意,这可能会很慢。它必须扫描整个表格;索引无法使用。