Что за файл syslog
Продвигается фирмой Red Hat, в частности, в RHEL5 включены версии 3.22.1 и 5.8.12 как rsyslog5; в RHEL6 (версии 5.8.10 и 7.4.10 как rsyslog7) и RHEL7 (версии 7.4.7 и 8.24.0 в RHEL 7.4) ставится по умолчанию. Имеется платная поддержка (Adiscon). Лицензия - GPLv3 (Apache license 2.0?). Работает под Linux (Red Hat, Debian, Ubuntu, OpenSUSE, Gentoo), FreeBSD, Solaris, AIX.
Различные версии rsyslog (2, 3, 5, 7 и 8) имеют различный формат конфигурационного файла и архитектуру. Несмотря на попытки обеспечить совместимость безопаснее рассматривать их как различные программы.
- SIGHUP - реинициализация (закрывает все файлы, ?читает заново файл конфигурации, ? разрываются TCP соединения, ?сбрасываются хранящиеся в памяти очереди)
- SIGTERM, SIGINT, SIGQUIT - завершение работы
- SIGUSR1 - включить/выключить отладку (только при использовании ключа -d)
- SIGCHLD - дождаться завершения порождённых процессов
- RSYSLOG_DEBUG - список опций отладки через пробел: Help, Debug, DebugOnDemand, LogFuncFlow, FileTrace=имя-файла-программы, PrintFuncDB, PrintMutexAction, NoLogTimeStamp, NoStdOut
- RSYSLOG_DEBUGLOG=имя-файла-отладочной-печати
- RSYSLOG_MODDIR=каталог-с-модулями
Файл настройки (обычно /etc/rsyslog.conf и файлы каталога /etc/rsyslog.d) может содержать конструкции в стиле basic (sysklogd, но не совсем), в старом стиле rsyslog версий 2, 3 и 5 (legacy, obsolete legacy, директивы начинаются с "$") и в новом стиле версий 6, 7 и 8 (advanced, RainerScript). Некоторые модули не адаптированы к новому (advanced) стилю, некоторые возможности нельзя описать старым стилем (basic). В старом стиле директивы обрабатывались построчно, в новом стиле весь файл - это поток сознания.
- селектор источника и серьёзности как и ранее
- фильтр на основе значения переменной: ':имя, [!]операция-сравнения, "значение"', где операция сравнения - contains, isequal, startswith, regex, ereregex
- выражения с использованием переменных ($имя): "if выражение then действие", где в качестве выражения можно использовать выражения языка RainerScript
- блоки в стиле BSD (!программа, +хост) отменены в версии 7
- list - список констант ('constant(value="текст" параметр="значение" . )') и значений переменных ('property(name="имя" параметр="значение" . )')
- subtree - поддерево CEE, параметр subtree указывает часть поддерева ("$!" - целиком)
- string - параметр string задаёт шаблон из констант и переменных ('%имя:начало:конец:преобразователь%')
- plugin - параметр plugin задаёт имя предварительно загруженного модуля
Строчные константы записываются как 'строка', "строка", `echo переменная-окружения` (8.33), `cat имя-файла` (8.33). Маскировка спецсимволов: "\n", "\123", "\xFF".
Для структурированного вывода (например, JSON) предусмотрены параметры format (json, jsonf, jsonr, jsonfr, csv) и outname (имя элемента).
Для преобразования значений переменных имеется множество параметров: dateformat (date-utc, date-mysql, date-rfc3164, date-rfc3164-buggyday, date-rfc3339, date-unixtimestamp, date-year, date-month, date-day, date-hour, date-minute, date-second, date-subseconds, date-ordinal, date-week, date-week, date-wdayname), date.inUTC, caseconversion (lower, upper), controlcharacters (escape, space, drop), securepath, position.from, position.to, position.relativeToEnd (yes, no), fixedwidth (yes, no), compressspace, field.number, field.delimiter, regex.type (ERE, BRE), regex.expression, regex.nomatchmode, regex.nomatchmode, regex.submatch, droplastlf, mandatory (on, off).
Опции шаблонов позволяют стандартные адаптирующие преобразования для результатирующей строки: option.sql, option.stdsql, option.json, option.jsonf, option.casesensitive.
Стандартные шаблоны: RSYSLOG_TraditionalFileFormat (грубое время без часового пояса), RSYSLOG_FileFormat (точное время с часовым поясом), RSYSLOG_TraditionalForwardFormat, RSYSLOG_SysklogdFileFormat, RSYSLOG_ForwardFormat, RSYSLOG_SyslogProtocol23Format (почти RFC 5424), RSYSLOG_DebugFormat.
- тип выражения - BRE (базовое) или ERE (расширенное)
- номер подвыражения (от 1 до 9), которое надо выдать в качестве результата; 0 - всё выражение
- что делать при отсутствии сопоставления - DFLN (строка "**NO MATCH**"), BLANK (пустая строка), ZERO ("0"), FIELD (выдать всё поле)
- номер сопоставления, если нужно не первое встретившееся сопоставление; от 0 до 9; нумерация с 0
Также можно поделить переменную на поля, если в поле 'начало' поместить букву 'F,десятичный-код-символа-разделителя', а в поле 'конец' - номер поля (нумерация с 1). Символ '+' после кода позволяет рассматривать несколько подряд идущих разделителей как 1.
- целое - знаки пунктуации ( "." и "," игнорируются )
- размер - целое с модификаторами (k - двоичные (1024), K - десятичные (1000))
- строка
- слово - без пробелов
- символ - без кавычек
- булевое - on(1), off(0)
Модуль mmrm1stspace позволяет удалить первый пробел из msg.
Пример правила из руководства liblognorm:
Пример настройки коллектора в новом формате:
- ptcp - просто TCP, без шифрования и аутентификации
- gtls - GnuTLS (режимы шифрования: 0 - без шифрования, 1 - TLS; режимы аутентификации: anon, x509/fingerprint - проверка fingerprint, x509/certvalid - проверка сертификата на корректность, x509/name - проверка имени (Subject), в текущей реализации корневой CA должен быть одинаков)
- SIGHUP - реинициализация (закрывает все файлы, читает заново файл конфигурации, разрываются TCP соединения, сбрасываются хранящиеся в памяти очереди)
- SIGTERM, SIGINT, SIGQUIT - завершение работы
- SIGUSR1 - включить/выключить отладку (только при использовании ключа -d)
- SIGCHLD - дождаться завершения порождённых процессов
- Direct - отсутствие очереди, позволяет вернуть статус выполнения, что обязательно для работы логики резервирования сервера журналов
- Disk - буферизация с использованием файлов, надёжно (требуется ручная работа), медленно; можно задать шаблон имени файла (QueueFilename, WorkDirectory), размер куска (QueueMaxFileSize), интервал сохранения (QueueCheckpointInterval)
- LinkedList - очередь в памяти, быстро, не переживёт аварию; реализована в виде связанного списка, динамическое выделение памяти
- FixedArray - очередь в памяти, быстро, не переживёт аварию; реализована в виде массива указателей, меньшее потребление CPU
- очередь в памяти с файловой поддержкой (disk-assisted, DA); LinkedList или FixedArray с заданием шаблона имени файла; файловая очередь используется при необходимости (переполнение очереди в памяти или выключение сервера) с учётом HighWatermark и LowWatermark
Не меняет права доступа к имеющимся файлам.
- $UDPSeverAddress IP-адрес (по умолчанию прослушиваются все интерфейсы ("*"), директив может быть несколько)
- $UDPServerRun имя-или-номер-порта (514, обязательно после задания адреса, директив может быть несколько)
- $TCPSeverAddress IP-адрес (по умолчанию прослушиваются все интерфейсы ("*"), директив может быть несколько, не реализовано)
- $InputTCPServerRun имя-или-номер-порта (514, обязательно после задания адреса, в будущем директив может быть несколько, а пока либо TLS для всех, либо никому)
- $InputTCPMaxSessions число-одновременных-сессий
- $InputTCPServerStreamDriverMode режим-шифрования (зависит от драйвера потока ptcp или gtls)
- $InputTCPServerStreamDriverAuthMode режим-аутентификации (зависит от драйвера потока ptcp или gtls)
- $InputTCPServerStreamDriverPermittedPeer список-допустимых-соседей (можно использовать шаблоны, можно указывать несколько раз)
- $ActionMailSMTPServer имя-или-адрес (127.0.0.1)
- $ActionMailSMTPPort имя-или-номер (25)
- $ActionMailFrom адрес-отправителя
- $ActionMailTo адрес-получателя (можно использовать несколько раз, сбрасывается?)
- $ActionMailSubject имя-шаблона
- $ActionMailEnableBody on|off
- $actionsnmptransport udp|tcp|udp6|tcp6|icmp|icmp6
- $actionsnmptarget имя-или-адрес-SNMP-сервера
- $actionsnmptargetport имя-или-номер (162)
- $actionsnmpversion индекс-версии (1; 0 - SNMPv1, 1 - SNMPv2c)
- $actionsnmpcommunity имя (public)
- $actionsnmptrapoid идентификатор-OID ("1.3.6.1.4.1.19406.1.2.1", что означает "ADISCON-MONITORWARE-MIB::syslogtrap"; только для SNMPv2c; на стороне получателя должны быть установлены ADISCON-MONITORWARE-MIB) и ADISCON-MIB
- $actionsnmpsyslogmessageoid идентификатор ("1.3.6.1.4.1.19406.1.1.2.1", что означает "ADISCON-MONITORWARE-MIB::syslogMsg")
- $actionsnmpenterpriseoid идентификатор ("1.3.6.1.4.1.3.1.1", что означает "enterprises.cmu.1.1"; только для SNMPv1)
- $actionsnmpspecifictype номер-trap (0; только для SNMPv1)
- $actionsnmptraptype тип-trap (6, что означает SNMP_TRAP_ENTERPRISESPECIFIC; только для SNMPv1)
- $ActionLibdbiDriverDirectory имя-каталога
- $ActionLibdbiDriver mysql|firebird|ingres|msql|Oracle|sqlite|sqlite3|freetds|pgsql (freetds - для Microsoft SQL и Sybase)
- $ActionLibdbiHost имя-хоста
- $ActionLibdbiUserName имя-пользователя
- $ActionlibdbiPassword пароль
- $ActionlibdbiDBName имя-БД
- RSYSLOG_TraditionalFileFormat - традиционный формат журнала для записи в файл
- RSYSLOG_FileFormat - традиционный формат журнала, с добавлением долей секунды и зоны
- RSYSLOG_TraditionalForwardFormat - традиционный формат журнала для передачи на удалённый сервер
- RSYSLOG_ForwardFormat - традиционный формат журнала для передачи с добавлением долей секунды и зоны
- RSYSLOG_SyslogProtocol23Format - формат, определённый в проекте стандарта IETF ietf-syslog-protocol-23
Простейший шаблон для использования с модулем ommysql (однако, рекомендуется использовать встроенную схему, совместимую с phpLogCon, createDB.sql):
Использование начальной и конечной позиции позволяет выделять подстроку. Нумерация символов начинается с 1. Символ "$" означает конец строки. Если в качестве начальной позиции указать символ "R", то конечная позиция должна содержать регулярное выражение. В конце регулярного выражения необходимо дописать "--end". Имеются модификаторы типа регулярного выражения и что делать при отсутствии совпадения, подробности в документации (property_replacer.html). Если в качестве начальной позиции указать символ "F", то конечная позиция должна содержать номер требуемого поля (нумеруются с 1, разделителем по умолчанию является символ табуляции, можно изменить указав после символа "F" запятую и десятичное значение символя-разделителя. Тема UNICODE не раскрыта .
В качестве селектора можно использовать значения переменных (property) в следующем формате:
:имя-переменной,[!]
Прописные и строчные буквы различаются. Обратная косая черта маскирует последующий символ (в текущей реализации - '"' и '\').
В качестве селектора можно использовать выражения на бестиповом скриптовом языке RainerScript (Rainer - фамилия разработчика rsyslog) с использованием логических (not, and, or), арифметических (*, /, %, +, -) и строковых (contains, contains_i, startswith, startswith_i, &) операций, а также сравнений (==, !=, <>, , =) с учётом приоритетов и скобок в следующем формате:
if выражение then действие
Значения переменных извлекаются использованием символа '$', за которым указывается имя переменной.
Специальный селектор '&' повторяет действие предыдущего селектора.
Жаль, что авторы не уделили времени проектированию перед началом реализации, а исходили из списка пожеланий пользователей.
Условия: в инфраструктуре используются только Linux-сервера.
Отказоустойчивость
Эту возможность я пока не пробовал в продакшене.
Изучение и мониторинг журналов
Далее в файле протокола можно обнаружить версию ядра, параметры его запуска, информацию о типе процессора и объеме ОЗУ:
Иногда может возникать необходимость мониторинга системных журналов с целью поиска текущих событий. Например, можно попробовать поймать редко случающееся событие в тот момент, когда оно произошло. В таком случае можно использовать команду tail с опцией -f для отслеживания содержимого системного журнала. Пример:
Кроме файлов-журналов, указанных в /etc/syslog.conf, существуют так же и другие файлы, например файл /var/log/dmesg, который хранит информацию о процессе загрузки системы до запуска syslogd, а так же файлы /var/log/lastlog, /var/log/wtmp, /var/log/btmp, имеющие двоичный формат и и хранящие информацию о последнем входе пользователя в систему, о всех удачных входах пользователей в систему и о всех неудачных входах пользователей в систему соответственно. Так же в каталоге /var/log/ могут находится лог-файлы таких демонов как веб-сервер или прокси-сервер. Формат данных файлов аналогичен журналам syslogd.
Подведем небольшой итог:
На сегодня это все. Надеюсь описал все максимально понятно. Со временем буду дополнять статью!
Взаимодействие с logrotate
Управление типом и подробностью журналируемой информации
Логи, записываемые приложением и считываемые rsyslog
Для приложений, способных переоткрывать файлы по запросу(SIGHUP или что-нибудь ещё), дополнительная конфигурация не требуется. rsyslog заметит изменения inode файла и переоткроет его.
Проблемы появляются с опцией logrotate copytruncate , которая для smth.log создаёт его копию smth.log.1 и обрезает его до нулевого размера. rsyslog просто прекращает читать новые строки из такого файла (по крайней мере, пока он не превысит размер до ротации). Начиная с версии 8.16.0, модуль imfile имеет опцию reopenOnTruncate (по-умолчанию "off" , включается "on" ). Эта опция заставляет rsyslog переоткрывать файл при обрезке (inode не изменилась, но размер уменьшился). Опция помечена как "экспериментальная", но у меня в продакшене работает нормально. Для версий старше 8.16.0, можно починить ротацию с copytruncate с помощью посылки сигнала SIGHUP процессу rsyslogd в post-rotate action.
Систему сбора и анализа логов на syslog-ng, elasticsearch в качестве хранилища данных, kibana и grafana в качестве систем визуализации данных, kibana для удобного поиска по логам, elasticalert для отправки уведомлений по событиям. Приготовьтесь, туториал объемный.
Какие логи будем собирать:
- все системные логи разложенные по индексам в зависимости от их facility(auth,syslog,messages и т.д.);
- логи nginx — access и error;
- логи pm2;
- и др.
Обоснование выбора системы
Почему я выбрал связку с syslog-ng в качестве отправителя, парсера и приемщика логов? Да потому что он очень быстрый, надежный, не требовательный к ресурсам(да да — logstash в качестве агентов на серверах и виртуальных машинах просто убожество в плане пожирания ресурсов и требованием java), с внятным синтаксисом конфигов(вы видели rsyslog? — это тихий ужас), с широкими возможностями — парсинг, фильтрация, большое количество хранилищ данных(postgresql,mysql,elasticsearch,files и т.д.), буферизация(upd не поддерживает буферизацию), сторонние модули и другие фишки.
Требования:
Приступим или добро пожаловать под кат
Небольшое пояснение.
Только кластер elasticsearch можно использовать в production, система из одной ноды просто загнется. В production используем кластер из master ноды и нескольких датанод. Отказоустойчивый кластер здесь рассматривать не будем. Кому интересно — вперед гуглить. Elastic рекомендует использовать одинаковую конфигурацию для нод кластера, так как кластер все равно будет работать со скоростью самой медленной ноды. Я использую ноды по 4 cpu и 12 gb озу и 700 gb ssd.
Наша система логов будет состоять из нескольких виртуальных машин — головного сервера(elasticnode1) и датанод elasticsearch(elasticnode2-9), на которых будут только храниться данные.
Сразу поправим файл /etc/hosts, если у вас нет настроенного dns сервера.
Меняем планировщика — у нас же ssd
Компоненты головного сервера
(elasticnode1):
- syslog-ng — наш главный приемщик, обработчик и отправитель логов;
- docker — в нем мы поднимем grafana, kibana,elasticalert;
- kibana — визуализация и поиск логов;
- grafana — визуализация и отправка уведомлений(на данный момент нельзя слать уведомления используя elasticsearch в качестве хранилища данных);
- elasticalert(через него и будем слать уведомления из elasticsearch в telegram — куда же без него );
- elasticsearch — собственно сюда и будем слать все наши данные с нод и отпарсенных файликов;
- ubuntu 16.04 в качетве ос.
- elasticsearch;
- ubuntu 16.04 в качестве ос.
Компоненты отправителей логов:
На данный момент появилась версия 6 продуктов elasticsearch, kibana и т.д., я же в production использую 5.6.3 — пока не было возможности мигрировать на последнюю версию.
Настраиваем отправители логов.
Устанавливаем syslog-ng последней версии. Ставить будем из репозитория. Здесь установка для Ubuntu 16.04.
Настраиваем syslog-ng для парсинга и отправки логов с клиента на сервер.
Приводим /etc/syslog-ng/syslog-ng.conf к такому виду.
Создаем конфиг отправки логов на сервер.
Вставляем сюда следующее содержимое
Таким образом мы все логи будем отправлять по udp на 514 порт сервера. Там он с ними разберется — разложит по индексам, отфильтрует и т.д.
Настройка отправки nginx access и error логов через вывод содержимого лога и отправки по udp на обозначенные порты.
Почему я выбрал вывод содержимого из файла и отправку по udp, а не прямую отправку из nginx на порт? У меня возникали непонятные баги при отправке логов напрямую из nginx(сервер начинал возвращать много 500 и 502 ошибок).
Настройка логов для отправки в nginx. Отредактируем конфиг nginx.conf.
Делаем рестарт nginx. Все логи будут падать(если у вам не переопределено в конфигах) в папку /var/log/nginx/ в 2 файла указанных выше.
Настраиваем syslog-ng на чтение файлов и отправку по udp.
Не забываем периодически обнулять файл логов, чтобы он не съел все место на сервере. Можете использовать данный скрипт по крону.
Настраиваем головной сервер с syslog-ng,elasticsearch,kibana,grafana и elasticalert.
Журналирование является основным источником информации о работе системы и ее ошибках. В этом кратком руководстве рассмотрим основные аспекты журналирования операционной системы, структуру каталогов, программы для чтения и обзора логов.
Основные лог файлы
Все файлы журналов, можно отнести к одной из следующих категорий:
Большинство же лог файлов содержится в директории /var/log .
Для каждого дистрибутива будет отдельный журнал менеджера пакетов.
- /var/log/yum.log — Для программ установленных с помощью Yum в RedHat Linux.
- /var/log/emerge.log — Для ebuild -ов установленных из Portage с помощью emerge в Gentoo Linux.
- /var/log/dpkg.log — Для программ установленных с помощью dpkg в Debian Linux и всем семействе родственных дистрибутивах.
И немного бинарных журналов учета пользовательских сессий.
- /var/log/lastlog — Последняя сессия пользователей. Прочитать можно командой last .
- /var/log/tallylog — Аудит неудачных попыток входа в систему. Вывод на экран с помощью утилиты pam_tally2 .
- /var/log/btmp — Еже один журнал записи неудачных попыток входа в систему. Просто так, на всякий случай, если вы еще не догадались где следует искать следы активности взломщиков.
- /var/log/utmp — Список входов пользователей в систему на данный момент.
- /var/log/wtmp — Еще один журнал записи входа пользователей в систему. Вывод на экран командой utmpdump .
И другие журналы
Так как операционная система, даже такая замечательная как Linux, сама по себе никакой ощутимой пользы не несет в себе, то скорее всего на сервере или рабочей станции будет крутится база данных, веб сервер, разнообразные приложения. Каждое приложения или служба может иметь свой собственный файл или каталог журналов событий и ошибок. Всех их естественно невозможно перечислить, лишь некоторые.
В домашнем каталоге пользователя могут находится журналы графических приложений, DE.
- ~/.xsession-errors — Вывод stderr графических приложений X11.
Чем просматривать — lnav
Недавно я обнаружил еще одну годную и многообещающую, но слегка еще сыроватую, утилиту — lnav, в расшифровке Log File Navigator.
Установка пакета как обычно одной командой.
Навигатор журналов lnav понимает ряд форматов файлов.
- Access_log веб сервера.
- CUPS page_log
- Syslog
- glog
- dpkg.log
- strace
- Произвольные записи с временными отметками
- gzip, bzip
- Журнал VMWare ESXi/vCenter
Что в данном случае означает понимание форматов файлов? Фокус в том, что lnav больше чем утилита для просмотра текстовых файлов. Программа умеет кое что еще. Можно открывать несколько файлов сразу и переключаться между ними.
Программа умеет напрямую открывать архивный файл.
Кроме этого поддерживается подсветка синтаксиса, дополнение по табу и разные полезности в статусной строке. К недостаткам можно отнести нестабильность поведения и зависания. Надеюсь lnav будет активно развиваться, очень полезная программа на мой взгляд.
Выбор софта
Зачем вообще нужен syslog-сервер, когда есть elastic beats, logstash, systemd-journal-remote и ещё много новых блестящих технологий?
Наблюдение: пользователи пытаются ввести номер карты в любое поле ввода на странице, и норовят сообщить его саппорту вместе с CVV.
Вот тут можно прочитать, что обо всём этом думает автор rsyslog Рейнер Герхард (Rainer Gerhards). Фактически, по-прежнему все реализуют syslog как попало, и задача интерпретировать всё это разнообразие ложиться на syslog-сервер. Например, в rsyslog включен специальный модуль для разбора формата, используемого CISCO IOS, ну и для самых плохих случаев начиная с пятой версии можно определять собственные парсеры.
Альтернатива протоколу syslog: RELP
Конфигурация rsyslog
В отличии от второй распространённой альтернативы, syslog-ng, rsyslog совместим с конфигами исторического syslogd:
Т. к. возможности rsyslog гораздо больше, чем у его предшественника, формат конфигов был расширен дополнительными директивами, начинающимися со знака $ :
Т. к. всё это делалось постепенно и с учётом совместимости со старыми конфигами, то в итоге получилась пара неприятных моментов:
- некоторые плагины (я пока с такими не сталкивался) могут не поддерживать новый RainerScript стиль настроек, им по-прежнему нужны старые директивы
- настройка через старые директивы не всегда работает как ожидается для нового формата:
- если модуль omfile вызывается с помощью старого формата:
auth,authpriv.* /var/log/auth.log , то владелец и разрешения получившегося файла регулируются старыми директивами $FileOwner , $FileGroup , $FileCreateMode . А вот если он вызывается с помощью action(type="omfile" . ) , то эти директивы игнорируются, и надо настраивать параметы action или задавать при загрузке модуля - Директивы вида $ActionQueueXXX настраивают только ту очередь, которая будет использована в первом action после них, потом значения сбрасываются.
Чтобы не спотыкаться об эти тонкости (да, в документации они описаны, но кто же её целиком читает?), стоит следовать простым правилам:
Подробнее про формат конфига здесь.
Примеры конфигурации
Проверка конфига: rsyslogd -N 1 . Больше примеров конфигурации: examples.
Конфигурационный файл syslog.conf
Файл syslog.conf является главным конфигурационным файлом для демона syslogd. Конфигурационный файл syslog.conf представляет собой набор правил. Каждое правило есть – строка, состоящая из селектора и действия, разделенных пробелом или табуляцией. Селектор представляет собой запись в виде источник.приоритет. (источник иногда именуют – категорией) Селектор может состоять из нескольких записей источник.приоритет, разделенных символом “;” . Можно указывать несколько источников в одном селекторе (через запятую). Поле действие – устанавливает журналируемое действие для селектора.
Источник (он же категория) может быть следующим:
Обычный файл
Задается полным путем, начиная со слеша (/). Поставьте перед ним дефис (-), чтобы отменить синхронизацию файла после каждой записи. Это может привести к потере информации, но повысить производительность.
Терминал и консоль
Терминал, такой как /dev/console.
Удаленная машина
Список пользователей
Пример несложного syslog.conf:
Как и во многих конфигурационных файлах, синтаксис следующий:
В синтаксисе конфигурационного файла можно поставить перед приоритетом знак !, чтобы показать, что действие не должно применяться, начиная с этого уровня и выше. Подобным образом, перед приоритетом можно поставить знак =, чтобы показать, что правило применяется только к этому уровню, или !=, чтобы показать, что правило применяется ко всем уровням, кроме этого. Ниже показано несколько примеров (man syslog.conf можно найти множество других примеров):
Сервер
Загрузим нужные модули и выключим $EscapeControlCharactersOnReceive , иначе в принятых логах все переводы строки заменятся на \n
Если персылка логов по сети или запись в базу была неуспешной, Action приостанавливается. rsyslog пытается возобновить работу Action через определённые, увеличивающиеся с каждой попыткой интервалы времени. Чтобы логи начали пересылаться вскоре после решения проблем, надо выставить action.resumeRetryCount="-1" (неограниченный) и интервал для остановки очереди поменьше: action.resumeInterval="10" . Подробнее про параметры Actions.
RuleSet на клиенте с очередью будет выглядеть так:
Логи, которые пишет сам rsyslog
Нормально ротируются с использованием схемы по-умолчанию: smth.log переименовывается в smth.log.1 , создаётся новый smth.log . В post-rotate action нужно послать SIGHUP процессу rsyslogd. Замечание: rsyslog не перезагружает конфигурацию при получении SIGHUP, только переоткрывает все лог-файлы.
Клиент: пересылка логов с сохранением имени файла
Теперь создадим RuleSet, который будут использоваться для передачи логов по сети. Его можно будет присоединять к Input, читающим файлы, или вызывать как функцию. Да, rsyslog позволяет вызвать один RuleSet из другого. Для использования RELP надо сначала загрузить соответствующий модуль.
Теперь создадим Input, читающий лог-файл, и присоединим к нему этот RuleSet.
Стоит обратить внимание, что для каждого считываемого файла rsyslog создаёт state-файлы в своём рабочем каталоге (задаётся директивой $WorkDirectory ). Если rsyslog не может создавать там файлы, то весь лог-файл будет заново передаваться после перезапуска rsyslog.
В случае, если какое-то приложение пишет в общий syslog с определённым тегом, и мы хотим как сохранять это в файл, так и пересылать по сети:
Чтение лог-файлов, заданных через wildcard
Программист: Не могу найти на лог-сервере логи somevendor.log за начало прошлого месяца, посмотри плиз.
Девопс: Эээ… а мы разве пишем такие логи? Предупреждать же надо. Ну в любом случае всё старше недели логротейт потёр, если мы его не сохраняли — значит уже нету.
Программист: бурно возмущаетсяВайлдкарды поддерживаются только в режиме работы imfile inotify (это режим по-умолчанию). Начиная с верcии 8.25.0, вайлдкарды поддерживаются как в имени файла, так и пути: /var/log//.log.
Запуск демона syslogd
Запуск демона протоколирования запускаются на этапе инициализации системы посредством скрипта /etc/rc.d/init.d/syslog, однако для того, чтобы задать параметры запуска, нет необходимости корректировать этот скрипт – начиная с версии 7.2, опции запуска считываются из отдельного конфигурационного файла /etc/sysconfig/syslog (/etc/default/syslog в debian).
Вот некоторые возможные параметры запуска демона syslogd:
После запуска демона syslogd создается файл статуса /var/lock/subsys/syslog нулевой длины, и файл с идентификационным номером процесса /var/run/syslogd.pid.
С помощью команды
kill -SIGNAL `cat /var/run/syslogd.pid`можно послать демону syslogd один из следующих сигналов: SIGHUP – перезапуск демона; SIGTERM – завершение работы; SIGUSR1 – включить/выключить режим отладки.
Вообще-то в системе запускаются два демона протоколирования – syslogd и klogd. Оба демона входят в состав пакета sysklogd.
Автоматическая ротация (обновление заполненных файлов) и архивирование журналов
Со временем, файл журнала имеет свойство увеличиваться, особенно при интенсивной работе какого-либо сервиса. Соответственно, необходимо иметь возможность контролировать размер журналов. Это делается при помощи команды logrotate, которая обычно выполняется демоном cron. О работе cron я расскажу в следующих статьях. Главная цель команды logrotate состоит в том, чтобы периодически создавать резервные копии журналов и создавать новые чистые журналы. Сохраняется несколько поколений журналов и, когда завершается срок жизни журнала последнего поколения, он может быть заархивирован (сжат). Результат может быть отправлен по почте, например, ответственному за ведение архивов.
Для определения порядка ротации и архивирования журналов используется конфигурационный файл /etc/logrotate.conf. Для разных журналов можно задать разную периодичность, например, ежедневно, еженедельно или ежемесячно, кроме того, можно регулировать количество накапливаемых поколений, а также указать, будут ли копии архивов отправляться ответственному за ведение архивов и, если будут, когда. Ниже показан пример файла /etc/logrotate.conf:
Глобальные опции размещаются в начале файла logrotate.conf. Они используются по умолчанию, если где-то в другом месте не задано ничего более определенного. В примере ротация журналов происходит еженедельно и резервные копии сохраняются в течение четырех недель. Как только производится ротация журнала, на месте старого журнала автоматически создается новый. Файл logrotate.conf может содержать спецификации из других файлов. Так, в него включаются все файлы из каталога /etc/logrotate.d.
В этом примере по достижении резервной копией последнего поколения она удаляется, поскольку не определено, что следует с ней делать.
Резервные копии журналов могут также создаваться, когда журналы достигают определенного размера, и могут быть созданы скрипты из наборов команд для выполнения до или после операции резервного копирования. Пример:
В этом примере ротация /var/log/messages производится по достижении им размера 100 КБ. Накапливается пять резервных копий, и когда истекает срок жизни самой старой резервной копии, она отсылается по почте на адрес logadmin@sysloger. Командное слово postrotate включает скрипт, перезапускающий демон syslogd после завершения ротации путем отправки сигнала HUP. Командное слово endscript необходимо для завершения скрипта, а также в случае, если имеется скрипт prerotate. Более полную информацию см. в страницах руководства man для logrotate.
Параметры, задаваемые в конфигурационном файле logrotate.conf:
Читайте также:
- если модуль omfile вызывается с помощью старого формата: