Как создать динамические столбцы (MACROS) в Syslog-ng csv-parser

Мое приложение записывает сообщение в 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 "[email protected]" "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 значений, разделенных табуляцией, которые мы уже знали, поэтому мы создали 12 столбцов (MACROS) в этом парсере p_tab_space. Но пока мы анализируем список, разделенный запятыми, мы не знаем, сколько значений будет получено? поэтому не могу создавать макросы.

Я прошел по этой ссылке но никакой помощи.

Если кто-то из вас может подкинуть какие-то идеи, это будет так, помощь полная.

Заранее спасибо!


person Ramkee    schedule 07.03.2016    source источник


Ответы (1)


Для этого вам понадобится последняя версия syslog-ng (не ниже 3.7). В этой версии вам нужно будет написать пользовательская функция шаблона в python, которая разделит соответствующие части сообщения журнала, разделенные запятыми, и создаст макрос для каждое динамическое значение, которое вы можете использовать в назначении sql. Чтобы создать новый макрос, вы можете использовать формат log_message["new-macro-name"]="value" (как я вижу, это еще не задокументировано в связанных документах, я надеюсь, что скоро обновлю его).

person Robert Fekete    schedule 07.03.2016