Одной их особенностей Linux является обильное логгирование самых различных действий, которые совершаются в системе. Одним из ключевых компонентов, которые отвечают за логгирование в Linux, является процесс rsyslog. Этот процесс настроен для наблюдения за тем, что происходит компьютере, и обычно логгирует действия в файлы из папки /var/log. В частности, если мы посмотрим на эту папку, то сможем увидеть в ней ряд файлов и каталогов, применяемых для логгирования:
eugene@Eugene:~$ ls -l /var/log total 49200 -rw-r--r-- 1 root root 5267 Mar 20 11:22 alternatives.log drwxr-x--- 2 root adm 4096 Mar 21 07:08 apache2 -rw-r----- 1 root adm 426 Mar 21 07:08 apport.log drwxr-xr-x 2 root root 4096 Mar 20 11:22 apt -rw-r----- 1 syslog adm 141654 Mar 21 09:17 auth.log -rw------- 1 root root 4020 Mar 21 07:08 boot.log -rw-r--r-- 1 root root 111435 Oct 16 13:37 bootstrap.log -rw-rw---- 1 root utmp 3456 Mar 18 18:36 btmp -rw-r----- 1 syslog adm 89237 Jan 28 14:38 cloud-init.log -rw-r----- 1 root adm 6404 Jan 28 14:38 cloud-init-output.log drwxr-xr-x 2 root root 4096 Mar 21 07:08 cups -rw-r----- 1 root adm 117189 Mar 21 07:08 dmesg -rw-r--r-- 1 root root 63644 Mar 20 11:22 dpkg.log -rw-r--r-- 1 root root 0 Oct 16 13:36 faillog -rw-r--r-- 1 root root 4617 Jan 28 14:41 fontconfig.log drwx--x--x 2 root gdm 4096 Jan 28 14:38 gdm3 -rw-r--r-- 1 root root 46655 Mar 21 07:08 gpu-manager.log drwxrwx--- 4 root adm 4096 Jan 28 14:36 installer drwxr-sr-x+ 3 root systemd-journal 4096 Jan 28 14:38 journal -rw-r----- 1 syslog adm 1770885 Mar 21 09:00 kern.log -rw-rw-r-- 1 root utmp 292292 Mar 20 15:12 lastlog drwxr-x--- 2 root root 4096 Oct 4 17:58 sssd -rw-r----- 1 syslog adm 13544272 Mar 21 09:20 syslog -rw-r--r-- 1 root root 29673 Mar 20 08:27 ubuntu-advantage.log drwxr-x--- 2 root adm 4096 Mar 1 06:40 unattended-upgrades -rw-rw-r-- 1 root utmp 187008 Mar 21 07:09 wtmp eugene@Eugene:~$
Конкретное содержимое может отличаться в зависимости от системы и установленного программного обеспечния. Тем не менее здесь мы можем выделить прежде всего файл syslog (или системны лог), в который записываются основые события в системе.
Кроме процесса rsyslog в эту папку логгировать могут и другие процессы. Например, веб-сервер apache также записывает здесь свои сообщения в специальную папку. Но поскольку основным процессом, которые отвечает за логгирование в системе, является rsyslog, то соответственно большое значение имеет его конфигурация, которая позволяет определить различные аспекты логгирования.
Основной файл конфигурации rsyslog - /etc/rsyslog.conf. Помимо этого файла также конфигурацию определяют файлы из каталога /etc/rsyslog.d -
cодержимое этих файлов добавляется к конфигурации, указанной в /etc/rsyslog.conf
, что позволяет пакетам RPM или Debian расширять конфигурацию без изменения
содержимого файла /etc/rsyslog.conf
.
Посмотрим, что из себя представляет конфигурация из /etc/rsyslog.conf
eugene@Eugene:~$ cat /etc/rsyslog.conf # /etc/rsyslog.conf configuration file for rsyslog # # For more information install rsyslog-doc and see # /usr/share/doc/rsyslog-doc/html/configuration/index.html # # Default logging rules can be found in /etc/rsyslog.d/50-default.conf ################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514") # provides kernel logging support and enable non-kernel klog messages module(load="imklog" permitnonkernelfacility="on") ########################### #### GLOBAL DIRECTIVES #### ########################### # Filter duplicated messages $RepeatedMsgReduction on # # Set the default permissions for all log files. # $FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 $PrivDropToUser syslog $PrivDropToGroup syslog # # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf eugene@Eugene:~$
Структура файла состоит главным образом из двух компонентов - модули и глобальные директивы. В конце файла мы можем увидеть директиву
$IncludeConfig /etc/rsyslog.d/*.conf
Она подключает содержимое файлов с расширением .conf
из каталога "/etc/rsyslog.d/". В частности, в этом каталоге мы можем найти файл 50-default.conf
eugene@Eugene:~$ ls /etc/rsyslog.d 20-ufw.conf 21-cloudinit.conf 50-default.conf eugene@Eugene:~$
Файл 50-default.conf определяет базовые правила логгирования для rsyslog. Посмотрим на содержимое этого файла. Так, в моем случае он выглядит следующим образом:
eugene@Eugene:~$ cat /etc/rsyslog.d/50-default.conf # Default rules for rsyslog. # # For more information see rsyslog.conf(5) and /etc/rsyslog.conf # # First some standard log files. Log by facility. # 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 # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # #mail.info -/var/log/mail.info #mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Some "catch-all" log files. # #*.=debug;\ # auth,authpriv.none;\ # news.none;mail.none -/var/log/debug #*.=info;*.=notice;*.=warn;\ # auth,authpriv.none;\ # cron,daemon.none;\ # mail,news.none -/var/log/messages # # Emergencies are sent to everybody logged in. # *.emerg :omusrmsg:* # # I like to have messages displayed on the console, but only on a virtual # console I usually leave idle. # #daemon,mail.*;\ # news.=crit;news.=err;news.=notice;\ # *.=debug;*.=info;\ # *.=notice;*.=warn /dev/tty8 eugene@Eugene:~$
Правила определяют, куда будет производиться логгирования для определенного объекта (facility). В частности, можно установить правила для следующих объектов:
auth: обрабатывает события, связанные с аутентификацией.
authpriv: аналогичен auth
и также обрабатывает события, связанные с аутентификацией.
cron: обрабатывает сообщения, созданные подсистемой cron.
daemon: логгирует сообщения, созданных демоном (сервисом).
kern: логгирует сообщения, которые относятся к ядру. Эта возможность также определяет сообщения, генерируемые брандмауэром ядра iptables.
lpr: логгирует сообщения, которые относятся к устаревшей системе печати lpr.
mail: логгирует сообщения, которые связаны с почтой.
news: логгирует сообщения, которые связаны с работой с протоколом NNTP (протоколом передачи сетевых новостей).
user: логгирует сообщения, которые относятся к пользователю.
При логгировании объекты создают сообщения с заданным приоритетом. Если указан приоритет, то все сообщения с этим и более высокими уровнями приоритетов записываются в указанный файл лога. В rsyslog применяются следующие приоритеты (в порядке возрастания):
debug: отладочная информация, дает подробные данные обо всем, что делает объект. Например, сообщает, какие системные и библиотечные вызовы выполняет объект.
info: вся стандартная информация о том, что делает процесс. Например, дает информацию об открытых файлах, но не дает подробной информации о системных и библиотечных вызовах.
notice: информация о некритичных ошибках. Например, это может относиться к файлу, который должен существовать, но поскольку его не было, он был создан автоматически.
warn (устаревший вариант - warning): информация о предупреждениях, возникших при выполнении процесса. Предупреждение определяет ситуацию, когда нормальная функциональность нарушена, но объект продолжает работать.
err (устаревший вариант - error): информация об ошибках. Обычно сообщения уровня ошибки касаются ситуаций, которые нарушают нормальное функционирование объекта.
crit: информация о критических ситуациях, которые ставят под угрозу нормальную работу компьютера.
alert: информация о ситуации, которая может привести к остановке компьютера.
emerg (устаревший вариант - panic): указывает на прекращение нормальной работы компьютера.
Для настройки логгирования в файле конфигурации объект сочетается с приоритетом в формате:
объект.приоритет
Причем упомянутый приоритет также включает все более высокие приоритеты. Например:
kern.info
Данная запись относится к информационным сообщениям, а также к сообщениям с более высоким приоритетом, которые генерируются ядром.
Можно указать несколько объектов в одной строке через запятую. Например, следующая запись относится как к информационным сообщениям, связанным с ядром, так и к информационным сообщениям, связанным с процессом cron:
kern,cron.info
В качестве альтернативы можно ссылаться на все объекты, используя звездочку, как в следующем примере:
*.crit
При указании приоритета по умолчанию также добавляет логгирование и для более высоких приоритетов. Однако если надо определить правило логгирования только для конкретного приоритета, но НЕ для сообщений с более высоким приоритетом, то применяется знак равенства:
mail.=info
В данном случае задается логгирование информационных сообщений, которые относятся к почте, а сообщения с более высоким приоритетом НЕ логгируются.
Также можно использовать оператор исключения приоритета и каждого приоритета за ним, поставив восклицательный знак перед именем приоритета:
mail.!info
Когда происходит событие, над ним выполняется действие. Обычно это действие означает, что сообщение куда-то отправляется. Файл конфигурации позволяет определить место логгирования сообщений для различных комбинаций объектов и приоритетов. Обычно в качестве места логгирования применяюся файлы. При указании имени файла сообщения записываются в этот файл. Имя файла указывается как абсолютный путь. Чтобы каждое отдельное сообщение в файл конфигурации не записывалось немедленно, перед именем файла можно поставить знак - (дефис) . Это означает, что изменения сначала буферизуются, прежде чем они будут записаны в реальный файл конфигурации. Например:
kern.* -/var/log/kern.log
В данном случае все сообщения (всех приоритетов), которые относятся к ядру, логгируются в файл "/var/log/kern.log" с предварительной буферизацией.
Символ ; (точка с запятой) используется в качестве разделителя, а знак \ гарантирует, что следующая часть интерпретируется как принадлежащая той же строке:
#*.=debug;\ # auth,authpriv.none;\ # news.none;mail.none -/var/log/debug
Или, к примеру, в файле конфигурации есть такая строчка:
*.*;auth,authpriv.none -/var/log/syslog
Выражение *.*
указывает все объекты и все приоритеты. Но потом добавляется auth,authpriv.none
. Фактически это означает, что логгирование для объекта
auth/authpriv из этого правила исключается. В итоге события для всех объектов, кроме auth/authpriv (и всех приоритетов) записывааются с предварительной буферизацией в файл /var/log/syslog
.
Поэтому открыв этот файл, мы найдем подавляющее большинство событий системы.
Команда logger позволяет отправить сообщения в rsyslog. Это позволяет использовать ее для логгирования в сценарии, где логгирование по умолчанию недоступно. И чтобы логгировать сообщение, достаточно передать команде это сообщение в виде строки:
logger hello metanit.com
После этого в файле /var/log/syslog появится строчка наподобие:
2024-03-21T09:01:15.794001+03:00 Eugene eugene: hello metanit.com
При использовании команды logger логгироемое сообщение можно помечать определенным тегом. Это в дальнейшем облегчит распознавание подобных сообщений. Для этого применяется параметр -t. Например, команда
logger -t hello hi metanit.com
пометит сообщение "hi metanit.com" в файле syslog с тегом hello, что облегчит поиск сообщений, добавленных с помощью logger. Например, строка в syslog будет выглядеть наподобие следующего:
2024-03-21T09:09:03.924923+03:00 Eugene hello: hi metanit.com