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

syslog-ng выполняет скрипт по шаблону syslog

У меня простое требование. Я хочу получать все сообщения системного журнала, поступающие от пользователя, и сохранять их в файле. Если сообщение системного журнала содержит определенный шаблон, я хочу выполнить сценарий.

У меня следующая конфигурация,

destination d_logfile { file("/var/log/logile.log"); };
destination d_start_script { program("/home/ubuntu/start-script.sh"); };
destination d_stop_script { program("/home/ubuntu/stop-script.sh"); };

filter f_logfile { facility(user) and not filter(f_debug); };
filter f_filter_start { facility(user) and message("start"); };
filter f_filter_stop { facility(user) and message("stop"); };

log { source(s_network_tcp); filter(f_logfile); destination(d_logfile); };
log { source(s_network_tcp); filter(f_filter_start); destination(d_start_script; };
log { source(s_network_tcp); filter(f_filter_stop; destination(d_stop_script); };

когда я запускаю syslog-ng, кажется, что он зацикливается и запускает и выключает сценарии запуска и остановки.

я что-то упускаю?

На сколько мне известно syslog-ng вызывает программу назначения после ее запуска и отправляет им поток. Я использую аналогично, но в скрипте есть:
if grep -qE "start" ; then <do all you needs>

Итак, сценарий запускается с системным журналом и ожидает сообщения.

Если я правильно понимаю, то вместо сценария запуска / остановки вы действительно хотите иметь один сценарий, обрабатывающий последовательность сообщений, и способ создания этой последовательности. Проверьте, можете ли вы создать эту последовательность, используя gпарсер rouping-by (), например, используя область действия $ {HOST} $ {PROGRAM} $ {PID}. Если этого недостаточно, в новых версиях syslog-ng вы можете написать свой собственный syslog-ng в Python, что, вероятно, дает вам достаточно гибкости для выполнения работы (но вы также можете написать парсеры на Python, если это необходимо).