我的应用程序生成日志并将它们发送到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的文档表明这是可能的,但根本没有得到一个很好的例子。如果这里有任何类型的黑客有一些参考或样本要分享,它将是非常有用的。
提前致谢。
答案 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.html和https://www.balabit.com/sites/default/files/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/reference-parsers-csv.html
找到一些示例(如果您将制表符和逗号指定为分隔符,则可以使用单个解析器完成此操作,但它可能不适用于具有可变字段数的字段。)。