我的应用程序正在将消息写入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,但没有帮助。
如果你们中的任何一个人都能提出一些想法,那将会非常有用。
提前谢谢!
答案 0 :(得分:1)
为此,您需要最新版本的syslog-ng(至少3.7)。在此版本中,您必须编写一个custom template function in python,它将拆分日志消息的相关逗号分隔部分,并为您可以在sql目标中使用的每个动态值创建一个宏。 要创建新宏,您可以使用log_message [" new-macro-name"] =" value"格式(正如我所见,链接文档中尚未对此进行记录,我很快就会对其进行更新)。