|
Bog BOS: syslog - сетевой системный журнал
|
Последнее изменение файла: 2024.11.22
Скопировано с www.bog.pp.ru: 2024.11.23
Bog BOS: syslog - сетевой системный журнал
Протокол syslog и программные средства поддержки обеспечивают
запись информации о событиях в системный журнал (журналы, системную консоль),
а также передачу их на сервер журнализации по сети,
сортировку и обработку в зависимости от источника и важности сообщений.
В статье описывается протокол syslog, его реализация в Solaris и Linux
(syslogd), Cisco IOS, а также вспомогательные средства: logrotate, logwatch.
Первый стандарт (RFC 3164) был сформулирован через 10 лет практического использования.
Оглавление:
Компонентами системы являются генератор сообщений
(устройство или процесс, device), протокол обмена, коллектор сообщений (collector, syslog server),
релей (relay, принимает сообщения от одного или нескольких генераторов и
передает одному или нескольким коллекторам или следующим релеям).
Генератор (или релей при передаче) не знает является
ли приемник релеем или коллектором, может передавать одно сообщение
нескольким приемникам, может обрабатывать сообщение самостоятельно
(например, записывая в файл).
Протокол syslog (RFC 3164) не содержит никаких средств защиты от подделок
сообщений. Хуже того, использование протокола UDP позволяет злоумышленникам
посылать сообщения от имени любого хоста. Локальная сеть должна быть
защищена экраном (IOS ACL,
iptables) от приема пакетов с поддельными
локальными адресами (хотя это не помешает посылать поддельные сообщения
изнутри локальной сети) и от приема пакетов снаружи на порт 514/udp.
Известны случаи переполнения диска ложными сообщениями.
Протокол syslog и UDP не обеспечивают гарантированной
доставки (сообщения могут быть потеряны при перегрузке сети или перехвачены,
поврежденные сообщения удаляются без предупреждения),
правильной последовательности доставки (сообщение о завершении процесса может
прийти раньше сообщения о его запуске), приоритетной доставки.
Конфиденциальность сообщений не обеспечивается, так как
они передаются открытым текстом.
Если при настройке генератора сообщений
указать неправильный адрес коллектора или релея, то никаких сообщений об ошибке
не будет - сообщения будут удаляться (или записываться в чужой журнал ;).
Средства защиты от зацикливания передачи сообщений
неправильно настроенными релеями не предусмотрены.
RFC 3195 (2001 год) предлагает новый протокол над TCP (порт 601 - syslog-conn),
обеспечивающий гарантированную доставку в правильной последовательности.
Чудовищная смесь XML, команд и кодов возврата в стиле SMTP
и заголовков MIME (BEEP), в которую заворачиваются сообщения стандартного
формата syslog. Используется два режима - RAW (аналог нынешнего UDP протокола)
и COOKED (сообщения структурированы по полям). BEEP позволяет обеспечить
аутентификацию, целостность и конфиденциальность (SASL, TLS).
Проект RFC syslog-sign предлагает обеспечить аутентификацию,
упорядоченность, целостность сообщений и обнаружение пропавших сообщений
за счет генерации специальных сообщений, содержащих цифровую подпись
(signature) блока предыдущих сообщений с сохранением стандартного протокола
и формата syslog и использованием UDP. Используется SHA1, OpenPGP DSA.
В 2009 году вышел RFC 5424 (The Syslog Protocol, UTF-8, структурированные данные, время) и его дополнения:
- RFC 5425 (использование TLS, TCP/6514)
- RFC 5426 (использование UDP, UDP/514)
- RFC 5427 (кодировка источника и важности в формате MIB)
В том же 2009 году вышли RFC, привязывающие syslog к SNMP:
- RFC 5674 (Alarms in Syslog)
- RFC 5675 (Mapping SNMP Notifications to SYSLOG Messages)
- RFC 5676 (Definitions of Managed Objects for Mapping SYSLOG Messages to SNMP Notifications)
В 2010 вышли RFC, усиливающие безопасность передачи:
- RFC 5848 (Signed Syslog Messages); цифровая подпись, упорядоченность, обнаружение пропавших сообщений
- RFC 6012 (Datagram Transport Layer Security (DTLS) Transport Mapping for Syslog)
В 2012 отчаявшись перевести всех на RFC 5424/RFC 5425 была описана сложившаяся практика использования TCP без TLS в виде RFC 6587.
Для приема сообщений используется порт 514/UDP.
Рекомендуется также использовать исходный порт 514 для передачи сообщений.
Сообщение представляет собой текстовую строку и не может иметь длину более
1024 байт, в противном случае его разрешается обрезать или даже выбрасывать.
Даже неправильно сформированное сообщение, посланное на 514 порт,
должно рассматриваться как сообщение syslog. Однако, если релей передает
сообщение дальше, то он должен добавить к нему стандартные заголовки (при этом,
возможно обрезав его до 1024 байт) - USER, NOTICE, свое локальное время и
простое имя источника сообщения.
Сообщение начинается с поля PRI, которое в закодированном виде
содержит информацию об источнике сообщения (facility) и уровне серьезности (Severity level)
сообщения. Сразу за ним идёт заголовок (HEADER), содержащий время (TIMESTAMP), пробел, имя или IP
адрес хоста в десятичной записи (HOSTNAME). За заголовком идёт пробел и тело сообщения (MSG),
произвольный текст в US-ASCII (0x20 - 0x7e).
Источник сообщения кодируется числом
от 0 до 23:
- 0 - KERN (сообщения ядра)
- 1 - USER (сообщения пользовательских программ)
- 2 - MAIL (почтовая система)
- 3 - DAEMON (прочие демоны)
- 4 - AUTH (безопасность/права доступа)
- 5 - SYSLOG (генерируемые самим syslog)
- 6 - LPR (подсистема печати)
- 7 - NEWS (Netnews, USENET)
- 8 - UUCP
- 9 - CRON (clock daemon)
- 10 - AUTHPRIV (безопасность/права доступа - защищенный режим)
- 11 - FTP
- 12 - NTP (существует не везде)
- 13 - security, log audit (существует не везде)
- 14 - console, log alert (существует не везде)
- 15 - solaris-cron, clock daemon (существует не везде)
- с 16 по 23 зарезервированы для локального использования (LOCAL0 - LOCAL7)
Уровень серьезности кодируется числом
от 0 до 7:
- 0 - EMERG (система неработоспособна, старое название PANIC)
- 1 - ALERT (требуется немедленное вмешательство)
- 2 - CRIT (критическое состояние)
- 3 - ERR (ошибка, старое название ERROR)
- 4 - WARNING (предупреждение, старое название WARN)
- 5 - NOTICE (все нормально, но важно)
- 6 - INFO (информационное сообщение)
- 7 - DEBUG (отладочная печать)
Номер источника умножается на 8 и складывается с
уровнем серьезности, получившееся число в ASCII заключается в угловые скобки и
образует поле PRI.
Время (местное!) записывается в формате: Feb 13 21:12:06.
Если номер дня является однозначным числом, то перед ним ставится
дополнительный пробел (не 0!). Заметьте отсутствие года и зоны в дате, что
необходимо учесть при долговременном хранении. Для того, чтобы время
в сообщении было правильным, устройство должно быть синхронизовано
(например, по NTP).
Имя хоста (простое по STD 13 (RFC 1034 и RFC 1035), не FQDN!) записывается так, как оно
известно генератору сообщения. Если устройство имеет несколько интерфейсов
с различными IP-адресами, то в качестве имени или адреса хоста может быть
использовано любое из них.
Текст сообщения (MSG) обычно содержит этикетку (TAG), указывающую
на программу или процесс, выдавшую это сообщение и тело сообщения (CONTENT) в ASCII-7.
Этикетка может содержать латинские буквы и цифры. Начало тела сообщения
определяется по первому специальному символу - обычно двоеточие или
открывающая квадратная скобка. Например, Cisco IOS в качестве этикетки
использует последовательный номер сообщения и двоеточие, а Unix - простое
имя программы (тело сообщения начинается с номера процесса в квадратных
скобках и двоеточия).
Релей не должен прверять достоверность заголовка (время и хост).
Релей должен добавлять отметку времени и имя хоста в пересылаемое сообщение, если не обнаружил отметку времени.
Релей должен добавлять PRI равный 13 и заголовок в пересылаемое сообщение, если не обнаружил PRI во входящем сообщении.2
Год рекомендуется заносить в содержимое сообщения.
FQDN и IP рекомендуется заносить в содержимое сообщения.
RFC 3195 использует ту же архитектуру, что и RFC 3164 (источники, релеи, коллекторы)
и фреймворк протоколов BEEP (Blocks Extensible Exchange Protocol) для описания асинхронных соединений (TCP/601, syslog-conn), профили:
- RAW - аналог UDP протокола из RFC 3164, упорядоченная надёжная поставка в рамках каждого канала, MIME Content-Type типа application/octet-stream;
слушатель ждёт соединения, инициатор открывает соединение, слушатель сообщает о готовности ("RPY 0 0 . 0 201")
и ожидаемом формате (текст в XML), инициатор сообщает о готовности и используемом формате (MIME+XML, затем пронумерованные
сообщения в формате похожем на RFC 3164, но не совсем ;) - многострочность, "END"
- COOKED - MIME Content-Type типа application/beep+xml;
представление источника (iam: тип - device, relay или collector; FQDN имя; IP адрес) с подтверждением;
структурированные сообщения (entry: facility, severity, timestamp, hostname, tag, deviceFQDN, deviceIP) с подтверждением,
маршрут прохождения сообщения (path: fromFQDN, fromIP, toFQDN, toIP, pathID, linkprops (сильная и слабая приватность, пользователь
аутентифицирован с помощью SASL или TLS, использован слой аутентификации, защита от повторных сообщений, защита от модификации,
защита от потери)) позволяет отлавливать циклы
Возможно использование алгоритма DNS SRV для автоматического получения адреса коллектора (сервис syslog, протокол tcp).
RFC 5424 замещает RFC 3164. Отдельно описывает формат сообщений, отдельно - механизм транспортировки.
Стандарт поделён на слои:
- содержимое сообщения
- транспортировка сообщений
- приложения: создание, интерпретация, маршрутизация, хранение
В дополнение к генератору сообщений (originator), коллектору (collector) и релею (relay)
определяются транспортный отправитель (transport sender) и транспортный получатель (transport receiver),
которые передают (получают) сообщения в транспортный протокол.
Подтверждения не предусмотрены, исчезновения сообщения никто не заметит.
Защиты от повторного проигрывания не предусмотрена.
Защита цельности сообщений не предусмотрена, всё на откуп транспортому механизму.
Защита приватности не предусмотрена, всё на откуп транспортому механизму.
Защита от ошибок настройки, в частности, от циклов маршрутизации не предусмотрена.
Сообщение состоит из заголовка (HEADER), пробела, структурированных данных, пробела и тела сообщения (MSG).
Максимальная длина определяется транспортным механизмом, но не менее 480 октетов.
Слишком длинные сообщения обрезаются или отбрасываются.
Заголовок состоит из
- поля PRI (см. RFC 3164); RFC 5427 определяет MIB модуль для Facility и Severity (syslogTCMIB как { mib-2 173 })
- версии (до 3 цифр), "1" для RFC 5424
- пробела
- отметки времени (TIMESTAMP)
- пробела
- имени хоста генератора сообщения (HOSTNAME, FQDN, строка US-ASCII или "-"), может содержать IP адрес, простое имя
- пробела
- имени приложения или устройства (APP-NAME - строка US-ASCII или "-")
- пробела
- идентификатор процесса (PROCID - строка US-ASCII или "-"), позволяет отслеживать перезапуски приложения
- пробела
- идентификатора типа сообщения (MSGID - строка US-ASCII или "-")
Отметка времени - "-" или "ГОД-МЕСЯЦ-ДЕНЬ"||"T"||"ЧАС:МИНУТА:СЕКУНДА"||"."||"МИКРОСЕКУНД"||"СМЕЩЕНИЕ"
(где ГОД - 4 цифры, МЕСЯЦ - 2 цифры, ДЕНЬ - 2 цифры, микросекунды - до 6 цифр - опциональны, СМЕЩЕНИЕ - "Z" (UTC) или "{+|-}ЧАСОВ:МИНУТ").
Стуктурированные данные - "-" или последовательность SD элементов (без пробелов!), где SD элемент - это '[ИМЯ-SD ИМЯ-ПАРАМЕТРА="ЗНАЧЕНИЕ" ...]',
где ЗНАЧЕНИЕ - это строка UTF-8. SD делятся на
- пользовательские содержат "@" в имени
- предопределённые
- timeQuality - параметры
- tzKnown="1"
- isSynced="1"
- syncAccuracy="микросекунд"
- origin (источник сообщения) - параметры
- ip (возможен список)
- enterpriseId (SMI Network Management Private Enterprise Code - iso.org.dod.internet.private.enterprise
- software (требуется enterpriseId)
- swVersion
- meta
- sequenceId - последовательный номер
- sysUpTime (см. RFC 3418)
- language (см. RFC 4646, BCP 47)
Тело сообщения - BOM (0xEFBBBF) и строка UTF-8 или произвольная последовательность октетов (байт).
Транспортные протоколы описываются отдельными RFC:
- RFC 5425 - TLS 1.2 (RFC 5246) с TLS_RSA_WITH_AES_128_CBC_SHA, по умолчанию, порт TCP/6514 (syslog-tls);
для взаимной аутентификации могут использоваться сертификаты (RFC 5280): проверка цепочки сертификатов (PKI) или проверка отпечатка (fingerprints,
что сводит шифрование к ситуации "с известным ключом");
сообщение получается из сообщения RFC 5424 добавлением в начало длины (строка) и пробела;
транспорт TLS обеспечивает приватность и достоверность данных;
подтверждений и полной упорядоченности не обеспечивается
- RFC 5426 - UDP, привычный по RFC 3164, порт UDP/514;
каждое сообщение в отдельном пакете и ничего более; приёмник должен принимать сообщения длиной 480 октетов для IPv4;
отправителю не рекомендуется создавать пакеты более 576 октетов;
не разрешается отключать создание контролльных сумм;
подтверждений нет, приватность, достоверность, упорядоченность не обеспечиваются;
- RFC 6587 - TCP, по традиции используется порт TCP/514, хотя официально он используется для других целей!;
десятилетия, потраченные на попытки стандартизовать syslog, были потрачены зря!
люди продолжают пользоваться стихийно сложишимся протоколом, описанным в RFC 3164, просто заворачивая его в TCP;
но ничего! мы их железной рукой...;
устройства (генераторы сообщений) делятся на устаревшие (legacy) и соответствующие стандарту (RFC 5424, standardized);
подтверждений нет; приватность, достоверность, упорядоченность не обеспечиваются, кроме как средствами TCP;
кодировка US-ASCII с использованием NVT (Network Virtual Terminal, RFC 5198),
но коллектор д.б. готов принять сообщения в различной кодировке от одного и того же релея;
TCP приёмник слушает порт, TCP отправитель начинает сессию, TCP приёмник не посылает данные, в случае проблем просто закрывает соединение;
TCP отправитель посылает поток сообщений по одному в TCP кадре одним из способов (можно отличить по первому символу - цифра или "<"):
- Octet Counting - сообщение получается из сообщения RFC 5424 добавлением в начало длины (строка) и пробела
- Non-Transparent-Framing - сообщение помещается в TCP кадр и завершается символом LF (или NUL, или CRLF)
- RFC 6012 - DTLS (Datagram Transport Layer Security, RFC 4347, TLS_RSA_WITH_AES_128_CBC_SHA) поверх UDP (нет защиты от потерь, UDP/6514) или DCCP (RFC 4340);
приватность и достоверность данных, взаимная аутентификация, защита от повторногой посылки;
сообщение получается из сообщения RFC 5424 добавлением в начало длины (строка) и пробела;
сообщения могут разбиваться на кадры или сливаться в один кадр
RFC 5848 (syslog-sign) описывает возможность обеспечить аутентификацию, неизменяемость, устойвость к повторным передачам,
упорядоченность и обнаружение пропавших сообщений за счёт посылки подписантом (signer) выделенных сообщений, содержащих блок подписи (Signature Block)
для ранее посланных сообщений (Signature Group). Подписант может совпадать или не совпадать с генератором (отправителем) сообщений.
Подписантов может быть много. Дополнительно посылается блок с сертификатами (Certificate Blocks), позволяющими проверить подписи.
Используется механизм структурированных данных (элементы ssign и ssign-cert).
syslogd осуществляет прием сообщений с порта 514/UDP
и от местных источников (сокет /dev/log),
их маршрутизацию в зависимости от источника сообщений и уровня серьезности.
Позволяет выводить сообщения в журнал, выводить на консоль,
на терминал, посылать на другой сервер.
Вводится дополнительный тип источника MARK (регулярные отметки, info)
Каждая строка журнала содержит запись одного сообщения,
состоящую из полей, разделенных пробелами:
- дата в стандартном текстовом формате (поле TIMESTAMP из сообщения syslog)
- имя хоста (fqdn или сокращенное, поле HOSTNAME из сообщения syslog)
- текст сообщения (поля TAG и CONTENT из сообщения syslog)
Параметры запуска:
- -a дополнительный-прослушиваемый-сокет
(полезен для демонов, делающих chroot; может быть несколько; до 19)
- -d (отладочный режим)
- -f имя-конфигурационного-файла (по
умолчанию, /etc/syslog.conf)
- -h (изменить обычное поведение, при котором сообщения, принятые от
удаленных хостов, не передаются дальше для записи на удаленном хосте
во избежание зацикливания)
- -l список-хостов (список хостов, имена которых должны
записываться в простом виде, а не FQDN; разделяются двоеточием)
- -m минут (интервал для регулярных временных записей; по
умолчанию - 20; если 0, то не делать вообще)
- -n (не уходить в фоновый режим; необходим для запуска из init)
- -p прослушиваемый-сокет (по умолчанию: /dev/log)
- -r (разрешить принимать сообщения от
удаленных хостов; firewall д.б. приоткрыт; в /etc/services д.б.
определен syslog для 514/udp)
- -s список-доменов (обрезать из имен хостов имена указанных
доменов; разделяются двоеточием; по умолчанию обрезается домен, совпадающий
с доменом сервера syslog)
- -v (показать версию и закончить работу)
- -x (запретить определять имя хоста по его адресу, предотвращает
deadlock при работе на одном хосте с сервером DNS)
Используемые файлы:
- /etc/syslog.conf - конфигурационный файл (изменяется при запуске
параметром -f)
- /dev/log - сокет, с которого читаются локальные сообщения
(изменяется при запуске параметром -p)
- /var/run/syslogd.pid - идентификатор процесса
Реакция на сигналы:
- SIGHUP - реинициализация (закрывает все файлы, читает заново файл
конфигурации)
- SIGTERM - завершение работы
- SIGINT, SIGQUIT - завершение работы, если выключена отладка
- SIGUSR1 - включить/выключить отладку (только при использовании ключа -d)
Запускается с правами root.
Не меняет права доступа к файлам. Если вынужден
создавать файл, то делает его с правами 644. При необходимости
ограничить доступ к журналу, соответствующий файл надо создать
вручную (или поменять права доступа). Особые проблемы создает logrotate.
Представляет собой набор правил маршрутизации сообщений.
Комментарии начинаются с символа '#'. Обратная косая черта в конце строки
означает продолжение правила на следующей строке.
Каждое правило состоит из селектора и действия, которые разделяются
табуляциями (в старых системах - Solaris 5) или пробелами (Linux).
Получив сообщение для записи в журнал (от klogd, от локальной или удаленной
программы), syslogd для каждого правила проверяет не подходит ли
сообщение под шаблон, определяемый селектором. Если подходит, то
выполняется указанное в правиле действие.
Для одного сообщения м.б. выполнено произвольное количество действий
(т.е. обработка сообщения не прекращается при первом успехе).
Селектор состоит из двух частей, разделенных точкой:
источник сообщения и уровень серьезности.
Прописные и строчные буквы не различаются.
Можно также использовать числа (см. /usr/include/syslog.h).
Кроме определенных в syslog(3) источников, можно указывать mark
(регулярные временные метки), security
(устаревший синоним для auth).
Кроме определенных в syslog.h уровней серьезности можно
использовать warn (синоним для warning), error
(синоним для err), panic (синоним для emerg).
Сообщения с уровнем, равным или выше указанного в селекторе,
и источником, равным указанному в селекторе, считается подходящим.
Звездочка перед точкой соответствует любому источнику
(кроме daemon и syslog!),
после точки - любому уровню.
Слово none после точки - никакому уровню для данного источника.
Можно указывать несколько источников в одном селекторе (через запятую).
В этом случае приоритет можно указывать только для последнего источника.
В одной строке можно указывать несколько селекторов через ';'.
Семантика не ясна: если использовать
позитивные селекторы, то выполняется логическое ИЛИ,
если негативные (none и восклицательный знак), то логическое
И.
В новом syslogd (linux)
перед уровнем можно поставить знак равенства - селектору будут
соответствовать только сообщения с указанным уровнем (но не с высшим);
восклицательный знак - не будут соответствовать сообщения с
уровнем равным или большим; восклицательный знак и равенство - не будут
соответствовать сообщения с уровнем, равным указанному.
В качестве действия можно указывать:
- имя обычного файла (полный путь от корня), минус
перед именем отключает синхронизацию записи (ускорение на порядок и более!)
- поименованные каналы - fifo (перед именем ставится
вертикальная черта), сам канал д.б. создан перед
запуском syslogd командой mkfifo
- терминал или консоль (/dev/console)
- @имя-хоста (передать сообщений для удаленной
журнализации)
- список пользователей (через запятую), на терминалы которых будет послано
сообщение
- звездочка для посылки сообщения на все терминалы (wall)
Включен в состав пакета sysklogd (RH 6.2: sysklogd-1.3.31-16,
RH 7.0: sysklogd-1.3.33-8, RH 7.2: sysklogd-1.4.1-4).
Также в этот пакет входит klogd.
Процедура запуска, остановки, перезапуска (syslogd и klogd):
/etc/rc.d/init.d/syslog (символьные ссылки на нее из директорий
/etc/rc.d/rc?.d/). Ключи запуска считывает из файла
/etc/sysconfig/syslog (начиная с RH 7.2).
Статус определяется по наличию файла /var/lock/subsys/syslog.
Номер процесса хранится в /var/run/syslogd.pid.
При разборе файла конфигурации syslogd сравнивает адрес
loghost (определяется в /etc/hosts, не через DNS) с адресом своего
компьютера и при совпадении определяет переменную LOGHOST.
После этого syslog.conf пропускается через макропроцесссор m4(1).
В основном, это используется для того, чтобы один и тот же
конфигурационный файл можно было использовать на
клиентских и серверном (с точки зрения syslog) хостах.
Процедура запуска и остановки:
/etc/init.d/syslog (ссылки на нее из директорий
/etc/rc?.d). Номер процесса хранится в /etc/syslog.pid.
Использование syslog в Cisco IOS.
klogd читает сообщения ядра (либо через /proc/kmsg, либо с
помощью системных вызовов), определяет уровень,
преобразует адреса команд в имена программ и передает сообщение syslogd.
Параметры запуска:
- -c уровень (сообщения данного уровня и менее серьезные будут
передаваться syslog, а более серьезные -
выводиться на консоль; по умолчанию - 7; 0 указывать нельзя)
- -d (отладочный режим)
- -f имя-файла (журнализовать в указанный файл вместо syslog)
- -i (перезагрузить символы модулей в уже работающем klogd,
необходимо использовать при каждой загрузке или выгрузке модуля;
надеюсь, что текущие версии insmod, rmmod и modprobe делают это
самостоятельно)
- -I (перезагрузить символы ядра и модулей в уже работающем klogd)
- -k имя-файла (использовать указанный файл как
таблицу символов ядра вместо /boot/System.map)
- -n (не уходить в фоновый режим; необходим для запуска из init)
- -o (одноразовый режим - журнализовать все сообщения,
скопившиеся в буфере ядра и завершить работу)
- -p (на всякий случай перезагружать таблицу символов модулей
в момент преобразования адресов - ядро может оказаться не в состоянии
сделать это)
- -s (использовать только системные вызовы и не
обращаться к /proc/kmsg для получения исходных сообщений)
- -v (показать версию и закончить работу)
- -x (не преобразовывать адреса в имена)
- -2 (сообщения аварийного завершения ядра - Oops! -выдаются дважды:
до преобразования адресов в имена - для ksymoops - и после)
Уровни сообщений ядра (определяется по цифре в угловых скобках и преобразуется
в уровень серьезности syslog, при выводе в файл не изменяется):
- KERN_EMERG - 0 (system is unusable)
- KERN_ALERT - 1 (action must be taken immediately)
- KERN_CRIT - 2 (critical conditions)
- KERN_ERR - 3 (error conditions)
- KERN_WARNING - 4 (warning conditions)
- KERN_NOTICE - 5 (normal but significant condition)
- KERN_INFO - 6 (informational)
- KERN_DEBUG - 7 (debug-level messages)
Реакция на сигналы:
- SIGINT, SIGKILL, SIGTERM and SIGHUP - завершение работы
- SIGTSTP - остановить журнализацию
- SIGCONT - возобновить, возможно выбрав другой
источник сообщений (/proc/kmsg или системные вызовы)
- SIGUSR1 - перезагрузить символы модулей
- SIGUSR2 - перезагрузить символы ядра и модулей
Номер процесса хранится в /var/run/klogd.pid.
Слит в sysklog. Заменён в rsyslog.
logger - запись сообщения в журнал из
командной строки (sh, bash и др.). Входит в состав пакета util-linux.
Параметры:
- [-i] (включать номер процесса в сообщение)
- [-s] (дублировать сообщение на stderr)
- [-f имя-файла] (сохранять сообщение в указанном файле)
- [-p facility.level] (по умолчанию: user.notice; kern преобразуется в user)
- [-t tag] (задать поле TAG)
- [-u socket] (записывать в указанный сокет, вместо
обращения к syslogd)
- текст сообщения
Инициализация записи в журнал: openlog - указывается
стандартный префикс, добавляемый ко всем последующим сообщениям (обычно имя
программы, номер процесса в квадратных скобках и
двоеточие); источник и опции. closelog -
завершить запись в журнал. syslog - запись в журнал
(указывается источник, уровень серьезности и формат строки как в printf).
logrotate (версия 3.2-1/3.3.2-1/3.5.9/3.6.9/3.7.1/3.8.6) -
борьба с растущими
журналами: ротация (создание версий), сжатие, удаление и отправка по почте.
Запускается ежедневно cron-ом (/etc/cron.daily/logrotate) и позволяет
обрабатывать журналы, если они превысили указанный размер или с указанным
временным интервалом. Позволяет обрабатывать не только журналы syslog, но
и любых других программ.
Параметры:
- -?
- --verbose (без этого ключа не выводятся сообщения об ошибках)
- -d (отладочный режим, реальных изменений не производится)
- -f (производить изменения,
даже если logrotate не видит необходимости -
используется при изменениях в списке обрабатываемых журналов)
- -s имя-файла-состояния (текущее состояние журналов
хранится в этом файле между
запусками, по умолчанию - /var/lib/logrotate.status или /var/lib/logrotate/logrotate.status)
- -m имя-почтовой-программы ("/bin/mail -s"; на вход
ей подаётся текст письма, первый параметр - тема письма, второй -
получатель)
- имена-конфигурационных-файлов
(имена через пробел;
порядок имеет значение;
если указано имя каталога, то каждый файл в ней считается конфигурационным;
владельцем файла д.б. root
в RH используется файл /etc/logrotate.conf
и каталог /etc/logrotate.d)
Конфигурационный файл определяет глобальные параметры
(по одному на строке), задающие параметры по умолчанию для всех журналов.
Для каждой серии обрабатываемых журналов задаются локальные параметры:
указывается базовое имя файла, а затем в фигурных скобках локальные параметры
по одному на строке.
Имя файла может быть заключено в кавычки по правилам shell, если оно содержит
пробелы и другие специальные символы.
Можно указывать несколько имен файлов или шаблонов имен файлов через пробел
(шаблоны также по правилам shell).
Обработка каждой секции рассматривается как единое действие.
Строки, начинающиеся с символа "#" являются комментариями.
Параметры, указанные в следующем конфигурационном файле перекрывают
значение параметров, указанных в предыдущем файле. Локальные параметры имеют
приоритет над глобальными.
Порядок файлов в конфигурационной директории не определен.
Параметры:
- compress | nocompress (старые версии сжимаются или не сжимаются с помощью gzip)
- compresscmd (задает программу сжатия, по умолчанию - gzip)
- uncompresscmd (задает программу разжатия, по умолчанию - ungzip)
- compressext (задает суффикс для сжатых файлов, ".gz")
- compressoptions (задает параметры программы сжатия; по умолчанию - "-6", т.е. максимальное сжатие для gzip)
- copy | nocopy (копировать журнал не трогая исходный)
- copytruncate | nocopytruncate (обычно старая версия
переименовывается и создается новая версия журнала; при
задании этого параметра logrotate копирует журнал в новый файл, а затем
обрезает старый; используется,
если программа, создающая журнал, не умеет его закрывать; теряются записи,
сделанные в промежутке между копированием и обрезанием;
а поможет ли,
если создающая журнал программа вместо режима append просто
пишет в файл, используя внутренний указатель?)
- create [[права-доступа] владелец группа] | nocreate (сразу после
переименования старой версии журнала и до вызова postrotate
создается новый журнал с указанными атрибутами - права доступа
задаются в восьмеричном виде, как в chmod.2; если
атрибуты не указаны, то берутся от старого журнала)
- createolddir права-доступа владелец группа | nocreateolddir
- daily (смена версий в серии происходит ежедневно)
- delaycompress | nodelaycompress
(некоторые программы не сразу закрывают журнал, в этом случае сжатие надо
отложить до следующего цикла)
- dateext | nodateext (старые версии получают суффикс в виде "-YYYYMMDD" вместо номера)
- dateformat формат-суффикса (позволяет задать формат в стиле strftime(3),
но только %Y %m %d %H и %s; по умолчанию "-%Y%m%d" или "-%Y%m%d%H";
формат должен обеспечивать правильную сортировку файлов)
- dateyesterday (использовать вчерашнюю дату в dateext)
- errors email (кому направлять сообщения об ошибках; удалён в версии ?)
- extension суффикс (задается суффикс, добавляемый
к именам файлов при ротации перед суффиксом сжатия - mylog.1.foo.gz вместо mylog.foo.1.gz)
- hourly (ежечасно, подсистема cron daily к этому не готова)
- ifempty | notifempty (смена версий даже если файл пуст; действует по умолчанию)
- include имя-файла | имя-rfnfkjuf
(текстуально подставить файл или все файлы из указанного каталога; не
включаются подкаталоги, специальные файлы и файлы с суффиксами из списка
исключений tabooext; нельзя использовать внутри секции)
- mail адрес | nomail (когда смена версий приводит к необходимости удалить старый журнал, то послать его по указанному адресу)
- mailfirst (посылать не удаляемую версию журнала, а первую)
- maillast (посылать удаляемую версию журнала; действует по умолчанию)
- maxage дней (удалять файлы старше указанного)
- maxsize байт (смена версии происходит, если размер журнала
превысил указанное число или подошло время; можно использовать суффиксы "k" -
килобайт - и "M" - мегабайт)
- minsize байт (смена версии происходит, если размер журнала
превысил указанное число и подошло время; можно использовать суффиксы "k" -
килобайт - и "M" - мегабайт)
- missingok | nomissingok (не посылать сообщения об ошибке, если журнал отсутствует)
- monthly (смена версий происходит ежемесячно)
- olddir каталог | noolddir (во время смены версий журнал перемещается в указанный
каталог; д.б. на том же физическом устройстве, если не исполльзуется режимы copy, copytruncate или renamecopy)
- postrotate (все дальнейшие строчки до строки endscript
исполняются как команды shell после процесса смены версии; абсолютный путь к журналу передаётся как первый параметр скрипта)
- prerotate (все дальнейшие строчки до строки endscript
исполняются как команды shell перед процессом смены версии; абсолютный путь к журналу передаётся как первый параметр скрипта)
- firstaction (все дальнейшие строчки до строки endscript
исполняются как команды shell перед процессом смены версии первого файла в группе; шаблон группы файлов передаётся как первый параметр скрипта)
- lastaction (все дальнейшие строчки до строки endscript
исполняются как команды shell после процесса смены версии последнего файла в группе; шаблон группы файлов передаётся как первый параметр скрипта)
- preremove (все дальнейшие строчки до строки endscript
исполняются как команды shell перед удалением журнала; абсолютный путь к журналу передаётся как первый параметр скрипта)
- rotate число (сколько старых версий хранить; если 0, то ни одной)
- size байт (смена версии происходит, если размер журнала
превысил указанное число и наступило его время; можно использовать суффиксы "k" -
килобайт - и "M" - мегабайт)
- sharedscripts | nosharedscripts
(выполнять команды prerotate и postrotate только один раз для всех файлов, описанных в секции)
- shred | noshred (использовать для удаления файла утилиту shred вместо unlink)
- shredcycles число
- start число (начинать нумерацию поколений с указанного числа; количество версий отсчитывать от него же)
- su имя-пользователя группа (работать от имени указанного пользователя)
- tabooext [+] список-суффиксов (задание
списка суффиксов-исключений для include; если указан знак "плюс", то
дополнение, иначе замена; по умолчанию: .rpmorig, .rpmsave, .rpmnew, .disabled, .dpkg-old, .dpkg-dist, .dpkg-new, .cfsaved, .ucf-old, .ucf-dist, .ucf-new,
",v", .swp, .cfsaved, .rhn-cfg-tmp-* и "~")
- weekly [день] (смена версий происходит еженедельно; день 0 - воскресенье)
- yearly (смена версий происходит ежегодно)
В поставке RH /etc/logrotate.conf описывает глобальные
параметры и параметры для /var/log/wtmp и /var/log/lastlog и ссылается на
директорию /etc/logrotate.d, в которую каждый пакет записывает локальные
параметры для своих журналов.
Пример для центрального сервера syslog (текущий журнал в /var/log/syslog/current,
архив в /var/log/syslog/old):
/var/log/syslog/alltext {
create
daily
dateext
compress
compresscmd /usr/bin/xz
compressoptions "-T0"
compressext .xz
nodelaycompress
olddir /var/log/syslog/old
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
rotate 28
sharedscripts
}
/var/log/syslog/current/host/*.log {
weekly
dateext
compress
compresscmd /usr/bin/xz
compressoptions "-T0"
compressext .xz
nodelaycompress
olddir /var/log/syslog/old/host
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
rotate 4
sharedscripts
}
/var/log/syslog/current/*.log {
create
weekly
dateext
compress
compresscmd /usr/bin/xz
compressoptions "-T0"
compressext .xz
nodelaycompress
olddir /var/log/syslog/old/
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
rotate 4
sharedscripts
}
/var/log/syslog/current/backup/*.log {
weekly
dateext
compress
compresscmd /usr/bin/xz
compressoptions "-T0"
compressext .xz
nodelaycompress
olddir /var/log/syslog/old/backup
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
rotate 4
sharedscripts
}
...
logwatch представляет собой платформу (framework) для
написания программ (называемых фильтрами) извлечения полезной информации
из многочисленных, больших и разноформатных журналов (не только syslog)
и формирования отчётов с указанной детализацией за указанный период времени, посылаемых по email.
Фильтры могут быть написаны на любом языке программирования,
но автор пакета предпочитает perl 5.8 и новее. Фильтры должны быть написаны так,
что читают данные с stdin и выводят результат на stdout.
Перед вызовом фильтра устанавливаются переменные окружения:
LOGWATCH_DATE_RANGE, LOGWATCH_DETAIL_LEVEL, LOGWATCH_TEMP_DIR, LOGWATCH_DEBUG.
Основная программа также написана на perl:
/usr/share/logwatch/scripts/logwatch.pl (ранее - до версии 7 - /etc/log.d/scripts/logwatch.pl, /etc/log.d/logwatch и /usr/sbin/logwatch
и /etc/cron.daily/0logwatch (или /etc/cron.daily/00-logwatch) - это символьные ссылки на нее).
Каталог /usr/share/logwatch/default.conf/logfiles (ранее /etc/log.d/conf/logfiles/) содержит
конфигурационные файлы групп журналов, в которых хранятся записи обслуживаемых сервисов.
Каждая группа журналов описывается отдельным файлом имя-группы.conf, в котором задаются:
- LogFile = имя файла, содержащего журнал, или шаблон имен;
можно задавать несколько имен или шаблонов;
имена м.б. относительно LogDir
- Archive = имя файла, созданного logrotate архивной версии журнала, или шаблон имен;
можно задавать несколько имен или шаблонов; можно использовать суффиксы сжатых файлов;
имена м.б. относительно LogDir
- имена фильтров (только по одному разу, хотя в показано другое!)
из /usr/share/logwatch/scripts/shared/ в виде
*имя-фильтра = параметры, например, чтобы
отфильтровать журнал по дате, если она записана в стандартном формате
syslog, надо использовать строку:
*ApplyStdDate =
Каталог /usr/share/logwatch/dist.conf/logfiles/ содержит изменения настроек групп журналов для дистрибутива (пусто в RHEL7).
Каталог /etc/logwatch/conf/logfiles (ранее /etc/log.d/conf/logfiles/) содержит локальные изменения настроек групп журналов.
Каталог /usr/share/logwatch/default.conf/services/ (ранее /etc/log.d/conf/services/) содержит
конфигурационные файлы сервисов, чьи записи в журналах logwatch будет
обрабатывать. Каждый сервис описывается отдельным файлом
имя-сервиса.conf, в котором задаются:
- # комментарий
- LogFile = имя группы журналов
- имена фильтров из /usr/share/logwatch/scripts/shared/ в виде
*имя-фильтра = параметры, запускаемых до
фильтра сервиса
- $имя-переменной окружения = значение
- Detail=уровень
Каталог /usr/share/logwatch/dist.conf/services/ содержит изменения настроек сервисов для дистрибутива (пусто в RHEL7).
Каталог /etc/logwatch/conf/logfiles (ранее /etc/log.d/conf/logfiles/) содержит локальные изменения настроек сервисов.
Каталог /usr/share/logwatch/scripts/logfiles/ (ранее /etc/log.d/scripts/logfiles/) содержит
фильтры обработки групп журналов: при обработке группы журналов все файлы в
каталоге /usr/share/logwatch/scripts/logfiles/имя-группы
используются как фильтры.
Каталог /usr/share/logwatch/scripts/services/ содержит
фильтры обработки записей конкретных сервисов.
Каталог /usr/share/logwatch/scripts/shared/ содержит
общие фильтры, используемые в конфигурационных файлах групп журналов:
- applystddate - фильтрует журнал по требуемой дате, если он записан
в формате syslog (здесь и в приватных фильтрах по дате навставлять
LANG= перед вызовом date, а то Mar никак не совпадает с Мар ;)
- expandrepeat - превращает строки "last message repeated" в
соответствующее число строк с текстом сообщения из предыдущей
строки
- onlycontains - оставляет только те строки журнала, которые
содержат указанную строку (я поставил кавычки вокруг "$*")
- onlyservice - выделяет из журнала в формате syslog строки,
относящиеся к указанному сервису (имя сервиса передается как параметр)
- remove - оставляет только те строки журнала в формате syslog, которые
не содержат указанную строку (я поставил кавычки
вокруг "$*"
и наделал remove1, remove2 и т.д. так как не понял как указать
несколько подшаблонов для egrep в одной строке;
кстати, параметры подставляются в shell, так что спецсимволы
тоже нельзя использовать)
- removeheaders - удаление стандартных полей (дата, время, имя хоста,
этикетка сервиса и номер процесса)
- removeservice - выделяет из журнала в формате syslog строки, не
относящиеся к указанному сервису (имя сервиса передается как параметр)
Параметры по умолчанию хранятся в файле /usr/share/logwatch/default.conf/logwatch.conf (параметры от разработчика),
/usr/share/logwatch/dist.conf (параметры дистрибутива, пусто в RHEL) и /etc/logwatch/conf/logwatch.conf (локальные параметры,
ранее /etc/log.d/conf/logwatch.conf, /etc/log.d/logwatch.conf есть символьная ссылка на него):
- LogDir - каталог, относительно которого рассматриваются имена файлов
- MailTo - кому отправлять отчет
- Print - вместо посылки отчета по почте выдать его на stdout
- Save - вместо посылки отчета по почте сохранит его в указанном файле
- Archives - использовать версии журналов, созданных logrotate
- Range - рассматриваемый временной интервал: All, Today, Yesterday (вчерашние календарные сутки)
- Detail - уровень подробности отчета: от 0 до 10 или Low, Med, High
- Service - All или имя фильтра из /etc/log.d/scripts/services/ (можно указывать несколько фильтров)
- LogFile - All или имя группы журналов (можно указывать несколько групп)
В дополнение к logwatch.conf каждый из 3 каталогов содержит подкаталоги services и logfiles,
которые позволяют задать параметры для конкретных групп файлов (имя-группы-журналов.conf) и сервисов (имя-сервиса.conf), а также
ignore.conf (содержит регулярные выражения, описывающие строки, которые не должны появиться в отчётах) и override.conf.
Ключи запуска:
- ----help
- --detail уровень (уровень продробности отчета: high (10), med (5) или low (0))
- --logfile группа-журналов (обрабатывать только журналы
данной группы; группа задается символическим именем в конфигурационном
файле; можно задавать несколько групп)
- --service имя-сервиса (обрабатывать только те записи
в журналах, которые относятся к данному сервису; сервис задается
символическим именем в конфигурационном файле;
можно задавать несколько сервисов; имя All вызывает обработку
записей для всех сервисов)
- --output {stdout|mail|file} (по умолчанию, stdout)
- --format {text|html} (по умолчанию, text)
- --print (выдавать отчет на stdout; отсутствует с версии ?)
- --save имя-файла (записать отчет в указанный файл; отсутствует с версии ?)
- --mailto адрес (послать отчет по указанному адресу)
- --filename имя-файла (сохранить отчёт в файл)
- --range интервал-дат (обрабатывать только те записи
в журналах, которые относятся к данному интервалу времени, даты в формате Date::Manip (по умолчанию 'Yesterday'),
период задаёт размер интервала (по умолчанию 'for that day'):
Yesterday, Today, All, дата[ период],
between дата1 and дата2[ период], since дата[ период],
Help - рассказывает о синтаксисе)
- --archives (обрабатывать не только текущие версии журналов, но и созданные logrotate старые копии)
- --hostlimit имя-хоста[,...] (ограничиться информацией с указанных хостов)
- --hostname имя-хоста (указать имя хоста в журнале)
- --html_wrap число (число символов в строке для вывода в формате HTML)
- --numeric (не преобразовывать IP в доменные имена)
- --debug уровень (от 0 до 100)
- --logdir каталог
- --no-oldfiles-log (не информировать о старых дурналах во временном каталоге)
Основной способ использования состоит во включении
файла 00-logwatch или 0logwatch (начинается с "00", чтобы выполняться до logrotate)
в каталог /etc/cron.daily, что вызывает ежедневное выполнение
logwatch с параметрами по умолчанию.
К сожалению, все фильтры рассчитаны на то, что журналы
записываются на том же хосте, на котором работает сервис.
Все журналы ведутся на одном компьютере (если есть
параноидальные наклонности, то можно записывать журналы сразу на двух серверах).
Соответствие между формальным именем источника и реальным
устройством или программой:
- local0 - Cisco и прочие железки
- local1 - bind и DNS
- local3 - ftp/snort (есть специальное имя источника, но Solaris 2.5 его не знает)
- local4 - squid
- local5 - POP3/IMAP
- local6 - tac_plus
- local7 - загрузка Linux
На сервере должен быть открыт экран для порта 514/udp (можно ограничить
исходные адреса пакетов, но это поможет только от случайностей).
Запуск syslogd (параметры в /etc/rc.d/init.d/syslog или /etc/sysconfig/syslog)
должен быть с ключами "-r -m 0" (и еще "-x", если на этом же компьютере работает
сервер DNS). Запуск klogd с ключами "-2 -c 1". Настройка syslog.conf:
- *.crit - сообщения уровня серьезности CRIT и выше выдавать на терминалы
и записывать в отдельный файл (chmod 600), свои сообщения посылать
на запасной сервер; sendmail считает критическими сообщения о проблемах
с приемом письма
- kern - создать файл kern для сообщений всех уровней (chmod 600)
- mail - создать файл mail для сообщений всех уровней (без
синхронизации)
- auth, authpriv - создать файл secure для сообщений всех уровней (chmod
600)
- news - в директории news создать для каждого уровня серьезности отдельный
файл (debug без синхронизации)
- cron - создать файл cron для сообщений всех уровней (cron в RH 6.2
и Solaris 2.5 не умеют использовать syslog)
- local0 - в директории cisco создать для каждого уровня серьезности
отдельный файл (err и ниже без синхронизации)
- local1 - в директории bind создать для каждого уровня серьезности
отдельный файл (err и ниже без синхронизации)
- local3 - в директории ftp создать для каждого уровня серьезности
отдельный файл (info и debug без синхронизации)
- local5 - создать файл imap.log для сообщений всех уровней
- local6 - создать файл tac_plus.log для сообщений всех уровней
- local7 - файл boot.log (сообщения при загрузке системы и запуске или
остановке syslogd и klogd)
- все сообщения уровня INFO и выше, не попавшие в один из определенных
выше файлов, записывать в файл messages (chmod 600)
На клиентских компьютерах настраиваем syslog так, чтобы все
сообщения передавались на сервер syslog, сообщения об ошибках
дублировались в /var/log/syslog, сообщения о критическом состоянии
дублировались на консоль, терминалы пользователей.
На компьютерах с linux также сбрасывать в локальный файл сообщения о
загрузке (local7, boot.log). Запасной сервер syslog должен принимать
сообщения критического уровня из сети и записывать их в файл
(дырка в экране, ключ запуска "-r").
logrotate: хранить вечно, менять версии по возможности реже
(ежемесячно, кроме squid), сбрасывать в отдельные
директории (кроме squid) и сжимать (в
отложенном режиме, кроме ftpd, linuxconf, sendfax),
[ошибки и удаляемые файлы посылать мне]. Привести в
соответствие параметры для файла syslog.
Настроить /etc/logwatch/scripts и /usr/share/logwatch/.
Для сбора журналов в условиях systemd используется сервис systemd-journald, для просмотра и управления утилита journalctl.
systemd-journald собирает сообщения ядра (kmsg), сообщения syslog, структурированные сообщения journal (sd_journal_print.3),
сообщения сервисов (которые по умолчанию выводятся на stdout и stderr, настройки юнитов StandardOutput и StandardError), сообщения аудита ядра,
вывод команды с использованием systemd-cat. Не более 4096 источников одновременно.
Сообщения сервисов продолжают поступать в systemd-journald после "systemct restart" (дескрипторы файлов передаются), но прерывается после "systemctl stop".
Может копировать сообщения на syslog, kmsg, консоль и терминалы (wall).
Журналы хранятся постоянно в /var/log/journal/, если каталог существует во время загрузки
("mkdir -p /var/log/journal; systemd-tmpfiles --create --prefix /var/log/journal":
см. /usr/lib/tmpfiles.d/systemd.conf: chgrp systemd-journal /var/log/journal/; chmod o-rwx /var/log/journal; chmod g+s /var/log/journal, ...),
или временно до первой перезагрузки в /run/log/journal/идентификатор-сервера/system.journal (tmpfs), выбор настраивается в /etc/systemd/journald.conf.
Журналы ротируются, старые архивы удаляются.
Доступен на чтение пользователям группы systemd-journal, adm и wheel с помощью ACL, главный каталог имеет set-group-ID.
Для каждого зашедшего пользователя в /var/log/journal/ будет создан свой набор журналов (без права записи, право чтения также обеспечивается ACL).
Журналы хранятся в двоичном формате, с индексами по всем полям (увеличивает объём в 4 раза относительно простого сжатого текста),
возможно со сжатием (сжатие по полям, т.е. очень плохо - zstd жмёт пожатый .journal в 7.5 раз;
разработчики в курсе;
автор говорит, что сжатие также мешает использовать mmap;
положить несжатое на zfs (разногласие между представлением SystemMaxUse и MaxFileSize)?;
компактный (вдвое?) формат хранения в systemd 252 (SYSTEMD_JOURNAL_COMPACT, RHEL9);
xz или LZ4 (zstd в версии 246;
"journalctl --header | grep COMPRESS|uniq" выдаёт COMPRESSED-LZ4 на RHEL8 и COMPRESSED-XZ на RHEL7)) и защитой от модификации.
Место в файле выделяется большими кусками (8 MiB?) и хранится с дырками (sparse).
Имеются дополнительные форматы для экспорта ("journalctl -o export", текстовый, без индексов) и работы с JSON.
Настройки в /etc/systemd/journald.conf (/etc/systemd/journald.conf.d/*.conf,
/run/systemd/journald.conf.d/*.conf, /usr/lib/systemd/journald.conf.d/*.conf), какой файл прочитали последним
(в лексиграфическом порядке по именам файлов невзирая на имена каталогов), тот и прав.
Формат файла аналогичен systemd, все настройки в секции "[Journal]", умолчания закоментированы:
- Storage={volatile|persistent|auto|none} # volatile - хранить журналы в памяти (/run/log/journal),
persistent - хранить журналы в постоянном хранилище (/var/log/journal) с откатом в /run/log/journal при необходимости,
auto - в /var/log/journal при наличии, иначе в /run/log/journal, none - не хранить (но пересылать на консоль, kmsg и syslog)
- Compress={enabled|число} # сжимать, если размер объекта (сообщения? поля?) превышает указанное число (512)
- Seal={enabled|disable} # использовать FSS (Forward Secure Sealing) для обнаружения изменений
- SplitMode={uid|none} # разбивать постоянный (в /var/log/journal) журнал по пользователям,
чтобы можно было обеспечить авторизацию с помощью прав доступа к файлам
- RateLimitBurst=1000 # при превышении количества сообщений от службы (?) за RateLimitIntervalSec оставшиеся сообщения
игнорируются до конца интервала; может быть изменён в описании юнита
- RateLimitIntervalSec=30s
- SystemMaxUse=байт # 10%, но не более 4G; сколько места можно занять в /var/log/journal
- SystemKeepFree=байт # оставлять свободным 15%, но использовать не более 4G; сколько места нужно оставить свободным в файловой системе /var/log/journal;
при переходе границы запись останавливается, но старое содержимое не чистится
- SystemMaxFileSize=1/8-от-SystemMaxUse # максимальный размер отдельного файла журнала в /var/log/journal, но не более 128MiB при автоматическом вычислении;
в реальности около 100МБ невзирая на значение
- SystemMaxFiles=100 # при достижении указанного числа файлов журналов в /var/log/journal старые удалятся
- RuntimeMaxUse=байт # 10%, но не более 4G; сколько места можно занять в /run/log/journal
- RuntimeKeepFree=байт # оставлять свободным 15%, но использовать не более 4G; сколько места нужно оставить свободным в файловой системе /run/log/journal;
при переходе границы запись останавливается, но старое содержимое не чистится
- RuntimeMaxFileSize=1/8-от-RuntimeMaxUse # максимальный размер отдельного файла журнала в /run/log/journal, но не более 128MiB при автоматическом вычислении;
в реальности около 100МБ вместо 500MB;
- RuntimeMaxFiles=100 # при достижении указанного числа файлов журналов в /run/log/journal старые удалятся
- MaxFileSec=1month # максимальное время хранения записей в файле журнала до ротации
- MaxRetentionSec=0s # максимально время хранения записей в журналах
- SyncIntervalSec=5m # интервал синхронизации записи в файл; сообщения CRIT, ALERT и EMERG сбрасываются в файл немедленно
- MaxLevelStore=debug # максимальный уровень серьёзности (0 - EMERG, 7 - DEBUG) для записи в журнал
- ForwardToSyslog=no # пересылать полученное сообщение на syslog (сокет /run/systemd/journal/syslog);
rsyslog может читать журнал с помощью модуля imjournal
- MaxLevelSyslog=debug # максимальный уровень серьёзности (0 - EMERG, 7 - DEBUG) для пересылки на syslog
- ForwardToKMsg=no # пересылать полученное сообщение на kmsg
- MaxLevelKMsg=notice # максимальный уровень серьёзности (0 - EMERG, 7 - DEBUG) для пересылки на kmsg
- ForwardToConsole=no # пересылать полученное сообщение на консоль
- MaxLevelConsole=info # максимальный уровень серьёзности (0 - EMERG, 7 - DEBUG) для пересылки на консоль
- TTYPath=/dev/console # кого считать консолью
- ForwardToWall=yes # пересылать полученное сообщение на терминалы всем
- MaxLevelWall=emerg # максимальный уровень серьёзности (0 - EMERG, 7 - DEBUG) для пересылки на все терминалы
- ReadKMsg={enabled|disable} # читать сообщения с /dev/kmsg
- LineMax=48K # максимальная длина строки при получении сообщения из потока (stdout, stderr)
Параметры командной строки ядра:
- systemd.journald.max_level_store=уровень # приоритетнее MaxLevelStore
- systemd.journald.forward_to_syslog={disable|enable} # передача собираемых журналов в обычный syslog
- systemd.journald.max_level_syslog=уровень # приоритетнее MaxLevelSyslog
- systemd.journald.forward_to_kmsg={disable|enable} # передача собираемых журналов в журнал ядра
- systemd.journald.max_level_kmsg=уровень # приоритетнее MaxLevelKMsg
- systemd.journald.forward_to_console={disable|enable} # передача собираемых журналов на консоль
- systemd.journald.max_level_console=уровень # приоритетнее MaxLevelConsole
- systemd.journald.forward_to_wall={disable|enable} # передача собираемых журналов в сообщения на все терминалы (wall)
- systemd.journald.max_level_wall=уровень # приоритетнее MaxLevelWall
Обрабатываемые systemd-journald сигналы:
- SIGUSR1 (выдаётся "journalctl --flush") - данные из временного хранилища в /run переписываются в постоянное хранилище в /var/log/journal/
- SIGUSR2 (выдаётся "journalctl --rotate") - ротация журналов
- SIGRTMIN+1 (выдаётся "journalctl --sync") - синхронизация журнала на диск
Юниты systemd сервиса systemd-journald:
- systemd-journald.socket (чтение структурированных сообщений и stdout/stderr юнитов;
ListenStream=/run/systemd/journal/stdout, ListenDatagram=/run/systemd/journal/socket;
используется в sockets.target; игнорируется при изоляции)
- systemd-journald-dev-log.socket (чтение "обычных" сообщений syslog;
ListenDatagram=/run/systemd/journal/dev-log, он же /dev/log;
"обычный" syslog читает потом из файла журнала (imjournal в rsyslog);
используется в sockets.target; игнорируется при изоляции
- systemd-journald-audit.socket (чтение записей аудита через netlink - audit 1; используется в sockets.target)
- systemd-journald.service (используется в sysinit.target; требует systemd-journald.socket;
использует systemd-journald.socket и systemd-journald-dev-log.socket; kmsg?)
- systemd-journal-catalog-update.service (используется в sysinit.target; "journalctl --update-catalog")
- systemd-journal-flush.service (используется в sysinit.target; "journalctl --flush")
- syslog.socket (/run/systemd/journal/syslog; неиспользуемый атавизм?)
К каждому сообщению добавляются поля метаданных (могут включать двоичные данные, поле может встречаться несколько раз):
- пользовательские поля (не проверяются systemd-journald):
- MESSAGE (само сообщение)
- MESSAGE_ID (128-битный идентификатор)
- PRIORITY (приоритет от 0 до 7, уровень серьёзности)
- CODE_FILE (имя файла с исходным текстом)
- CODE_LINE (номер строки в файле с исходным текстом)
- CODE_FUNC (имя функции в файле с исходным текстом)
- ERRNO (код ошибки errno.3)
- SYSLOG_FACILITY (номер источника)
- SYSLOG_IDENTIFIER (имя процесса)
- SYSLOG_PID (идентификатор процесса)
- добавляемые systemd-journald поля (имена начинаются с '_'):
- _PID
- _UID
- _GID
- _COMM (имя программы)
- _EXE (имя исполнительного файла)
- _CMDLINE (командная строка)
- _CAP_EFFECTIVE (эффективные возможности)
- _AUDIT_SESSION (идентификатор сессии для процесса, вызвавшего сообщение аудита)
- _AUDIT_LOGINUID (идентификатор пользователя для процесса, вызвавшего сообщение аудита)
- _SYSTEMD_CGROUP (путь в иерархии systemd)
- _SYSTEMD_SLICE (имя контейнера юнитов - .slice)
- _SYSTEMD_UNIT (имя юнита)
- _SYSTEMD_USER_UNIT (имя юнита для менеджера пользователей)
- _SYSTEMD_SESSION (идентификатор сессии systemd - .scope)
- _SYSTEMD_OWNER_UID (идентификатор владельца пользовательского юнита systemd)
- _SELINUX_CONTEXT (метка SELinux процесса)
- _SOURCE_REALTIME_TIMESTAMP (в микросекундах от начала времён UNIX)
- _BOOT_ID (идентификатор загрузки ядра - 128 бит)
- _MACHINE_ID (UUID хоста - machine-id.5, /etc/machine-id, systemd.machine_id=, --machine-id=)
- _SYSTEMD_INVOCATION_ID (идентификатор запуска юнита)
- _HOSTNAME
- _TRANSPORT (источник сообщения: audit, driver (сам systemd-journald), syslog, journal, stdout, kernel)
- _STREAM_ID (для stdout: уникальный 128-битный идентификатор потока)
- _LINE_BREAK (для stdout: необычный разделитель строк - nul (\0), line-max (достигнут максимум длины строки LineMax=), eof (последняя запись в файле),
pid-change (изменился идентификатор процесса))
- поля, сгенерированные ядром:
- _KERNEL_DEVICE (в формате - '{b|c}мажор:минор' или 'nиндекс_интерфейса' или '+:имя'('+scsi:16:0:0:0'))
- _KERNEL_SUBSYSTEM (имя подсистемы ядра)
- _UDEV_SYSNAME (имя устройства в дереве /sys - '16:0:0:0')
- _UDEV_DEVNODE (путь в /dev)
- _UDEV_DEVLINK (символьная ссылка на файл в /dev)
- поля, сгенерированные посредниками:
- COREDUMP_UNIT (аварийный отчёт от юнита с помощью coredumpctl.1)
- COREDUMP_USER_UNIT (аварийный отчёт от пользовательского юнита с помощью coredumpctl.1)
- OBJECT_PID, OBJECT_UID, OBJECT_GID, OBJECT_COMM, OBJECT_EXE, OBJECT_CMDLINE, OBJECT_AUDIT_SESSION, OBJECT_AUDIT_LOGINUID,
OBJECT_SYSTEMD_CGROUP, OBJECT_SYSTEMD_SESSION, OBJECT_SYSTEMD_OWNER_UID, OBJECT_SYSTEMD_UNIT, OBJECT_SYSTEMD_USER_UNIT
(информация извлекается systemd-journald из информации о процессе OBJECT_PID)
- вспомогательные поля, получаемые при экспорте во внешний формат (они не хранятся в журнале):
- __CURSOR (позиция записи в журнале)
- __REALTIME_TIMESTAMP (CLOCK_REALTIME в момент получения записи в журнал)
- __MONOTONIC_TIMESTAMP (CLOCK_MONOTONIC в момент получения записи в журнал, для адресации необходимо значение _BOOT_ID)
- __SEQNUM
- __SEQNUM_ID
При настройках по умолчанию запись в журнал (в новых системах - RHEL8 - и в syslog) прекращается при недостатке памяти.
И бездарно тратися 4ГБ ОП. Переделываем /etc/systemd/journald.conf:
Storage=persistent
Compress=64
SplitMode=none
RateLimitBurst=20000
SystemMaxUse=1G
и перезапуск (журнал частично переписывается из /run/log/journal в /var/log/journal)
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl stop rsyslog
systemctl restart systemd-journald
systemctl start rsyslog
Утилита systemd-cat позволяет записать свой входной поток (stdin) или вывод (stdout и stderr) указанной команды в журнал.
Ключи:
- --identifier=строка # SYSLOG_IDENTIFIER?
- --priority={info|emerg|alert|crit|err|warning|notice|debug} # приоритет по умолчанию
- --level-prefix={true|false} # интерпретировать начало строки как приоритет (например, '<5>' преобразуется в notice)
Утилита systemd-journal-gatewayd и построенный на её основе сервис
(systemd-journal-gatewayd.socket слушает порт 19531, используется в sockets.target;
юнит systemd-journal-gatewayd требует systemd-journal-gatewayd.socket, запускает systemd-journal-gatewayd)
реализует HTTP/HTTPS сервер для сообщений журнала, обслуживаемые запросы: /browse,
/entries[?опция1&опция2=значение...] (опции - follow, boot, ключ=шаблон), /machine, /fields/имя_поля.
Также может быть использован для передачи сообщений журнала по сети (systemd-journal-remote, application/vnd.fdo.journal).
Ключи:
- --key=файл-SSL-ключа-PEM
- --cert=файл-SSL-сертификата-PEM
- --trust=файл-SSL-сертификата-CA-PEM
- --directory=каталог-журналов
Утилита systemd-journal-remote и построенный на её основе сервис
(systemd-journal-remote.socket слушает порт 19532, используется в sockets.target;
юнит systemd-journal-remote.service требует systemd-journal-remote.socket, PrivateNetwork=yes (прощай DNS?),
запускает systemd-journal-remote --listen-https=-3 --output=/var/log/journal/remote/,
системный журнал сразу начинает писаться в /var/log/journal)
позволяет принимать сообщения журнала возможно из нескольких потоков в формате экспорта по HTTP[S]
от systemd-journal-gatewayd или systemd-journal-upload или в "сыром" формате от ? и записывать их в журнал.
systemd-journal-remote может работать в режиме запроса (имена файлов или '-' задаются в качестве позиционных параметров) или режиме ожидания.
Ключи:
- --url=http[s]://доменное-имя[:порт] # куда делать запрос (с той стороны systemd-journal-gatewayd, порт 19531)
- --getter='программа параметры' # программа делающая запрос и выдающая поток сообщений журнала на стандартный вывод
- --listen-raw=сокет-ожидания
- --listen-http[s]=адрес # адрес м.б. либо сокет-ожидания для systemd-journal-upload (запускается HTTP или HTTPS сервер,
принимает только команды POST в /upload с заголовком "Content-Type: application/vnd.fdo.journal"),
либо отрицательное число, обозначающее номер дескриптора файлов (-3), передаваемого свыше (порт TCP/19532)
- --key=файл-SSL-ключа-PEM
- --cert=файл-SSL-сертификата-PEM
- --trust={файл-SSL-сертификата-CA-PEM|all}
- --gnutls-log=список-категорий-отладки-gnutls
- --output=каталог # по умолчанию каталог /var/log/journal/remote/; "chown systemd-journal-remote:systemd-journal-remote"
- --split-mode={none|host} # делить создаваемый журнал по хостам
- --output=имя-файла.journal # по умолчанию remote-имя_хоста.journal; при заполнении файла (см. journald.conf) будет ротация
- --compress={yes|no} # сжимать данные в журнале с использованием xz (маленькими кусочками?)
- --seal={no|yes} # использовать FSS (Forward Secure Sealing) для обнаружения изменений
Настройки в /etc/systemd/journal-remote.conf (/etc/systemd/journal-temote.conf.d/*.conf,
/run/systemd/journal-temote.conf.d/*.conf, /usr/lib/systemd/journal-remote.conf.d/*.conf), какой файл прочитали последним
(в лексиграфическом порядке по именам файлов невзирая на имена каталогов), тот и прав.
Формат файла аналогичен systemd, все настройки в секции "[Remote]", умолчания закоментированы:
- Seal=
- SplitMode=
- ServerKeyFile=
- ServerCertificateFile=
- TrustedCertificateFile=
- в версии 253 добавлены параметры MaxUse=, KeepFree=, MaxFileSize=, MaxFiles=
Запуск 2 серверов централизованного сбора журналов:
lvcreate --name remotelogs -L 100G SSD
# super_super2 не даст увеличивать размер без размонтирования
mkfs.ext4 -L remotelogs -v -E nodiscard,lazy_itable_init=1 -O 64bit,dir_index,extent,ext_attr,filetype,flex_bg,has_journal,huge_file,large_file,metadata_csum,metadata_csum_seed,sparse_super,uninit_bg /dev/SSD/remotelogs
mkdir /var/log/remotelogs
в /etc/fstab
LABEL=remotelogs /var/log/remotelogs ext4 data=ordered,nodiratime,relatime,journal_checksum,delalloc,rw,nosuid,nodev,noexec,auto,nouser,nodiscard 1 2
systemctl daemon-reload
mount /var/log/remotelogs
mkdir /var/log/remotelogs/{journald,syslog}
chown systemd-journal-remote:systemd-journal-remote /var/log/remotelogs/journald
vim /etc/systemd/journald.conf
Storage=volatile
Compress=64
RateLimitBurst=20000
SystemMaxUse=100G
SystemMaxFileSize=1000M
SystemMaxFiles=100000
MaxRetentionSec=1y
systemctl restart systemd-journald.service
cp -a /usr/lib/systemd/system/systemd-journal-remote.service /etc/systemd/system/systemd-journal-remote.service
vim /etc/systemd/system/systemd-journal-remote.service
[Service]
ExecStart=/usr/lib/systemd/systemd-journal-remote --listen-http=-3 --output=/var/log/remotelogs/journald --split-mode=none --compress=yes
LogsDirectory=remotelogs/journald
systemctl daemon-reload
systemctl start systemd-journal-remote
systemctl status systemd-journal-remote
systemctl enable systemd-journal-remote
смотреть с помощью
journalctl -D /var/log/remotelogs/journald [_HOSTNAME=полное-доменное-имя] ...
Файлы журнала занимают очень много места (в systemd v252 уменьшено вдвое). Кладём их в файловую систему со сжатием ():
mkdir /var/log/remotelogs
zfs create bigpool/remotelogs -v \
-o aclinherit=passthrough -o aclmode=passthrough -o acltype=posix -o xattr=sa \
-o atime=on -o relatime=on \
-o checksum=sha256 \
-o compression=zstd-12 \
-o dedup=off \
-o devices=off \
-o dnodesize=legacy \
-o overlay=off \
-o primarycache=metadata -o secondarycache=metadata \
-o recordsize=16777216 \
-o redundant_metadata=none \
-o sharenfs=off -o sharesmb=off \
-o snapdir=visible \
-o special_small_blocks=0 \
-o sync=disabled -o logbias=throughput \
-o mountpoint=/var/log/remotelogs
mkdir /var/log/remotelogs/{syslog,journald}
chown systemd-journal-remote:systemd-journal-remote /var/log/remotelogs/journald
vim /etc/systemd/journald.conf
Storage=volatile
Compress=64
SplitMode=none
RateLimitBurst=20000
SystemMaxUse=1000G
SystemMaxFileSize=1000M
SystemMaxFiles=100000
MaxRetentionSec=1y
systemctl restart systemd-journald.service # копировать старые данные с persistent в volatile не умеет
cp -a /usr/lib/systemd/system/systemd-journal-remote.service /etc/systemd/system/systemd-journal-remote.service
vim /etc/systemd/system/systemd-journal-remote.service
[Unit]
Requires=var-log-remotelogs.mount
...
[Service]
...
ExecStart=/usr/lib/systemd/systemd-journal-remote --listen-http=-3 --output=/var/log/remotelogs/journald/remote.journal --split-mode=none --compress=no
LogsDirectory=remotelogs/journald
...
systemctl daemon-reload
systemctl start systemd-journal-remote
systemctl status systemd-journal-remote
systemctl enable systemd-journal-remote
смотреть с помощью
journalctl -D /var/log/remotelogs/journald [_HOSTNAME=полное-доменное-имя] ...
сжимает около 10 раз, но читается невыносимо медленно, нужен
-o primarycache=all
Утилита systemd-journal-upload и построенный на её основе сервис (--save-state,
пакет systemd-journal-gateway в RHEL7 или пакет systemd-journal-remote в RHEL8)
позволяет передавать сообщения читаемых журналов в формате экспорта по HTTP[S] (принимающая сторона - systemd-journal-remote).
Ключи:
- --url=[http[s]://]доменное-имя[:порт] # порт по умолчанию 19532
- --system # ограничиться системными записями
- --user # ограничиться записями текущего пользователя
- --merge # передавать записи для всех хостов
- --directory=каталог # извлекать журналы из указанного каталога
- --file=шаблон # извлекать журналы из указанных файлов
- --cursor=курсор # извлекать журналы с указанного курсором места
- --after-cursor=курсор # извлекать журналы после указанного курсором места
- --save-state[=путь] # /var/lib/systemd/journal-upload/state, извлекать записи на основе указанного курсора;
после извлечения курсор обновить
- --follow[=yes] # ждать ввода
- --key=файл-SSL-ключа-PEM
- --cert=файл-SSL-сертификата-PEM
- --trust={файл-SSL-сертификата-CA-PEM|all}
Настройки в /etc/systemd/journal-upload.conf (/etc/systemd/journal-upload.conf.d/*.conf,
/run/systemd/journal-upload.conf.d/*.conf, /usr/lib/systemd/journal-upload.conf.d/*.conf), какой файл прочитали последним
(в лексиграфическом порядке по именам файлов невзирая на имена каталогов), тот и прав.
Формат файла аналогичен systemd, все настройки в секции "[Upload]", умолчания закоментированы:
- URL=
- ServerKeyFile=
- ServerCertificateFile=
- TrustedCertificateFile=
Запуск очередного клиента:
cp -a /usr/lib/systemd/system/systemd-journal-upload.service /etc/systemd/system/systemd-journal-upload1.service
cp -a /usr/lib/systemd/system/systemd-journal-upload.service /etc/systemd/system/systemd-journal-upload2.service
vim /etc/systemd/system/systemd-journal-upload1.service
ExecStart=/usr/lib/systemd/systemd-journal-upload --save-state=/var/lib/systemd/journal-upload/state1 --url=http://journal1 --directory=/var/log/journal
vim /etc/systemd/system/systemd-journal-upload2.service
ExecStart=/usr/lib/systemd/systemd-journal-upload --save-state=/var/lib/systemd/journal-upload/state2 --url=http://journal2 --directory=/var/log/journal
mkdir -p /var/lib/systemd/journal-upload
chown systemd-journal-upload:systemd-journal-upload /var/lib/systemd/journal-upload
systemctl daemon-reload
systemctl start systemd-journal-upload1
systemctl status systemd-journal-upload1
systemctl start systemd-journal-upload2
systemctl status systemd-journal-upload2
systemctl enable systemd-journal-upload1
systemctl enable systemd-journal-upload2
Утилита journalctl используется для просмотра и управления журналом.
По умолчанию выводит все записи журнала с использованием less, важность выделяется цветом, яркостью и жирностью.
Аргументы утилиты используются для фильтрации вывода (журнал индексирован, что позволяет делать это быстро),
каждый параметр задаёт значение метаданных в виде "имя=значение", по умолчанию используется
операция ИЛИ для одинаковых метаданных, операция И для разных метаданных, символ '+' используется для явного задания операции ИЛИ.
Указание абсолютного имени файла позволяет сократить написание фильтров для _EXE=, _COMM=, _KERNEL_DEVICE=.
Ключи:
- форматирование вывода и управление показом:
- --full # по умолчанию, выводить полные строки
- --no-full # обрезать концы строк, которые не помещаются на экран
- --all # выводить все поля в полном виде, даже непечатное
- --follow | -f # выводить сообщения по мере прибытия
- --pager-end | -e # встать в конец
- --lines | -n # ограничить вывод последними n строками, можно указать all, по умолчанию 10
- --no-tail # не ограничивать вывод хвостом
- --reverse | -r # выводить в обратном порядке
- --output=формат
- short - как в syslog, по одной строке на сообщение
- short-full - с полными отметками времени
- short-iso - с отметками времени в формате ISO 8601
- short-iso-precise - с отметками времени в формате ISO 8601 и микросекундами
- short-precise - как в syslog, но с микросекундами
- short-monotonic - с монотонными отметками времени (микросекунд с загрузки)
- short-unix - с отметками времени в формате UNIX с микросекундами
- verbose - выодить все метаданные
- export - формат для экспорта, резервного копирования и передачи по сети (чтение с помощью systemd-journal-remote)
- json - JSON, по одной строке на сообщение
- json-pretty - JSON для кожаных мешков
- json-sse - JSON для SSE (Server Sent Events)
- cat - только текст сообщения, без метаданных и отметок времени
- with-unit - short-full, но с именами юнитов вместо идентификаторов
- --catalog | -x # дополнять сообщения дополнительными текстами из каталога сообщений (база советов системному администратору),
/var/lib/systemd/catalog/database
- --output-fields=список-выводимых-метаданных
- --utc # выводить время в UTC
- --no-hostname # не выводить имя хоста для локальных сообщений в форматах short*
- --merge | -m # выводить сообщения из всех доступных журналов
- --show-cursor # после последней записи вывести значение курсора (локации)
- --field=имя-поля-метаданных | -F # вывести все встречающиеся значения указанного поля метаданных (less не используется!)
- --fields # вывести все встречающиеся поля метаданных (less не используется!)
- --no-pager # не использовать less
- фильтр:
- --quiet | -q # не выводить информационные сообщения journald
- --boot=[идентификатор-загрузки][{+|-}смещение] # ограничить вывод указанной загрузкой (_BOOT_ID), по умолчанию текущей ('-0')
- --list-boots # вывести список загрузок: смещение, идентификатор, отметка времени начала и завершения
- --dmesg | -k # только сообщения от kmsg (_TRANSPORT=kernel)
- --identifier=идентификатор | -t идентификатор # SYSLOG_IDENTIFIER=идентификатор
- --unit={имя-юнита|шаблон} | -u {имя-юнита|шаблон} # _SYSTEMD_UNIT=имя-юнита, сообщения systemd об этом юните, сообщения о coredump
- --user-unit=имя-юнита # _SYSTEMD_USER_UNIT=имя-юнита, _UID=имя-юнита (?), сообщения от менеджера сессий и coredump об этом пользователе
- --priority=минимально-требуемый-уровень-важности | -p минимально-требуемый-уровень-важности # для каждого уровня добавляется PRIORITY=уровень
- --grep=регулярное-выражение | -g # фильтруется по содержимому MESSAGE
- --case-sensitive={yes|no} # для --grep
- --cursor=локация # начать вывод с указанного места
- --after-cursor=локация # начать вывод после указанного места
- --since=время | -S время # начать вывод после указанного времени (в формате [YYYY-MM-DD][ HH:MM[:SS]] или now-смещение)
- --until=время | -U время # завершить вывод указанным временем (в формате [YYYY-MM-DD][ HH:MM[:SS]] или now-смещение)
- --system # сообщения от системных служб и ядра
- --user # сообщения от служб текущего пользователя
- выбор журналов (ключи несовместимы между собой):
- --directory=каталог | -D каталог # берётся последний аргумент;
файлы обрабатываются по очереди, отсутстует сортировка по времени
- --file=абсолютный-шаблон-имён # можно использовать несколько раз, результат будет перемежаться;
файлы обрабатываются по очереди, отсутстует сортировка по времени
- --root=каталог
- --machine=имя-контейнера | -M имя-контейнера # использовать журнал указанного контейнера или виртуальной машины (?)
- обслуживание журнала:
- --header # вывести заголовки файлов журналов
- --disk-usage # размер использованного места в файловой системе
- --vacuum-size=байт # удалить самые старые архивные журналы, пока использованное место не упадёт ниже указанного предела
- --vacuum-time=секунд # удалить самые старые архивные журналы, которые содержат записи старше указанного времени
- --vacuum-files=число # удалить самые старые архивные журналы, пока не останется указанное количество файлов
- --dump-catalog # вывести содержимое каталога сообщений (база советов системному администратору), /var/lib/systemd/catalog/database
- --list-catalog # вывести из каталога (база советов системному администратору) сообщений идентификаторы сообщений и тексты
- --update-catalog # обновить индекс каталога сообщений (база советов системному администратору), /var/lib/systemd/catalog/database
- --setup-keys [--force] [--interval[=15m]] # сгенерировать ключи подписи и верификации для FSS (Forward Secure Sealing),
ключ верификации надо сохранить отдельно
- --verify [--verify-key=ключ-верификации] # проверить состояние журналов [и верифицировать цифровые подписи]
- --sync # синхронизировать изменения в файловую систему
- --flush # сбросить журналы из /run/log/journal в /var/log/journal
- --rotate # ротация журналов
- --convert=имя-файла # преобразование в компактный формат (systemd 253)
Утилита journalctl использует переменные окружения:
- SYSTEMD_LESS - опции для less вместо "FRSXMK"
- SYSTEMD_LESSCHARSET
- SYSTEMD_PAGER - вместо less, также учитывается переменная окружения PAGER
- SYSTEMD_PAGERSECURE - по умолчанию true (LESSSECURE=1), если euid отличается от владельца сессии
journald и rsyslog мешаются при доступе к файлам, поэтому перед изменением
настроек journald необходимо остановить rsyslog, а после - запустить вновь.
При наличии каталога /var/log/journal rsyslog читает из него, невзирая на настройки journald.
- RFC 3164. C. Lonvick, The BSD Syslog Protocol, August 2001.
- RFC 3195. D. New, M. Rose, Reliable Delivery for syslog, November 2001.
- RFC 5424. R. Gerhards, The Syslog Protocol, March 2009
- RFC 5425. F. Miao, Y. Ma, J. Salowey, Transport Layer Security (TLS) Transport Mapping for Syslog, March 2009
- RFC 5426. A. Okmianski, Transmission of Syslog Messages over UDP, March 2009
- RFC 5427. G. Keeni, Textual Conventions for Syslog Management, March 2009
- RFC 5674. S. Chisholm, R. Gerhards, Alarms in Syslog, October 2009
- RFC 5675. V. Marinov, J. Schoenwaelder, Mapping SNMP Notifications to SYSLOG Messages, October 2009
- RFC 5676. J. Schoenwaelder, A. Clemm, A. Karmakar, Definitions of Managed Objects for Mapping SYSLOG Messages to SNMP Notifications, October 2009
- RFC 5848. J. Kelsey, J. Callas, A. Clemm, Signed Syslog Messages, May 2010
- RFC 6012. J. Salowey, T. Petch, R. Gerhards, H. Feng, Datagram Transport Layer Security (DTLS) Transport Mapping for Syslog, October 2010
- RFC 6587. R. Gerhards, C. Lonvick, Transmission of Syslog Messages over TCP, April 2012
- sysklogd ("стандартный" syslogd и klogd)
- logwatch
- logrotate
- swatch - Tool for actively monitoring log files
- Syslog Device Configuration MIB (draft-ietf-syslog-device-mib-00.txt)
- syslog-ng (RFC 3164 и RFC 5424;
маршрутизация сообщения в зависимости от источника, текста сообщения, использование TCP; генерация имени журнала в зависимости от даты, сжатие, шифрование;
выдача журнала на stdin запускаемой программы и много других полезных вещей; версия 3.5.6 в RHEL 7.5)
- eventlog (стуктурированный журнал, дополнение к syslog-ng)
- Cryptographic Support for Secure Logs on Untrusted Machines
A
- Epylog (разбор журналов с множества серверов, сброшенных в общий loghost)
|
Bog BOS: syslog - сетевой системный журнал
|
Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru