Настройка syslog-ng

Материал из Belgorod Linux User Group - Белгород

Перейти к: навигация, поиск

Содержание

Установка

На мой любимый дистрибутив ставится очень легко :)

emerge syslog-ng

Вообще-то и на любой другой, вроде убунты, также просто:

apt-get install syslog-ng

Базовая Настройка

Настройка для простой одиночной машины, с чего начать? По умолчанию syslog-ng в gentoo идёт с таким конфигом:

cat /etc/syslog-ng/syslog-ng.conf |grep -v '#'|grep -v '^$'
options { 
 	chain_hostnames(off); 
	sync(0); 
};
source src {
   unix-stream("/dev/log" max-connections(256));
   internal();
   file("/proc/kmsg");
};
destination messages { file("/var/log/messages"); };
destination console_all { file("/dev/tty12"); };
log { source(src); destination(messages); };
log { source(src); destination(console_all); };

Попытаемся более ли менее разобраться в данных строках: options указывает глобальные опции, к ним вернёмся позже. А для начала рассмотрим

Правила

Их всего четыре:

source

Данное правило описывает источник. Синтаксис этого правила таков:

source <identifier> { source-driver(params); source-driver(params); ... };

identifier - это то как вы назавете это правило (часто называют src)

source-driver (источником) - может быть: internal, unix-stream, unix-dgram, file, pipe, fifo, tcp, udp, tcp6, udp6, sun-stream, sun-streams

  • internal - это логи самого syslog-ng
  • unix-stream/unix-dgram - для AF_UNIX socket'ов (сокеты в файловом пространстве имён) различие между ними в том, что dgram применяется в BSD и использует семантику SOCK_DGRAM
  • tcp/tcp6 и udp/udp6 - логично догадаться, для пересылки логов по сети
  • file - это специальный файл (устройство, спецфайлы), примеры: /proc/kmsg, /dev/kmsg. обычный файл вроде my.log использовать нельзя, для этого лучше использовать, что нибудь вроде tail -f my.log | logger -p local4.info
  • pipe - похож на file, но не рекомендуется к использованию потому, как специфика pipe открывает именованный канал для чтения записи, что не рекомендуется, например для /proc/kmsg.
  • sun-stream(s) - это какое-то новое IPC от sun'a для Solaris'ов с версии 2.5 (что-то вроде doors)

params - их довольно много, причем для каждого типа соединения свои параметры, по ходу мы рассмотрим некоторые, для детального изучения рекомендуется обратиться к документации syslog-ng

Пример стандартного источника логов:

source src {
   unix-stream("/dev/log" max-connections(256));
   internal();
   file("/proc/kmsg");
};

udp socket

Если мы хотим, чтобы syslog-ng слушал так же UDP сокет (к примеру haproxy пишет в syslog-ng через udp socket), то в источник (source src) надо добавить строку, для поддержки udp:

source src {
...
udp(ip("127.0.0.1") port(514));
}

filter

Фильтры описываются так:

filter <identifier> { expression; };

expression в фильтре может принимать следующие значения:

  • facility(текст) - такой вариант grep, если встречается строка, она выбирается фильтром, допускается вложенность
  • level(приоритет) - выборка по приоритетам (emerg/warning/debug и т.д.)
  • program(имя) - grep по имени программы, которая шлёт логи (пример: sshd)
  • host(имя_хоста) - grep по имени хоста :)
  • match(regexp) - регулярное выражение
  • filter - т.е. вложенность фильтров в фильтры
  • netmask(ip/mask) - grep по ip или маске

Пример, фильтр выбирающий только сообщения программы foo:

filter f_foo { program("foo"); };

destination

Пункт назначения. Описывается как и прочие правила:

destination <identifier> { destination-driver(params); destination-driver(params); ... };

Драйвера назначения повторяют драйвера source, за исключением некоторых новых:

  • usertty(имя_пользователя) - пугать пользователя логами :)
  • program(программа_с_всякими_параметрами) - пускает логи на stdin программы

Вот и все отличия.

Пример, логи в файл

destination messages { file("/var/log/foo.log"); };

или на консоль

destination console_all { file("/dev/tty1"); };


log

Самое главное правило. По синтаксису:

log { source(s1); source(s2); ... 
      filter(f1); filter(f2); ... 
      destination(d1); destination(d2); ... 
      flags(flag1[, flag2...]); };

понятно, что является набором комбинаций источников, фильтров и назначения + флаги.

Пример, все что идет из src направить в messages:

log { source(src); destination(messages); };

Или, все что попало под фильтр foo пустить на консоль,

log { source(src); filter(f_foo); destination(console); };

а потом еще и финализировать (чтобы больше ни куда не писалось):

log { source(src); filter(f_foo); flags(final); };

Организация сервера логов

Теперь мы очень умные и может настроить "сток" логов в одно место - сервер (ip-192.168.200.10). На клиентах в syslog-ng.conf пишем:

