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

Помогла статья? Есть возможность отблагодарить автора

Автор Zerox

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

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

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

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

  2. Аватар

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

    • Zerox

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

      • Аватар

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

  3. Аватар

    хорошее описание. Но я бы предпочел более «старый «способ, описанный в 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 };

  4. Аватар

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

  5. Аватар

    Инструкция уже не работает, при внесении в конфиг строк:
    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

  6. Аватар

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

  7. Аватар

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

    • Zerox

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

  8. Аватар

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

    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

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

Ваш e-mail не будет опубликован.

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