Home » Linux » CentOS » Настройка syslog-ng для централизованного сбора логов

Настройка syslog-ng для централизованного сбора логов

Мне понадобилось организовать сервер для сбора логов с удаленных устройств. Это могут быть серверы, сетевое оборудование, либо что-то еще, что поддерживает логирование в формате syslog. Я решил использовать не стандартный для большинства дистрибутивов rsyslog, а установить syslog-ng, потому что мне он показался более удобным и простым в настройке.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти .

Введение

Информации на тему сбора логов с удаленных серверов и интернете достаточно много. Ничего сложного тут нет, я и сам уже описывал подобную настройку в статье про сбор логов с mikrotik. Но решение получилось кривоватое, в комментариях написаны замечания. Я и сам знал о них, но простого и быстрого решения я не смог найти, на тот момент меня устраивал и такой вариант. Сейчас же решил все сделать аккуратно и красиво, чтобы было удобно пользоваться. В процессе поиска информации в интернете решил попробовать syslog-ng. С ним у меня не возникло никаких затруднений, сразу получилось то, что требовалось, поэтому я остановил свой выбор на нем.

Настраивать сервер сбора логов будем на системе CentOS 7. Если у вас еще не подготовлен сервер, то читайте мою информацию по установке и базовой настройке centos. Для небольшого количества устройств, нагрузка на сервер будет незначительная, поэтому имеет смысл размещать сервер на виртуальной машине. Если у вас нет готового гипервизора, можете посмотреть мою информацию на тему настройки linux гипервизора proxmox или бесплатного решения microsoft - Windows Hyper-V Server 2016.

Установка и настройка syslog-ng

С установкой нет ничего сложного. Установить syslog-ng можно одной командой:

# yum install -y syslog-ng

Сразу переходим к настройке. Файл конфигурации располагается по адресу /etc/syslog-ng/syslog-ng.conf. Чтобы сервер начал принимать логи с удаленного устройства, его необходимо прописать в конфиг. Делается это просто. В самый конец конфигурационного файла добавляем информацию о новом устройстве:

destination d_xs-zabbix { file("/var/log/!remote/xs-zabbix.log"); };
filter f_xs-zabbix { netmask("10.1.3.29/255.255.255.255"); };
log { source(net); filter(f_xs-zabbix); destination(d_xs-zabbix); };
d_xs-zabbix Название назначения для записи лога по адресу /var/log/!remote/xs-zabbix.log
f_xs-zabbix Название фильтра по адресу сервера источника.
10.1.3.29 Адрес сервера источника логов

Соответственно для второго сервера нужно добавить еще 3 строки, например так:

destination d_xs-web { file("/var/log/!remote/xs-web.log"); };
filter f_xs-web { netmask("10.1.3.38/255.255.255.255"); };
log { source(net); filter(f_xs-web); destination(d_xs-web); };

И так далее. Добавляете столько серверов, сколько нужно. Не забудьте создать папку для логов. В моем примере это папка /var/log/!remote, сами файлы создавать не надо, служба автоматически их создаст, когда придет информация с удаленных серверов.

Запускаем syslog-ng и добавляем в автозагрузку:

# systemctl start syslog-ng
# systemctl enable syslog-ng

Проверим, запустилась ли служба:

# netstat -tulnp | grep syslog
udp 0 0 0.0.0.0:514 0.0.0.0:* 25960/syslog-ng

Все в порядке, слушает 514 udp порт. Не забудьте открыть этот порт в iptables, если у вас включен фаерволл. Сервер готов к приему логов.

Отправка логов syslog на удаленный сервер

Теперь идем на добавленные в syslog-ng сервера и настраиваем там отправку логов на наш сервер. Сделать это очень просто. Открываем файл конфигурации rsyslog. В CentOS он живет по адресу /etc/rsyslog.conf и добавляем туда строку:

*.* @10.1.3.22

10.1.3.22 - ip адрес syslog-ng сервера. Перезапустите rsyslog:

# service rsyslog restart

и проверяйте логи на сервере syslog-ng в указанной папке. Правило *.* отправит все логи в указанное направление. Это не всегда нужно, можно отредактировать правила. Для этого надо ознакомиться с документацией по syslog. Там нет ничего сложного, мне не хочется на этом сейчас подробно останавливаться. В интернете есть примеры. Приведу пару своих.

*.*;local5.none @10.1.3.22

