编写自定义模板/解析器/过滤器以在syslog-ng中使用

时间:2016-03-05 16:19:22

标签: parsing sqlite pcre logparser syslog-ng

我的应用程序生成日志并将它们发送到syslog-ng。 我想编写一个自定义模板/解析器/过滤器,用于syslog-ng,以正确地将字段存储在SQLite数据库(MyDatabase)的表中。

这是我的日志的传说:

  

unique-record-id usename date Quantity BOQ possible,item,profiles Count Vendor applicable,vendor,categories known,request,types vendor_code credit

所有这12个字段都是制表符分隔的,解析器必须将它们存储到MyDatabase中的12列MyTable1表中。 一些字段: 6th,9th和10也包含“子字段”作为逗号分隔值。 每个子字段中的值的数量是可变的,并且可以在每行日志中更改。

  

我需要将这些字段存储在各自的表中   MyItem_type,MyVendor_groups,MyReqs

这些“辅助”表有3列,记录唯一记录ID,并在日志中记录每个出现的数量 因此,MyItem_type表中的模式如下所示:

Unique-Record-ID | item_profile | Quantity

类似地,MyVendor_groups的架构如下所示:

Unique-Record-ID | vendor_category | Quantity

,MyReqs的架构如下:

Unique-Record-ID | req_type | Quantity

从日志中考虑这些样本行:

unique-record-id usename date Quantity BOQ possible,item,profiles Count Vendor适用,供应商,已知类别,请求,类型vendor_code credit

234.44.tfhj Sam 22-03-2016  22  prod1   cat1,cat22,cat36,cat44  66  ven1    t1,t33,t43,t49  req1,req2,req3,req4 blue    64.22

234.45.tfhj Alex    23-03-2016  100 prod2   cat10,cat36,cat42   104 ven1    t22,t45 req1,req2,req33,req5    red 66

234.44.tfhj Vikas   24-03-2016  88  prod1   cat101,cat316,cat43 22  ven2    t22,t43 req1,req23,req3,req6    red 77.12

234.47.tfhj Jane    25-03-2016  22  prod7   cat10,cat36,cat44   43  ven3    t77 req1,req24,req3,req7    green   45.89

234.48.tfhj John    26-03-2016  97  serv3   cat101,cat36,cat45  69  ven5    t1  req11,req2,req3,req8    orange  33.04

234.49.tfhj Ruby    27-03-2016  85  prod58  cat10,cat38,cat46   88  ven9    t33,t55,t99 req1,req24,req3,req9    white   46.04

234.50.tfhj Ahmed   28-03-2016  44  serv7   cat110,cat36,cat47  34  ven11   t22,t43,t77 req1,req20,req3,req10   red 43

我的解析器应将上述日志存储到MyDatabase.Mytable1中:

unique-record-id    |   usename |   date    |   Quantity    |   BOQ |   item_profile    |   Count   |   Vendor  |   vendor_category |   req_type    |   vendor_code |   credit
234.44.tfhj |   Sam |   22-03-2016  |   22  |   prod1   |   cat1,cat22,cat36,cat44  |   66  |   ven1    |   t1,t33,t43,t49  |   req1,req2,req3,req4 |   blue    |   64.22
234.45.tfhj |   Alex    |   23-03-2016  |   100 |   prod2   |   cat10,cat36,cat42   |   104 |   ven1    |   t22,t45 |   req1,req2,req33,req5    |   red |   66
234.44.tfhj |   Vikas   |   24-03-2016  |   88  |   prod1   |   cat101,cat316,cat43 |   22  |   ven2    |   t22,t43 |   req1,req23,req3,req6    |   red |   77.12
234.47.tfhj |   Jane    |   25-03-2016  |   22  |   prod7   |   cat10,cat36,cat44   |   43  |   ven3    |   t77 |   req1,req24,req3,req7    |   green   |   45.89
234.48.tfhj |   John    |   26-03-2016  |   97  |   serv3   |   cat101,cat36,cat45  |   69  |   ven5    |   t1  |   req11,req2,req3,req8    |   orange  |   33.04
234.49.tfhj |   Ruby    |   27-03-2016  |   85  |   prod58  |   cat10,cat38,cat46   |   88  |   ven9    |   t33,t55,t99 |   req1,req24,req3,req9    |   white   |   46.04
234.50.tfhj |   Ahmed   |   28-03-2016  |   44  |   serv7   |   cat110,cat36,cat47  |   34  |   ven11   |   t22,t43,t77 |   req1,req20,req3,req10   |   red |   43

并解析“possible,item,profiles”以记录到MyDatabase.MyItem_type中:

Unique-Record-ID | item_profile | Quantity
234.44.tfhj |   cat1    |   22
234.44.tfhj |   cat22   |   22
234.44.tfhj |   cat36   |   22
234.44.tfhj |   cat44   |   22
234.45.tfhj |   cat10   |   100
234.45.tfhj |   cat36   |   100
234.45.tfhj |   cat42   |   100
234.44.tfhj |   cat101  |   88
234.44.tfhj |   cat316  |   88
234.44.tfhj |   cat43   |   88
234.47.tfhj |   cat10   |   22
234.47.tfhj |   cat36   |   22
234.47.tfhj |   cat44   |   22
234.48.tfhj |   cat101  |   97
234.48.tfhj |   cat36   |   97
234.48.tfhj |   cat45   |   97
234.48.tfhj |   cat101  |   97
234.48.tfhj |   cat36   |   97
234.48.tfhj |   cat45   |   97
234.49.tfhj |   cat10   |   85
234.49.tfhj |   cat38   |   85
234.49.tfhj |   cat46   |   85
234.50.tfhj |   cat110  |   44
234.50.tfhj |   cat36   |   44
234.50.tfhj |   cat47   |   44
  

我们还需要同样解析“适用的,供应商,类别”和   将它们存储到MyDatabase.MyVendor_groups中。并解析   存储到MyDatabase.MyReqs中的“已知,请求,类型”第一个   MyDatabase.MyItem_type,MyDatabase.MyVendor_groups和的列   MyDatabase.MyReqs将始终是唯一记录ID   在日志中见证。

因此,在这三个表中,此列不包含与其他列一样的唯一数据。 第三列将始终是日志中见证的数量。

我知道一点PCRE,但是在syslog-ng中使用嵌套解析器让我感到很困惑。

Syslog-ng的文档表明这是可能的,但根本没有得到一个很好的例子。如果这里有任何类型的黑客有一些参考或样本要分享,它将是非常有用的。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为所有这些都可以使用csv-parser完成几次。 首先,使用带有制表符分隔符(“\ t”)的csv-parser将初始字段拆分为命名列。在整个邮件上使用此解析器。 然后,您将不得不在需要进一步解析的列上使用csv-parser的其他实例来解析具有子字段的字段。 您可以在https://www.balabit.com/sites/default/files/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/csv-parser.htmlhttps://www.balabit.com/sites/default/files/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/reference-parsers-csv.html

找到一些示例

(如果您将制表符和逗号指定为分隔符,则可以使用单个解析器完成此操作,但它可能不适用于具有可变字段数的字段。)。