0

我的应用程序正在将消息写入 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) 的原因。但是当我们解析逗号分隔的列表时,我们不知道会有多少值?因此无法创建宏。

我已经浏览了这个链接,但没有帮助。

如果你们中的任何人都可以提出一些想法,那将非常有帮助。

先感谢您!

4

1 回答 1

1

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

于 2016-03-07T11:54:38.843 回答