В данном случае у меня по local5.notice идет лог самбы по доступу к сетевой шаре. Мне не нужно собирать эту информацию и я ее отключил. Вот еще пример:

*.info @10.1.3.22

С этого сервера сыпалось много лишней информации уровня debug. Я ограничил отправляемые сообщения уровнем info. И так далее.

Ротация логов syslog-ng

В завершение приведу пример своего правила ротации логов. Рекомендую ротацию настроить сразу, не оставлять на потом. Создаем файл /etc/logrotate.d/syslog-ng

# mcedit /etc/logrotate.d/syslog-ng
/var/log/!remote/*.log {
    daily
    rotate 180
    olddir /var/log/!remote/old
    missingok
    compress
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

По этому правилу ротация логов происходит раз в день. Старые логи перемещаются в папку /var/log/!remote/old и сжимаются. Хранятся логи за последние 180 дней.

Заключение

Я привел частный случай настройки хранения логов с удаленных устройств. Решение в лоб. В простых случаях этого достаточно. Лично мне удобно смотреть информацию в текстовых файлах. Это требуется редко, сделано на всякий случай для расследования инцидентов, если таковые возникают. Эту же задачу, к примеру, можно решить с помощью заббикс. Я уже показывал, как мониторить с помощью zabbix лог файлы. Приведенное решение легко переделать в хранение логов.

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

Онлайн курс "DevOps практики и инструменты"

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству.

27 комментариев

  1. Аватар
    Владимир

    как только добавляю 3 строки в conf файл, то сервис не стартует....
    что я делаю не так ?

    ● syslog-ng.service - System Logger Daemon
    Loaded: loaded (/usr/lib/systemd/system/syslog-ng.service; enabled; vendor preset: enabled)
    Active: failed (Result: start-limit) since Ср 2020-07-29 16:48:53 MSK; 3s ago
    Docs: man:syslog-ng(8)
    Process: 1989 ExecStart=/usr/sbin/syslog-ng -F -p /var/run/syslogd.pid (code=exited, status=2)
    Main PID: 1989 (code=exited, status=2)
    Status: "Starting up... (Wed Jul 29 16:48:52 2020"

    июл 29 16:48:52 syslog.iceberry.local systemd[1]: syslog-ng.service failed.
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: syslog-ng.service holdoff time over, scheduling restart.
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: Stopped System Logger Daemon.
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: start request repeated too quickly for syslog-ng.service
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: Failed to start System Logger Daemon.
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: Unit syslog-ng.service entered failed state.
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: syslog-ng.service failed.
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: start request repeated too quickly for syslog-ng.service
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: Failed to start System Logger Daemon.
    июл 29 16:48:53 syslog.iceberry.local systemd[1]: syslog-ng.service failed.

    как только удаляю эти строки, то все ровно стартует, но логов же я не увижу, правильно ?
    подскажите пожалуйста...

    строки, которые добавляю: (хочу писать лог контроллера unifi)

    destination d_xs-unifi { file("/var/log/!remote/xs-unifi.log"); };
    filter f_xs-unifi { netmask("10.10.3.25/255.255.255.255"); };
    log { source(net); filter(f_xs-unifi); destination(d_xs-unifi); };

  2. Аватар
    Евгений

    Здравствуйте.
    Второй день ломаю голову, пробовал на обоих хостах использовать штатный в Ubuntu 20.04 rsyslog, и в качестве сервера syslog-ng. В обоих случаях добился того что на сервер прилетают в один файл часть системных логов с собираемого хоста, но не все, не могу заставить передавать логи nginx и его виртуальных хостов.

    В идеале хотел получить следующее:

    Есть хост сервер логов - host1.
    Есть хост с которого хочу получать логи - host2.
    Есть хост с которого хочу получать логи - host3.

    На хостах host2 и host3 крутятся сервисы на nginx. Как заставить прилетать с этих хостов определённые логи, пути к которым известны, на сервер логов host1. Допустим на host2 и host3 крутится Joomla и нужные мне логи лежит по пути:
    /var/log/nginx/access.log
    /var/log/nginx/joomla_access.log
    /var/log/nginx/joomla_access.log.1
    /var/log/nginx/joomla_error.log
    /var/log/nginx/joomla_error.log.1

    Именно их, в таком виде, хочу получать на сервере логов Host1 по пути /var/log/rsyslog/:
    nginx_access.log
    nginx_joomla_access.log
    nginx_joomla_access.log.1
    nginx_joomla_error.log
    nginx_joomla_error.log.1

    В целом не важно что сам Nginx умеет сам передавать свои логи на удалённый syslog сервер, хотелось бы передавать логи один к одному, тех сервисов которые не умеют напрямую передавать логи на удаленный syslog сервер. Возможно ли указывать какой именно лог файл, указав точный путь на удалённом хосте, и передавать его в определённую папку на syslog сервер в определённый файл? Если всё это возможно, киньте пример что скофигурить на сервере и что на хосте. Смысл в том что бы смотреть логи на одной машине в том виде, в котором они формируются на удалённых хостах, один к одному.

  3. Аватар

    Здравствуйте.
    Была бы очень полезна статья как все это потом прикрутить к заббиксу. Спасибо

    • Zerox

      Что именно вы хотите увидеть в заббиксе? Возможно, у меня есть статьи на эту тему.

      • Аватар

        Я бы хотел заббиксом собирать эти логи и видеть их в заббиксе

        • Zerox

          Плохая идея. Zabbix не предназначен для хранения логов. Он все же система мониторинга. Если надо хранить логи, лучше использовать ELK или какие-то другие решения под это дело.

        • Zerox

          Пример того, как лог файлы передавать в zabbix есть в этой статье - https://serveradmin.ru/monitoring-ssh-loginov-v-zabbix/
          Может по аналогии любой лог туда отправить. Но еще повторю - если логов много это плохая идея. База заббикса не заточена под хранение большого количества логов. Работать с ними будет неудобно.

  4. Аватар

    А мне интересно, а где определение source (net)? И все повторяют, и у всех все получается...)))))))))))))))))))))))))

  5. Аватар
    Дмитрий

    Добрый день. Есть ли какой нибудь относительно простой способ добавить веб-гуи к syslog-ng, с авторизацией? Чтобы можно было зайти из любого места и посмотреть логи.

  6. Аватар

    Привет! Сделал всё как Вы написали, всё получилось, но у меня ещё один вопрос, а как можно apache, nginx, mysql и openvpn логов отправить через rsyslog на syslog-ng ?

    • Zerox

      Читать документацию к каждому из сервисов и смотреть, как настроить отправку логов в syslog формате. Если не ошибаюсь, они все это умеют. Единственное сомнение насчет mysql, не настраивал. А все остальное в syslog отправлял.

      • Аватар

        Здравствуйте! Спасибо за совет (ответ :) ) настроил отправку логов nginx и apache, как вы уже сказали все они умеют отправить логи на syslog, mysql-а Я не смог настроить. В Интернете больше всего есть статьи по этой теме где syslog тправляет и сохроняет свои логи в mysql :)

  7. Аватар

    хорошее описание. Но я бы предпочел более "старый "способ, описанный в http://www.linux-magazin.de/ausgaben/2009/06/zentrale-kontrolle/

    destination loghost {
    file ("/var/log/hosts/$YEAR-$MONTH/$HOST/$FACILITY-$YEAR-$MONTH-$DAY"
    owner(root) group(root) perm(0600) dir_perm(0700) create_dirs(yes)
    );
    удобнее , само сортирует файлы. Работы меньше
    01 # Filter/Destination für PIX-Firewall
    02 filter f_pix {
    03 host(pix);
    04 };
    05 # Zielort der Log-Dateien
    06 destination loghost {
    07 file ("/var/log/hosts/$YEAR-$MONTH/$HOST/$FACILITY-$YEAR-$MONTH-$DAY"
    08 owner(root) group(root) perm(0600) dir_perm(0700) create_dirs(yes)
    09 );
    10 };
    11 log {
    12 source(s_all);
    13 destination(loghost);
    14 };
    15 # Pix
    16 log {
    17 source(s_all);
    18 filter(f_pix);
    19 destination(loghost);
    20 flags(final);
    21 };

  8. Аватар

    Спасибо за материал! Очень интересно и хорошо изложено.
    И да, в syslog-ng.conf нужно раскомментировать строку:
    #udp(ip(0.0.0.0) port(514));
    перед тем как запускать syslog-ng.

  9. Аватар

    Инструкция уже не работает, при внесении в конфиг строк:
    destination d_xs-zabbix { file("/var/log/remote/xs-zabbix.log"); };
    filter f_xs-zabbix { netmask("10.1.3.29/255.255.255.255"); };
    log { source(net); filter(f_xs-zabbix); destination(d_xs-zabbix); };

    Daemon не запускается, остановка и удаление rsyslog как писали выше не помогает:
    [root@log]# systemctl restart syslog-ng.service
    Job for syslog-ng.service failed because the control process exited with error code. See "systemctl status syslog-ng.service" and "journalctl -xe" for details.

    [root@log]# systemctl status syslog-ng.service
    ● syslog-ng.service - System Logger Daemon
    Loaded: loaded (/usr/lib/systemd/system/syslog-ng.service; enabled; vendor preset: enabled)
    Active: failed (Result: start-limit) since Thu 2018-02-15 17:58:27 MSK; 42s ago
    Docs: man:syslog-ng(8)
    Process: 2003 ExecStart=/usr/sbin/syslog-ng -F -p /var/run/syslogd.pid (code=exited, status=2)
    Main PID: 2003 (code=exited, status=2)
    Status: "Starting up... (Thu Feb 15 17:58:27 2018"

    Feb 15 17:58:27 log.local systemd[1]: Unit syslog-ng.service entered failed state.
    Feb 15 17:58:27 log.local systemd[1]: syslog-ng.service failed.
    Feb 15 17:58:27 log.local systemd[1]: syslog-ng.service holdoff time over, scheduling restart.
    Feb 15 17:58:27 log.local systemd[1]: start request repeated too quickly for syslog-ng.service
    Feb 15 17:58:27 log.local systemd[1]: Failed to start System Logger Daemon.
    Feb 15 17:58:27 log.local systemd[1]: Unit syslog-ng.service entered failed state.
    Feb 15 17:58:27 log.local systemd[1]: syslog-ng.service failed.
    Feb 15 17:58:27 log.local systemd[1]: start request repeated too quickly for syslog-ng.service
    Feb 15 17:58:27 log.local systemd[1]: Failed to start System Logger Daemon.
    Feb 15 17:58:27 log.local systemd[1]: syslog-ng.service failed.

    • Zerox

      А в /var/log/messages что-то есть на этот счет? Не понятно, в чем ошибка. Обычно в логе есть информация на эту тему.

      • Аватар

        Ничего необычно я не увидел.

        Feb 15 17:47:23 log-n1 yum[1749]: Installed: syslog-ng-3.5.6-3.el7.x86_64
        Feb 15 17:47:36 log-n1 systemd: Reloading.
        Feb 15 17:47:40 log-n1 systemd: Listening on Syslog Socket.
        Feb 15 17:47:40 log-n1 systemd: Starting Syslog Socket.
        Feb 15 17:47:40 log-n1 systemd: Starting System Logger Daemon...
        Feb 15 17:47:40 log-n1 syslog-ng[1914]: syslog-ng starting up; version='3.5.6'
        Feb 15 17:47:40 log-n1 systemd[1]: Listening on Syslog Socket.
        Feb 15 17:47:40 log-n1 systemd[1]: Starting Syslog Socket.
        Feb 15 17:47:40 log-n1 systemd[1]: Starting System Logger Daemon...
        Feb 15 17:47:40 log-n1 systemd: Started System Logger Daemon.
        Feb 15 17:47:40 log-n1 systemd[1]: Started System Logger Daemon.
        Feb 15 17:52:41 log-n1 syslog-ng[1914]: syslog-ng shutting down; version='3.5.6'
        Feb 15 17:52:41 log-n1 systemd[1]: Stopping System Logger Daemon...
        Feb 15 17:52:41 log-n1 systemd: Stopping System Logger Daemon...
        Feb 15 17:52:41 log-n1 systemd: Starting System Logger Daemon...
        Feb 15 17:52:41 log-n1 systemd: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
        Feb 15 17:52:41 log-n1 systemd: Failed to start System Logger Daemon.
        Feb 15 17:52:41 log-n1 systemd: Unit syslog-ng.service entered failed state.
        Feb 15 17:52:41 log-n1 systemd: syslog-ng.service failed.
        Feb 15 17:52:41 log-n1 systemd: syslog-ng.service holdoff time over, scheduling restart.
        Feb 15 17:52:41 log-n1 systemd: Starting System Logger Daemon...
        Feb 15 17:52:41 log-n1 systemd: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
        Feb 15 17:52:41 log-n1 systemd: Failed to start System Logger Daemon.
        Feb 15 17:52:41 log-n1 systemd: Unit syslog-ng.service entered failed state.
        Feb 15 17:52:41 log-n1 systemd: syslog-ng.service failed.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service holdoff time over, scheduling restart.
        Feb 15 17:52:42 log-n1 systemd: Starting System Logger Daemon...
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
        Feb 15 17:52:42 log-n1 systemd: Failed to start System Logger Daemon.
        Feb 15 17:52:42 log-n1 systemd: Unit syslog-ng.service entered failed state.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service failed.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service holdoff time over, scheduling restart.
        Feb 15 17:52:42 log-n1 systemd: Starting System Logger Daemon...
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
        Feb 15 17:52:42 log-n1 systemd: Failed to start System Logger Daemon.
        Feb 15 17:52:42 log-n1 systemd: Unit syslog-ng.service entered failed state.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service failed.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service holdoff time over, scheduling restart.
        Feb 15 17:52:42 log-n1 systemd: Starting System Logger Daemon...
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service: main process exited, code=exited, status=2/INVALIDARGUMENT
        Feb 15 17:52:42 log-n1 systemd: Failed to start System Logger Daemon.
        Feb 15 17:52:42 log-n1 systemd: Unit syslog-ng.service entered failed state.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service failed.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service holdoff time over, scheduling restart.
        Feb 15 17:52:42 log-n1 systemd: start request repeated too quickly for syslog-ng.service
        Feb 15 17:52:42 log-n1 systemd: Failed to start System Logger Daemon.
        Feb 15 17:52:42 log-n1 systemd: Unit syslog-ng.service entered failed state.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service failed.
        Feb 15 17:52:42 log-n1 systemd: start request repeated too quickly for syslog-ng.service
        Feb 15 17:52:42 log-n1 systemd: Failed to start System Logger Daemon.
        Feb 15 17:52:42 log-n1 systemd: Unit syslog.socket entered failed state.
        Feb 15 17:52:42 log-n1 systemd: syslog-ng.service failed.
        Feb 15 17:53:11 log-n1 systemd: Listening on Syslog Socket.

        • Аватар

          Разобрался, теперь работает, конфиг /etc/syslog-ng/syslog-ng.conf по умолчанию не настроен на принятие логов от удаленных хостов (внезапно!), поэтому в него обязательно необходимо добавить секцию:
          ===
          source net {
          udp(ip(0.0.0.0) port(514));
          };
          ===
          также возможно придется сделать следующее:
          nano /etc/systemd/journald.conf
          [Journal]
          ForwardToSyslog=yes
          $ systemctl restart systemd-journald.service
          $ systemctl restart syslog-ng.service

          P.S. Пакет syslog-ng.x86_64, @version:3.5.6

  10. Аватар
    Аноним

    Строго говоря, syslog-ng OSE ≠ syslog-ng [Premium Edition].

  11. Аватар

    Я так понимаю что если ставить из исходников, а не через yum, то
    "Запускаем syslog-ng и добавляем в автозагрузку:" - не прокатит, там нужно еще что-о сделать?

    • Zerox

      По идее да, нужно скрипты запуска самим сделать. Обычно в исходниках где-то есть пример под каждую систему.

  12. Аватар

    День добрый, все делаю по инструкции, дохожу до ввода команды:

    systemctl start syslog-ng

    выдает ошибку:

    [root@localhost ~]# systemctl start syslog-ng
    Job for syslog-ng.service failed because the control process exited with error code. See "systemctl status syslog-ng.service" and "journalctl -xe" for details.

    вот вывод команды
    [root@localhost ~]# systemctl status syslog-ng.service
    ● syslog-ng.service - System Logger Daemon
    Loaded: loaded (/usr/lib/systemd/system/syslog-ng.service; enabled; vendor preset: enabled)
    Active: failed (Result: start-limit) since Wed 2017-04-12 18:15:11 MSK; 16s ago
    Docs: man:syslog-ng(8)
    Process: 10813 ExecStart=/usr/sbin/syslog-ng -F -p /var/run/syslogd.pid (code=exited, status=2)
    Main PID: 10813 (code=exited, status=2)
    Status: "Starting up... (Wed Apr 12 18:15:10 2017"

    подскажите в чем может быть проблема?

    • Аватар

      вроде разобрался сам, служба syslog-ng конфликтует со стандартной службой syslog, поэтому перед запуском первой последнюю нужно отключать:
      https://www.centos.org/forums/viewtopic.php?t=57379
      my syslog-ng failed on startup because it doesnt play nice with rsyslog (im thinking they both use port 514)
      systemctl disable rsyslog
      allowed me to systemctl start syslog-ng
      syslog-ng-3.5.6-3.el7.x86_64

Добавить комментарий

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.