# Настройка 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 порт:
> 
> Тем не менее, в файл логов на удаленном сервере запись не идет.
> 
>
> В файле логов на локальной машине (клиенте) найдена следующая ошибка:
>
> ```
> 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 сервер прописан, на стороне клиента запись логов локально работает:
> 
## rsyslog
Основной конфигурационной файл - /etc/rsyslog.conf

Первый раздел - модули.
Для того чтобы настроить 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 порт:

> Как видно на скриншоте, rsyslog слушать порт не начинает, порт открыт, все права у rsyslog есть, причина не найдена.
**Конфигурация на стороне клиента:**
Для настройки клиента на отправку логов на удаленный сервер достаточно добавить в конец конфигурационного файла следующую строку:
для udp
`*.* @192.168.1.1:514`
для tcp:
`*.* @@192.168.1.1:514`