# Настройка syslog-ng и rsyslog ## syslog-ng Главный конфигурационный файл - `/etc/syslog-ng/syslog-ng.conf` В нем сначал указывается версия: `@version: 3.27` Затем идет раздел `global options`, после чего начинается самое интересное - параметры `source, destination, filter, log`. ### Source (источник) Этот параметр содержит информацию об источнике логов. Можно указывать несколько источников, реализовано это аналогично с функциями на языке С. К примеру, источник по умолчанию описан таким образом: ``` source s_src { system(); internal(); }; ``` Здесь мы видим источник под названием s_src и параметрами system() и internal() без аргументов. При подключении такого источника будут собираться все логи системы. Мы можем указать в качестве источника какой-либо файл логов программы, например: ``` source s_file { file("/var/log/messages"); }; ``` Также источником может служить сеть (при сборе логов с удаленного сервера), для этого нужно указать протокол передачи данных и прослушиваемый порт: ``` source s_net { udp (ip(0.0.0.0) port(514));}; ``` В примере выше мы получаем любые данные, приходящие по udp на 514 порт. По умолчанию syslog-ng использует 514 порт для передачи данных через udp и tcp. ### Destination (назначение) Этот параметр указывает куда будут отправляться логи, полученные от источника. Они могут записываться в локальный файл: `destination d_test { file ("/var/log/test.log");};` Или, например, отправляться на удаленный сервер по сети: ``` destination d_remote {network(«192.168.183.221» port(514));}; ``` ### Log (логирование) Функция log принимает параметры source и destination и непосредственно записывает логи из указанного источника в указанное место назначения. Для записи локальных логов системы в файл /var/log/test.log используется такая конфигурация: ``` source s_src { system(); internal(); }; destination d_local { file("/var/log/test.log"); }; log { source(s_src); destination(d_local); }; ``` Для пересылки логов на удаленный сервер `192.168.183.221`: ``` source s_src { system(); internal(); }; destination d_remote { network(«192.168.183.221» port(514)); }; log { source(s_src); destination(d_remote); }; ``` > Примечание: в такой конфигурации всё должно работать, сервер приема логов действительно начинает слушать 514 порт: > ![](https://i.imgur.com/hFYk5wN.png) > Тем не менее, в файл логов на удаленном сервере запись не идет. > ![](https://i.imgur.com/Jw69weR.png) > > В файле логов на локальной машине (клиенте) найдена следующая ошибка: > > ``` > Jul 19 14:58:39 debian syslog-ng[2212]: Error resolving hostname with getaddrinfo(); host='«192.168.183.221»', error='-2', error_str='Name or service not known' > ``` > В /etc/hosts сервер прописан, на стороне клиента запись логов локально работает: > ![](https://i.imgur.com/QtmxBhf.png) ## rsyslog Основной конфигурационной файл - /etc/rsyslog.conf ![](https://i.imgur.com/3Yzg8nF.png) Первый раздел - модули. Для того чтобы настроить rsyslog на прослушивание udp и tcp портов необходимо раскомментировать следующие строки: ``` module(load="imudp") input(type="imudp" port="514") module(load="imtcp") input(type="imtcp" port="514") ``` После этого вставьте следующие строки, чтобы определить шаблон, который демон Rsyslog будет использовать для хранения входящих журналов от клиентских систем: ``` $template remote-incoming-logs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *.* ?remote-incoming-logs ``` ``` /% HOSTNAME% / — это имя хоста клиентской системы. /% PROGRAMNAME% / — определяет клиентскую программу, создавшую файл журнала. ``` Чтобы применить изменения, перезапустите демон rsyslog. `$ sudo systemctl restart rsyslog` Убедимся что rsyslog начал прослушивать 514 порт: ![](https://i.imgur.com/KHql4uD.png) > Как видно на скриншоте, rsyslog слушать порт не начинает, порт открыт, все права у rsyslog есть, причина не найдена. **Конфигурация на стороне клиента:** Для настройки клиента на отправку логов на удаленный сервер достаточно добавить в конец конфигурационного файла следующую строку: для udp `*.* @192.168.1.1:514` для tcp: `*.* @@192.168.1.1:514`