Назад | Перейти на главную страницу

Извлечение значений из csv-parser в syslog-ng

У меня есть канал системного журнала в формате csv, который загружается syslog-ng с помощью csv-parser и записывается на диск.

Насколько я понимаю, использование csv-parser должно давать контекст syslog-ng для входящих данных и того, какое значение что означает. Я хотел бы использовать этот контекст, чтобы syslog-ng применял фильтры на основе этой логики.

Например, я бы хотел, чтобы на диск регистрировалось только событие, если один из столбцов csv соответствует определенному значению.

Csv-парсер документация кажется, это должно быть возможно.

Моя конфигурация выглядит примерно так:

parser p_my_app {
    csv-parser(
        columns("MY_APP.COLOUR","MY_APP.SIZE","MY_APP.SERIAL_NUMBER")
        delimiters(",")
        flags(escape-double-char)
    );
};

source s_my_app {
    syslog(ip(0.0.0.0) port(6514)
        transport("tcp")
    );
}; 

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") );
};

destination d_my_app { 
    file("/var/log/my_app.log"
        create_dirs(yes)
    ); 
};

log { 
    source(s_my_app);
    filter(f_my_app);
    parser(p_my_app);
    destination(d_my_app); 
};

Однако, похоже, как бы я ни старался, матч никогда не подходит. Вот результаты отладки sylog-ng с этой конфигурацией:

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='not-match'
Filter rule evaluation result; result='not-match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'

Я (надеюсь?) Мне не хватает чего-то действительно очевидного, но я не могу найти в Интернете полных примеров после нескольких часов работы в Google, просто отрывки, которые, похоже, никогда не работают. Может ли кто-нибудь увидеть, что я делаю неправильно, и / или предоставить полный рабочий пример?

Что ж, как всегда бывает, я трачу неделю на проблему, сдаюсь, решаю обратиться за помощью, а через час сам придумываю решение.

Моя проблема заключалась в порядке элементов в log() заявление. В частности, parser() линия ДОЛЖЕН быть перед filter() заявление.

Действительно, документация (который я, должно быть, прочитал 10 раз и пропустил) утверждает, что:

Заметка Порядок фильтров, правил перезаписи и синтаксических анализаторов в операторе журнала важен, поскольку они обрабатываются последовательно.

Итак, рабочий код использовать:

log { 
    source(s_my_app);
    parser(p_my_app);
    filter(f_my_app);
    destination(d_my_app); 
};

Также следует отметить, что match() на самом деле предполагается, что это регулярное выражение, поэтому для большей ясности я также обновил фильтр:

filter f_my_app { 
    match("123456" value("MY_APP.SERIAL_NUMBER") type("string"));
};

Теперь syslog-ng сообщает:

Incoming log entry; line='<14>1 2017-01-18T17:46:38+11:00 hostname  - - - red,large,123456
'
Message parsing complete; result='1', rule='p_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:14:2'
Filter rule evaluation begins; rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'
Filter node evaluation result; result='match'
Filter rule evaluation result; result='match', rule='f_my_app', location='/etc/syslog-ng/conf.d/my-app.conf:16:18'