У меня есть канал системного журнала в формате 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'