在 Postgres 数据库中存储系统日志消息时防止多条线路丢失

在 Postgres 数据库中存储系统日志消息时防止多条线路丢失

我有一个应用程序创建使用 syslog 集中的报告,并且将它们存储在 Postgres 数据库中以供自定义使用。

数据库具有特定的格式(假设我要集中的数据是 csv 格式,每列都有特定含义)。到目前为止,一切顺利,数据以正确的格式正确插入数据库。

如果格式错误的消息进入系统日志(例如,使用文本而不是整数),我会收到插入错误,因为类型无效,这是预料之中的...但是该批次的下一条消息也会被默默丢弃(我相信是因为在事务中插入)

Sep 2 16:10:45 my-computer postgres[7642]: [2-2] 2011-09-02 16:10:45 CEST STATEMENT: insert into RudderSysEvents (executionDate, nodeId, configurationRuleId, policyInstanceId, serial, Component, KeyValue, executionTimeStamp, eventType, msg, Policy) values ('2011-09-02T16:10:45.592739+02:00','bla', '' , '', '', '', '', '', '', '', 'sdfsfsf' ) Sep 2 16:10:45 nicolas-laptop postgres[7643]: [2-1] 2011-09-02 16:10:45 CEST ERROR: invalid input syntax for integer: "" at character 224

我的问题是:我该如何避免这种情况?

我正在考虑这些解决方案:

  • 尝试在 rsyslog 端使插入操作非事务性,或者进行单行事务

    $ActionQueueSize 1
    $ActionQueueType Direct
    $MainMsgQueueSize 1
    $MainMsgQueueType Direct
    

    但它没有起作用(而且我怀疑它会影响性能)

  • 在插入字段之前,使用正则表达式检查字段的内容

嗯,这是一项艰巨的任务,特别是因为我通过 $programname 和 $msg 进行检查,我不能真正使用正则表达式

    if $programname startswith 'rudder' and $msg startswith '  R: @@' then
  • 放宽数据库中的约束,这些约束会触发复制另一个表中的有效数据或解析该内容并将相关行插入新表中的程序。

嗯,我不太喜欢这个解决方案

哦,我正在使用 rsyslog 4.6.4-2

谢谢 !

编辑 :最后,我通过使用一个相当复杂的正则表达式来过滤消息来绕过这个解决方案

:msg, ereregex, "R: @@[a-zA-Z0-9\-]+?@@[a-zA-Z0-9_\-]{1,64}?@@[a-zA-Z0-9\-]+@@[a-zA-Z0-9\-]+?@@[0-9]+?@@[a-zA-Z0-9\-]+?@@[a-zA-Z0-9\-]+?@@[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[+-][0-9]{2}:[0-9]{2}##[a-zA-Z0-9\-]+?@#.*"  :ompgsql:localhost,rudder,rudder,Normation;RudderDbLinuxReportFormat

这确实不太容易维护,但它能正常工作,并且从未出现故障。感谢您的建议折断,在不久的将来我会考虑使用存储过程。

答案1

只是一个想法,我不确定是否有帮助:

如何修改默认的 SQL INSERT 模板,以便它调用具有足够逻辑来处理乱码输入的 PL/pgSQL STORED PROCEDURE?这里有一些信息:http://www.rsyslog.com/doc/ommysql.html(它适用于 MySQL,但同样适用于 PostgreSQL 模块)。

答案2

最后,我通过使用一个相当复杂的正则表达式来过滤消息来绕过这个解决方案

:msg, ereregex, "R: @@[a-zA-Z0-9\-]+?@@[a-zA-Z0-9_\-]{1,64}?@@[a-zA-Z0-9\-]+@@[a-zA-Z0-9\-]+?@@[0-9]+?@@[a-zA-Z0-9\-]+?@@[a-zA-Z0-9\-]+?@@[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[+-][0-9]{2}:[0-9]{2}##[a-zA-Z0-9\-]+?@#.*"  :ompgsql:localhost,rudder,rudder,Normation;RudderDbLinuxReportFormat

这确实不太容易维护,但它能正常工作,并且从那以后从未出现故障。谢谢你的建议,我会在不久的将来考虑使用存储过程。

相关内容