如何在Syslog-ng csv-parser中创建动态列(MACROS)

时间:2016-03-07 09:27:43

标签: mysql parsing sqlite syslog-ng

我的应用程序正在将消息写入syslog-ng,而syslog-ng将此消息存储到SQlite中,方法是将传入的消息分隔到不同的列中。

我的应用程序日志图例如下所示:

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

以上消息有12个值,它们由制表符(\ t)分隔。在这12个值中,其中一些值使用逗号分隔字符串。这些逗号分隔的值可能因每个日志行而异,有时它们可​​能会变为4,有时它们可​​能会变为2,但如果固定,则表中的逗号分隔值的位置表示第6,9,10列。

示例日志行:

140189 "john@192.168.0.22" "03/Mar/2015:10:05:01" 1593 89 "apple,mango,banana" 15 "google" "fruits,games,social,business" "check,block" 123 50

我可以使用以下解析器

将该消息解析为SQLite表(TABLE1)
parser p_tab_space {
    csv-parser(columns("LOG.ID", "LOG.USERNAME", "LOG.DATE",
        "LOG.QUANTITY", "LOG.BOQ", "LOG.PROFILES",
        "LOG.COUNT", "LOG.VENDOR", "LOG.CATEGORIES",
        "LOG.REQUESTS", "LOG.CODE","LOG.CREDIT")
         delimiters("\t")
         );
};

现在我需要再次将 LOG.PROFILES 解析为另一个表(PROFILE_TABLE)

id | profiles | quantity
1  | apple    | 1593 
2  | mango    | 1593 
3  | banana   | 1593 

我必须这样做才能将逗号分隔值保留到不同的表中(CATEGORY_TABLE,REQ_TABLE)。

示例:

  id | categories | quantity
  1  | fruits     | 1593 
  2  | games      | 1593  
  3  | social     | 1593 
  4  | business   | 1593 

这里的问题是我们不知道有多少昏迷分隔值。

主输入消息由12个制表符分隔值组成,我们知道这就是为什么我们在p_tab_space解析器中创建12列(MACROS)的原因。但是,当我们解析逗号分隔列表时,我们不知道将会有多少值?因此无法创建宏。

我已经完成了link,但没有帮助。

如果你们中的任何一个人都能提出一些想法,那将会非常有用。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

为此,您需要最新版本的syslog-ng(至少3.7)。在此版本中,您必须编写一个custom template function in python,它将拆分日志消息的相关逗号分隔部分,并为您可以在sql目标中使用的每个动态值创建一个宏。 要创建新宏,您可以使用log_message [" new-macro-name"] =" value"格式(正如我所见,链接文档中尚未对此进行记录,我很快就会对其进行更新)。