destination remote {udp("192.168.200.10" port(514));};
log { source(src); destination(remote); };

На сервере 192.168.200.10 в syslog-ng.conf пишем:

source from_all { udp (ip("192.168.200.10") port(514)); };
destination to_all { file ( "/var/log/HOSTS/$HOST/log" perm(0640) dir_perm(0755)  create_dirs(yes)); };
log { source(from_all); destination(to_all); };

По идеи все. Ребутим syslog'и на клиентах и сервере и пользуемся. Так, а что же делать, когда сервер сбора логов находится за NAT'ом, но при этом требуется "сваливать" логи с другой сети или вообще с серверов в интернете (тут конечно надо не забыть про шифрование)? Организуем шлюз:

Организация шлюза логов

На шлюзе (машина, которая имеет доступ в обе сети) в syslog-ng.conf набираем следующее:

source from_all { udp (ip("192.168.10.1") port(514)) };
destination remote { udp ( "192.168.200.10" port(514) template("$ISODATE -- $HOST_FROM <$FACILITY.$PRIORITY> $MSG\n") template_escape(no) ); };
log { source(from_all); destination(remote); };

Попытаемся разобраться теперь что вышло. Описание source довольно простое - слушать ту подсеть, которая для сервера логов недоступна. Пункт назначения указываем сервер - он должен быть "виден" (ping должен доходить). Далее описываем шаблон отображения.

Шаблоны

Описание шаблонов позволяет выводить потоки системных сообщений в том виде, в котором удобно пользователю. Основные макросы шаблона:

  • ISODATE\FULLDATE - варианты описание даты
  • FACILITY - каким уровнем сгенерированно сообщение (auth/mail/cron и т.д.)
  • PRIORITY - приоритет (info/err и т.д.)
  • HOST\FULLHOST - откуда
  • HOST_FROM - последний хост в цепочке
  • PROGRAM - какая программа
  • PID - pid процесса
  • MSG - само сообщение

Хороший пример шаблона:

template("$ISODATE -- $HOST_FROM <$FACILITY.$PRIORITY> $MSG\n")

Самый простой шаблон сообщения может выглядеть:

template("$MSG\n")

Т.е. приемлема любая комбинация макросов, сколь угодно сложная, так и самая простая.

Пример программы foo

Есть src, и есть программа foo, логи которой мы хотим отправлять syslog-ng, хранить в /var/log/foo.log, а /var/log/message хотим освободить от логов этой программы.

отправка syslog'у - logger

Итак, у нас есть программа foo, которая пишет сообщения на stdout. Мы хотим запустить программу foo как демон, и видеть ее логи, причем время сообщений foo не выводит, а это бы не помешало. Используя утилиту logger:

./foo.sh | logger -p 2 -i -t foo

или если у вас нету какой либо foo, а очень хочется "проверить", то:

echo "hello syslog" | logger -p 2 -i -t foo

И смотрим в /var/log/message, там будут сообщения с тегом foo, и pid'ом процесса.

направление логов

Для того чтобы логи программы foo можно было читать отдельно от сообщений message опишем следующие правила в syslog-ng.conf

destination d_foo { file("/var/log/foo.log"); };
filter f_foo { program("foo"); };
log { source(src); filter(f_foo); destination(d_foo); }; 

удаление мусора из message

Теперь когда у нас есть сообщения foo в отдельном файле, пора избавить наш /var/log/message от лишней информации для нашего же удобства.

log { source(src); filter(f_foo); flags(final); };
  • подразумевается что в конфигурационном файле syslog-ng.conf имеется определение фильтра f_foo.

Шифрование

Postgres

Логи Postgres-а с помощью syslog

/var/lib/postgres/data/postgresql.conf

log_destination = 'syslog'

syslog_facility = 'LOCAL0'
syslog_ident = 'postgres'

client_min_messages = notice
log_error_verbosity = default
log_min_error_statement = error
log_min_duration_statement = 0
log_statement = 'mod'

/etc/syslog-ng/syslog-ng.conf

...

filter f_post { program("postgres"); };
destination postgres { file("/var/log/postgresql/postgresql.log" template("$UNIXTIME -- $MSG\n") perm(0644) owner (postgres) group (helios) ); };
log { source(src); filter(f_post); destination(postgres); };
log { source(src); filter(f_post); flags(final); };

destination messages { file("/var/log/messages"); };
...


/etc/logrotate.d/postgres

/var/log/postgresql/postgresql.log {
   daily
   compress
   dateext
   notifempty
   missingok
   create 644 postgres helios
   rotate 10
   sharedscripts
   postrotate
       /etc/init.d/syslog-ng reload > /dev/null 2>&1 || true
   endscript
}

Перезапуск:

/etc/init.d/syslog-ng reload
/etc/init.d/postgresql restart
Личные инструменты