Отправка сообщений syslog в базу postgresql
Настройка зависимостей
apt-get install checkinstall autoconf autogen libivykis-dev automake libnet1-dev libcurl4-gnutls-dev bison flex glib-2.0 libperl-dev libgtk2.0-dev libjson0 libjson0-dev libdbi-dev xsltproc docbook-xsl -y
Ставим из исходников
Собираем syslog-ng со следующими ключами
wget https://github.com/balabit/syslog-ng/releases/download/syslog-ng-3.9.1/syslog-ng-3.9.1.tar.gz tar -xvf syslog-ng-3.9.1 cd syslog-ng-* git checkout v3.5.6 /bin/bash autogen.sh wget https://my.balabit.com/downloads/eventlog/0.2/eventlog_0.2.12.tar.gz] tar -xvf even cd eventlog-0.2.12 ./configure make sudo make install tar -xvf eventlog_0.2.12.tar.gz
Конфигурируем syslog-ng
mkdir -p /etc/syslog-ng ./configure --exec-prefix=/usr/local --prefix=/ --sysconfdir=/etc/syslog-ng --sbindir=/sbin --bindir=/bin --runstatedir=/var/run/syslog-ng --enable-all-modules --disable-geoip --enable-systemd --disable-riemann --disable-java --disable-python --disable-java-modules --disable-pacct --disable-sun-streams --enable-json --enable-sql && make -j4 && sudo checkinstall
sudo make install
Чтобы удалить
dpkg -r syslog-ng или sudo make uninstall
Установка из apt
sudo apt-get install syslog-ng-core syslog-ng-mod-sql libdbd-pgsql
Скачиваем скрипт
wget https://github.com/balabit/syslog-ng-3.5/blob/master/debian/syslog-ng.init -o syslog-ng && chmod 775 /etc/init.d/syslog-ng
Конфиг файл syslog ng
syslog-ng.conf
@version: 3.5 @include "scl.conf" @include "`scl-root`/system/tty10.conf" options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no); owner("root"); group("adm"); perm(0640); stats_freq(0); bad_hostname("^gconfd$"); }; source src1 { file( "/var/log/access2.log" follow_freq(1) ); }; #values("${R_DATE}", "${HOST}", "${PROGRAM}", "${MSGONLY}") #######Фильтрация#############будет попадать только строка с gggg, как пример #filter trash { match('^\[bdLog\]:'); }; filter trash { match("gggg"); }; #filter f_bdLog { match('^\[bdLog\]:'); }; destination d_postgres{ sql(type(pgsql) host("127.0.0.1") username("parser") password("password") database("logs") table("access_table") columns("get varchar(50)", "store1 text", "store2 varchar(80)") #values("${R_DATE}", "${MSG}", "${PROGRAM}", "${MSG}") values("${PROGRAM}", "${MSG}", "${KEY3}") indexes("get", "url", "url2")); }; filter f_no_debug { not level(debug); }; #log {source(src1); parser(p_src1); destination(d_postgres); }; log {source(src1); filter(trash); parser(p_src1); destination(d_postgres); }; #parser d_postgresl { kv-parser(value-separator(":") prefix(".mysql."));
Далее в базе создадим уникальный ключ, например по полю store1.
Далее выполним скрипт, для того чтобы не падал postgres выполнил скрипт, для того чтобы не падал syslog-ng.
CREATE OR REPLACE RULE access_table_rule_pkey AS ON INSERT TO access_table WHERE ( EXISTS ( SELECT 1 FROM access_table WHERE access_table.store1 = NEW .store1 ) ) DO INSTEAD NOTHING;
Общая справка по syslog-ng
НАЗВАНИЕ
syslog-ng.conf – файл конфигурации syslog-ng
ОПИСАНИЕ
Файл конфигурации syslog-ng.
Маршрут сообщений в syslog-ng состоит из трёх частей: источник, приёмник и правила фильтрации.
ИСТОЧНИКИ
Вы можете объявить источник, воспользовавшись ключевым словом “source”:
source <название_источника> { sourcedriver параметры; sourcedriver параметры; … };
Название источника – это идентификатор, который вы используете для ссылки на группу сообщений. sourcedriver – это метод получения заданных сообщений. Доступны следующие драйверы:
* file <имя_файла>
– читать сообщения из заданного файла
* unix-dgram <имя_файла>
– читать сообщения из заданного сокета AF_UNIX, SOCK_DGRAM (стиль BSDi)
* unix-stream <имя_файла>
– читать сообщения из заданного сокета AF_UNIX, SOCK_STREAM (стиль Linux)
* udp,<порт>
– сетевой источник, используя протокол UDP. Если вы не хотите привязываться к какому-то особому интерфейсу, воспользуйтесь 0.0.0.0.
* tcp,<порт>
– сетевой источник, используя протокол TCP.
* sun-streams <имя_файла>
– локальный источник, используемый на системах Solaris
ПРИЁМНИКИ
Приёмники могут быть созданы с помощью ключевого слова “destination”:
destination <название_приёмника> { destdriver параметры; destdriver параметры; … ; };
* file <имя_файла>
– записывать сообщения в заданный файл
* unix-dgram <имя_файла>
– записывать сообщения в заданный сокет AF_UNIX, SOCK_DGRAM (стиль BSDi)
* unix-stream <имя_файла>
– записыватьть сообщения в заданный сокет AF_UNIX, SOCK_STREAM (стиль Linux)
* udp,<порт>
– сетевой приёмник, используя протокол UDP
* tcp,<порт>
– сетевой приёмник, использующий протокол TCP
* usertty <имя_пользователя>
– отправлять журнал на терминал пользователя
ФИЛЬТРЫ
Вы можете создать фильтры с помощью ключевого слова “filter”:
filter <имя_фильтра> { выражение; };
Где выражение – это простое булево выражение. Вы можете использовать “and”, “or” и “not” для подключения встроенных функций. Функции могут быть следующими:
* facility
(список разделённых запятыми средств)
* level
(список разделённых запятыми названий приоритетов ИЛИ диапазон разделённый “..”)
* program
(регулярное выражение для совпадения с именем программы)
* host
(регулярное выражение для совпадения с именем узла)
* match
(регулярное выражение для совпадения с сообщениями)
ОБЪЯВЛЕНИЯ ЖУРНАЛА
Вы можете соединить источник и приёмник с помощью объявления log:
log { source S1; source S2; ... filter F1; filter F2; ... destination D1; destination D2; ... };
Где Sx ссылаются на один из объявленных источников журналов, Fx один из фильтров и Dx один из приёмников.
Фильтры объединяются с помощью логической операции И.
ОПЦИИ
Вы можете указать несколько глобальных опций syslog-ng в выражении options:
options { opt1; opt2; ... };
Где опцией может быть любая из следующих:
chain_hostnames(yes|no)
Включает или выключает сцепленный формат имени узла.
long_hostnames(yes|no)
Это устаревший псевдоним для chain_hostnames().
keep_hostname(yes|no)
Указывает доверять имени узла, которое включено в журнальное сообщение. Если keep_hostname – yes и в сообщении имеется имя узла, то оно остаётся неизменным, в другом случае оно всегда перезаписывается основываясь на информации о том, откуда было принято сообщение.
use_dns(yes|no)
Включить или выключить использование DNS. syslog-ng блокиреут DNS-запросы, поскольку включение DNS может привести к атаке с отказом в обслуживании (DoS). Для предотвращения DoS, защитите ваш целевой syslog-ng правилами пакетного фильтра, и удостоверьтесь, что все узлы, которые может запросить syslog-ng решаемы.
use_fqdn(yes|no)
Добавлять полностью квалифицированное доменное имя (FQDN) вместо короткого имени узла.
check_hostname(yes|no)
Включить или выключить требование чтобы имя узла состояло из разрешённых символов.
bad_hostname(regex)
Регулярное выражение, совпадающее с именами узлов, которые не должны быть приняты как есть.
dns_cache(yes|no)
Включить или выключить использование кэша DNS.
dns_cache_expire(n)
Количество секунд, на которое кэшируется удачный запрос.
dns_cache_expire_failed(n)
Количество секунд, на которое кэшируется неудачный запрос.
dns_cache_size(n)
Количество имён узлов в кэше DNS.
create_dirs(yes|no)
Включить или выключить создание каталогов для файлов-приёмников.
dir_owner(uid)
Идентификатор пользователя, владеющего каталогами.
dir_group(gid)
Идентификатор группы, владеющей каталогами.
dir_perm(разрешения)
Разрешения (восьмеричная маска).
owner(uid)
Идентификатор пользователя, владеющего создаваемыми файлами.
group(gid)
Идентификатор группы, владеющей создаваемыми файлами.
perm(разрешения)
Разрешения на создаваемые файлы.
gc_busy_threshold(n)
Задаёт пороговое значение для сборки мусора, когда syslog-ng занят. Сборщик мусора запускается когда количество выделенных объектов достигает этого числа. По умолчанию: 3000.
gc_idle_threshold(n)
Задаёт пороговое значение для сборки мусора, когда syslog-ng простаивает. Сборщик мусора запускается когда количество выделенных объектов достигает этого числа. По умолчанию: 100.
log_fifo_size(n)
Количество строк, помещающихся в очередь вывода. Очередь вывода существует для всех приёмников.
log_msg_size(n)
Максимальная длина сообщения в байтах (заметим, что некоторые реализации syslogd имеют фиксированное ограничение в 1024 символа).
mark(n)
Количество секунд между двумя строками MARK. ЗАМЕЧАНИЕ: Ещё не реализовано.
stats(n)
Количество секунд между двумя сообщениями STATS.
sync(n)
Количество строк, которые могут быть сохранены в буфере перед записью в файл (может быть переопределено локально).
time_reap(n)
Время ожидания до того, как простаивающий файл-приёмник будет закрыт.
time_reopen(n)
Время ожидания перед повторной установкой разорвавшихся подключений.
use_time_recvd(yes|no)
Эта переменная используется только для расширения макросов, которые означают время конкретного макроса в зависимости от этой настройки. Однако существуют отдельные макросы для ссылки на отметку о времени приёма (R_ макросы) и отметку времени о помещении сообщения в журнал (S_), поэтому использование этого значения не рекомендуется.
ФАЙЛЫ
/etc/syslog-ng/syslog-ng.conf