Настройка Rsyslog в Linux
Когда в системе происходит та или иная ошибка, нужно выяснить почему она произошла, исправить её и попытаться сделать так, чтобы такой ошибки больше не было. В этом системным администраторам очень сильно помогает логирование всех ошибок. Например, общие сообщения ядра и программ сохраняются в /var/log/messages.
Но рано или поздно файлы логов становятся слишком большими, они занимают все место на диске и это приводит к новым ошибкам. Поэтому важно контролировать, как и куда сохраняются файлы журналов. На протяжении многих лет в операционной системе Linux используется сервис Syslog для управления логами. В современных версиях применяется его модификация — rsyslog.
В этой статье мы рассмотрим как выполняется установка и настройка rsyslog, рассмотрим основы настройки локального логирования в Linux, а также пойдем дальше и настроем удаленный сбор логов. Эта информация также поможет вам улучшить свои навыки поиска ошибок и неисправностей.
Что такое Rsyslog?
Развитие rsyslog началось в 2004 году, в качестве форка используемого тогда сервиса Syslog. Программа очень быстро набрала популярность среди пользователей и сейчас она поставляется по умолчанию во многих дистрибутивах Linux.
Rsyslog — это очень быстрый, расширяемый сервис для управления логами с огромным количеством возможностей. Среди его возможностей можно отметить поддержку фильтрации контента, а также передачу логов по сетям. Разработчики утверждают, что система очень быстрая, программа может обрабатывать до миллиона сообщений в секунду.
Вот основные возможности:
- Многопоточность;
- TCP, SSL, TLS, RELP;
- Поддержка MySQL, PostgreSQL, Oracle;
- Фильтрация журналов;
- Полностью настраиваемый формат вывода.
Как происходит логирование?
Все программы Linux ведут лог путем отправки сообщений об ошибках или своем состоянии с помощью сокета syslog или просто записывая все сообщения в файл, который будет находиться в каталоге /var/log/.
Но важное значение имеет уровень подробности логирования. Вы можете настраивать подробность в каждой отдельной программе, или же с помощью syslog. Это поможет уменьшить использование дискового пространства, на хранение логов. Но тут нужно найти компромисс между количеством информации и использованием диска.
Например, ядро Linux определяет такие уровни логов, или как мы будем называть их ниже — приоритеты:
- KERN_EMERG — система неработоспособна;
- KERN_ALERT — нужно немедленно принять меры;
- KERN_CRIT — критическая ошибка;
- KERN_ERR — обычная ошибка;
- KERN_WARNING — предупреждение;
- KERN_NOTICE — замечание;
- KERN_INFO — информационное сообщение;
- KERN_DEBUG — сообщения отладки.
Подобные уровни лога поддерживаются в большинстве программ, которые ведут логи.
Настройка Rsyslog в Linux
Все настройки Rsyslog находятся в файле /etc/rsyslog.conf и других конфигурационных файлах из /etc/rsyslog.d/. Вы можете посмотреть существуют ли у вас эти файлы выполнив:
Основной конфигурационный файл — /etc/rsyslog.conf, в нем подключены все файлы из папки /etc/rsyslog.d/ с помощью директивы IncludeConfig в самом начале файла:
В этих файлах могут содержаться дополнительные настройки, например, аутентификация на Rsyslog сервере. В главном конфигурационном файле содержится очень много полезных настроек. Обычно он обеспечивает управление локальными логами по умолчанию, но для работы через сеть нужно добавить настройки. Сначала давайте рассмотрим что представляет из себя этот файл.
Синтаксис конфигурационного файла очень прост:
$ переменная значение
Все директивы начинаются со знака доллара, содержат имя переменной, а дальше связанное с ней значение. Так выглядит каждая строка конфигурационного файла. В его первой части размещены общие настройки программы и загрузка модулей. Во второй — ваши правила сортировки и фильтрации лог файлов.
ModLoad imuxsock # provides support for local system logging
$ModLoad imklog # provides kernel logging support
#$ModLoad immark # provides —MARK— message capability
# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
В этом участке загружаются все необходимые модули программы. Существуют четыре типа модулей:
- Модули ввода — можно рассматривать, как способ сбора информации из различных источников, начинаются с im.
- Модули вывода — позволяют отправлять сообщения в файлы или по сети, или в базу данных, имя начинается на om;
- Модули фильтрации — позволяют фильтровать сообщения по разным параметрам, начинаются с fm;
- Модули парсинга — предоставляют расширенные возможности для синтаксического анализа сообщения, начинаются с pm.
Сначала загружается модуль imuxsock, который позволяет сервису получать сообщения из сокетов, а второй imklog получает сообщения ядра. Следующим загружается модуль mark, который позволяет маркировать соединения, или же выводить сообщения о том, что syslog все еще работает. Например, вы можете попросить rsyslog выводить сообщения каждые 20 минут:
Дальше идут глобальные директивы:
В этой строке мы указываем, что нужно использовать стандартный формат хранения времени, в секундах с 1970 года.
Дальше следует набор прав разрешений для файлов журналов, которые будут созданы в вашей системе:
FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
После создания этих файлов их права можно менять, на те, которые вам нужны.
Выше была более общая настройка syslog, ну а теперь самое интересное — правила сортировки логов. Вот набор правил по умолчанию:
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
lpr.* -/var/log/lpr.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
Каждое правило имеет свой синтаксис, сначала идет источник и приоритет, затем действие. Если источник и приоритет совпадают, сообщение отправляется в указанный файл. Например, мы можем отправить больше сообщений в лог системы linux /var/messages:
В этой строке мы выбираем все сообщения уровня info, кроме mail,authpriv и cron. Шаблон mail.none будет означать, что не нужно логировать ни один уровень сообщений. Соответственно конструкция *.info — значит логировать сообщения от всех источников, но только с уровнем info, *.* — это вообще все сообщения, со всеми уровнями.
Источник и приоритет нечувствительны к регистру. Также заметьте, что приоритеты уровней error, warn и panic больше не используются, так как считаются устаревшими. В целом, в качестве источников вы можете использовать:
А в качестве приоритетов вы можете применить:
- emerg (раньше panic);
- alert;
- crit;
- error (раньше err);
- warn (раньше warning);
- notice;
- info;
- debug;
Как я уже говорил, звездочки на любом месте означают все варианты. Для фильтрации логов могут использоваться не только источник и приоритет, но и более сложные выражения на основе условий и сравнений.
Вы можете выполнять фильтрацию сообщений с помощью такого синтаксиса:
: поле, сравнение, «значение» путь_к_файлу
В качестве операции сравнения вы можете использовать такие варианты:
- contains — поле содержит указанное значение;
- isequal — поле должно быть идентичным значению;
- startswith — поле должно начинаться со значения;
- regex — сравнивает поле с регулярным выражением.
Например, отфильтруем сообщения только от определенной программы:
:syslogtag, isequal, «giomanager:» /var/log/giomanager.log
& stop
Кроме того, можно использовать более простой синтаксис, в виде выражения if. Вот основной синтаксис:
if $поле сравнение ‘значение’ then файл
Здесь используются те же самые компоненты, только выглядит немного проще. Например:
if $syslogtag == ‘giomanager’ then /var/log/giomanager.log
Настройка syslog для удаленного логирования
Было бы очень удобно, если бы логи со всех серверов сети собирались на одной машине. Здесь бы были все важные сообщения об ошибках и неполадках. Вы могли бы все это очень быстро проанализировать. Отправить лог на удаленный сервер достаточно просто, для этого достаточно указать @ и ip адрес удаленной машины, на которой запущен rsyslog:
Здесь 514 — это порт, на котором слушает rsyslog. Настройка rsyslog на прием логов заключается в запуске сервиса с модулями imtcp и imudp. Далее, все что нужно для того чтобы получить логи с определенной машины, отфильтровать их из общего потока с помощью фильтров:
if $fromhost-ip contains ‘192.168.1.10’ then /var/log/proxyserver.log
Без фильтров, сообщения с разных машин будут писаться в один общий лог системы linux в зависимости от того как вы их распределите.
Выводы
В этой статье мы рассмотрели как выполняется настройка Rsyslog в Linux для сбора логов на локальном компьютере, а также передачи их на удаленный сервер. Изначально все кажется очень сложным, но если разобраться, то и это можно настроить.
Обратите внимание, что при использовании rsyslog в качестве сетевого сервера для хранения логов место на диске будет очень быстро уменьшаться. Поэтому лучше применять в дополнение к программе такую утилиту, как Logrotate.
На завершение видео на английском про настройку Logrotate:
Источник
syslog(3) — Linux man page
closelog, openlog, syslog, vsyslog — send messages to the system logger
Synopsis
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, . );
void closelog(void);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)): vsyslog(): _BSD_SOURCE
Description
closelog() closes the descriptor being used to write to the system logger. The use of closelog() is optional.
openlog() opens a connection to the system logger for a program. The string pointed to by ident is prepended to every message, and is typically set to the program name. If ident is NULL, the program name is used. (POSIX.1-2008 does not specify the behavior when ident is NULL.)
The option argument specifies flags which control the operation of openlog() and subsequent calls to syslog(). The facility argument establishes a default to be used if none is specified in subsequent calls to syslog(). Values for option and facility are given below. The use of openlog() is optional; it will automatically be called by syslog() if necessary, in which case ident will default to NULL.
syslog() generates a log message, which will be distributed by syslogd(8). The priority argument is formed by ORing the facility and the level values (explained below). The remaining arguments are a format, as in printf(3) and any arguments required by the format, except that the two character sequence %m will be replaced by the error message string strerror(errno). A trailing newline may be added if needed.
The function vsyslog() performs the same task as syslog() with the difference that it takes a set of arguments which have been obtained using the stdarg(3) variable argument list macros.
The subsections below list the parameters used to set the values of option, facility, and priority.
option The option argument to openlog() is an OR of any of these: LOG_CONS
Write directly to system console if there is an error while sending to system logger.
Open the connection immediately (normally, the connection is opened when the first message is logged).
Don’t wait for child processes that may have been created while logging the message. (The GNU C library does not create a child process, so this option has no effect on Linux.)
The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called. (This is the default, and need not be specified.)
(Not in POSIX.1-2001 or POSIX.1-2008.) Print to stderr as well.
Include PID with each message.
facility The facility argument is used to specify what type of program is logging the message. This lets the configuration file specify that messages from different facilities will be handled differently. LOG_AUTH
security/authorization messages (private)
clock daemon (cron and at)
system daemons without separate facility value
kernel messages (these can’t be generated from user processes) LOG_LOCAL0 through LOG_LOCAL7
reserved for local use LOG_LPR
line printer subsystem
USENET news subsystem
messages generated internally by syslogd(8) LOG_USER (default)
generic user-level messages LOG_UUCP
level This determines the importance of the message. The levels are, in order of decreasing importance: LOG_EMERG
system is unusable
action must be taken immediately
normal, but significant, condition
debug-level message The function setlogmask(3) can be used to restrict logging to specified levels only.
Conforming To
The functions openlog(), closelog(), and syslog() (but not vsyslog()) are specified in SUSv2, POSIX.1-2001, and POSIX.1-2008. POSIX.1-2001 specifies only the LOG_USER and LOG_LOCAL* values for facility. However, with the exception of LOG_AUTHPRIV and LOG_FTP, the other facility values appear on most UNIX systems. The LOG_PERROR value for option is not specified by POSIX.1-2001 or POSIX.1-2008, but is available in most versions of UNIX.
Notes
The argument ident in the call of openlog() is probably stored as-is. Thus, if the string it points to is changed, syslog() may start prepending the changed string, and if the string it points to ceases to exist, the results are undefined. Most portable is to use a string constant.
Never pass a string with user-supplied data as a format, use the following instead:
Источник