Linux. Служба логирования rsyslog
26.11.2023
Теги: Linux • Конфигурация • Настройка • Сервер
Многие приложения Linux ведут лог путем отправки сообщений об ошибках или своем состоянии с помощью unix-сокета или просто записывая все сообщения в файл, который расположен в директории /var/log. Служба rsyslog умеет фильтровать сообщения от разных приложений и записывать их в разные файлы. Кроме того, rsyslog можно настроить на запись в лог только важных сообщений, а остальные отбрасывать.
Файлы конфигурации
Все настройки rsyslog находятся в файле /etc/rsyslog.conf и других конфигурационных файлах из директории /etc/rsyslog.d.
# /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 #### ########################### # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # 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
Здесь мы видим подключение всех файлов конфигурации из директории /etc/rsyslog.d. Дефолтные правила логирования прописаны в файле /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
Три типа директив
Rsyslog одновременно поддерживает три различных типа директив конфигурации
basicилиsyslogd— старый формат, можно использовать, когда директива может быть написана в одну строкуlegacyилиrsyslog— старый формат, директива начинается доллара, не рекомендуется, но все еще поддерживаетсяadvancedилиRainerScript— новый формат, рекомендуется использовать, когда директива состоит из нескольких строк
Пример директив конфигурации в формате basic
mail.info /var/log/mail.log
mail.err @server.example.net
Пример директив конфигурации в формате legacy
$FileCreateMode 0640 $DirCreateMode 0755
Пример директив конфигурации в формате advanced
if ($msg contains "important") then { action(type="omfile" file="/var/log/important.log" template="outfmt") }
Это создает множество неудобств, когда в файле конфигурации перемешаны директивы трех разных стилей. При этом часть директив типа legacy могут быть игнорированы при использовании с директивами advanced.
# эта директива будет игнорирована для server1.example.net $actionResumeRetryCount 10 action(type="omfwd" target="server1.example.net") @@server2.example.net
Конфигурация по умолчанию
Файл /etc/rsyslog.conf сначала загружает модули, которые необходимы для работы
- Модули ввода — можно рассматривать, как способ сбора информации из различных источников, начинаются с
im - Модули вывода — позволяют отправлять сообщения в файлы, по сети или в базу данных, имя начинается на
om - Модули фильтрации — позволяют фильтровать поступающие сообщения по различным критериям, начинаются с
fm - Модули парсинга — предоставляют расширенные возможности для синтаксического анализа сообщения, начинаются с
pm
Модуль imuxsock позволяет сервису получать сообщения от приложений, работающих в локальной системе. Раньше модуль прослушивал сокет /dev/log, после появления Systemd — /dev/log представляет собой символическую ссылку на /run/systemd/journal/dev-log. Модуль imklog позволяет получать сообщения от ядра. Настройка модуля permitnonkernelfacility позволяет принимать сообщения от ядра, которые не относятся к ядру. По умолчанию включены только эти два модуля.
Модули imudp и imtcp позволяют получать сообщения по сети, по протоколу UDP/TCP на порту 514. Это значит, что один или несколько серверов будут отправлять сообщения в сеть, а этот сервер будет их принимать. Чтобы сервер отправлял сообщения в сеть — нужно соответствующим образом настроить на нем службу rsyslog.
Дальше в файле конфигурации /etc/rsyslog.conf идет секция глобальных директив
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormatпредписывает использовать форматМес ДД ЧЧ:ММ:СС$RepeatedMsgReduction onпредписывает отбрасывать дубликаты сообщений$WorkDirectory /var/spool/rsyslog— задает директорию для рабочих файлов службы$IncludeConfig /etc/rsyslog.d/*.conf— задает директорию дополнительных файлов конфигурации
Директивы $FileOwner, $FileGroup и прочие — устанавливают права доступа, владельца и группу по умолчанию для лог-файлов.
Файл /etc/rsyslog.d/50-default.con содержит правила — сообщения фильтруются и потом выполняется какое-то действие.
# сообщения от источников auth и authpriv с любым приоритетом записываются в файл /var/log/auth.log auth,authpriv.* /var/log/auth.log # сообщения от всех источников, кроме auth и authpriv, с любым приоритетом, записываются в файл /var/log/syslog *.*;auth,authpriv.none -/var/log/syslog # сообщения от источника cron с любым приоритетом записываются в файл /var/log/cron.log; таким образом, # сообщения от cron будут записаны в файлы /var/log/syslog и /var/log/cron.log cron.* /var/log/cron.log # сообщения от источника kern с любым приоритетом записываются в файл /var/log/kern.log; таким образом # сообщения от kern будут записаны в файлы /var/log/syslog и /var/log/kern.log kern.* -/var/log/kern.log # сообщения от источника mail с любым приоритетом записываются в файл /var/log/mail.log; таким образом # сообщения от mail будут записаны в файлы /var/log/syslog и /var/log/mail.log mail.* -/var/log/mail.log # сообщения от источника mail с приоритетом err и выше записываются в файл /var/log/mail.err; таким # образом эти сообщения будут записаны в файлы /var/log/syslog, /var/log/mail.log, /var/log/mail.err mail.err /var/log/mail.err # сообщения с приоритетом emerg из любого источника будут отправлены всем пользователям в системе *.emerg :omusrmsg:*
Правила
Каждое правило имеет фильтр (источник facility и приоритет severity) и действие. Если фильтр срабатывает — выполняется указанное действие. Источников и приоритетов может быть несколько, их можно разделять точкой с запятой. Каждый следующий фильтр может как сужать, так и расширять условия срабатывания.
источник.приоритет;источник.приоритет действие
Источник может принимать следующие значения
auth— сообщения об авторизация пользователейauthpriv— то же самое, что иauth, но сообщения могут содержать паролиcron— сообщения от системного планировщикаdaemon— сообщения от системных служб, не выделенных в отдельную категориюkern— сообщения от ядраlpr— сообщения от службы печатиftp— сообщения от службы FTPmail— сообщения от почтовой службыmark— проверочные сообщения, формируемые службойrsyslogsyslog— сообщения от службыrsysloguucp— копирование файлов между компьютерами (Unix-to-Unix CoPy)user— сообщения пользовательских приложенийlocal0 … local7— зарезервированы категории для использования администратором
Приоритет может принимать следующие значения
emerg(раньшеpanic) — система неработоспособнаalert— требуется немедленное вмешательствоcrit— критическая ошибкаerr(раньшеerror) — обычная ошибкаwarning(раньшеwarn) — предупреждениеnotice— информация о событииinfo— информационное сообщениеdebug— сообщения отладки
Значения panic, error и warn являются устаревшими и не должны использоваться. Но все еще поддерживаются в целях совместимости со старыми файлами конфигурации.
# сообщения от источников auth и authpriv с любым приоритетом записываются в файл /var/log/auth.log auth,authpriv.* /var/log/auth.log # сообщения от всех источников, кроме auth и authpriv, с любым приоритетом, записываются в файл /var/log/syslog *.*;auth,authpriv.none -/var/log/syslog
Действия
Обычно действие — это просто запись в файл, путь к файлу указывается от корня. Можно добавить дефис, чтобы повысить производительность (но понизить надежность). После имени файла можно указать шаблон, который задает формат одной строки файла лога.
cron.* -/var/log/cron.log;CronLogTemplate auth,authpriv.* /var/log/auth.log;AuthLogTemplate
Имя файла может быть статическим или динамическим. Динамические имена файлов позволяют записывать сообщения в разные файлы — в зависимости от хоста, который их отправил. С динамическими именами файлов все происходит автоматически и не нужны никакие фильтры.
# шаблон динамического имени файла лога $template LogFileName,"/var/log/%HOSTNAME%/%programname%.log" # шаблон отдельной записи в файле лога $template LogFileTemplate,"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" # знак вопроса — признак динамического имени *.* -?LogFileName;LogFileTemplate
Запись сообщения в файл — это самый простой вариант действия. Можно еще известить пользователей с помощью утилиты wall, отправить на удаленный сервер по протоколу udp или tcp, записать в базу данных.
# известить пользователей с помощью утилиты wall
*.=emerg :omusrmsg:*
# известить пользователей root и evgeniy
*.alert :omusrmsg:root,evgeniy
# отправка сообщения по протоколу udp на другой хост cron.* @remote
# отправка сообщения по протоколу tcp на другой хост cron.* @@remote
Для одного фильтра можно задать несколько действий. Каждое действие должно находиться в отдельной строке, строка должна начинаться с символа амперсанда. Директива ниже предписывает отправить сообщение пользователям evgeniy и root + записать сообщение в файл /var/log/crit.log.
*.=crit :omusrmsg:evgeniy & root & /var/log/crit.log
Использование нескольких действий для каждого селектора удобно, а также дает выигрыш в производительности. Поскольку фильтр необходимо оценить только один раз, для обработки директивы требуется меньше вычислений по сравнению с приведенными ниже директивами конфигурации.
*.=crit :omusrmsg:evgeniy *.=crit :omusrmsg:root *.=crit /var/log/crit.log
Фильтры
Rsyslog поддерживает три типа фильтров
- «традиционные» фильтры
- фильтры на основе свойств
- фильтры на основе выражений
1. «Традиционные» фильтры
Фильтр типа mail.warning срабатывает для сообщений с приоритетом warning и выше. Фильтр типа mail.!warning срабатывает для сообщений с приоритетом ниже warning. Фильтр типа mail.=warning срабатывает только для сообщений с приоритетом warning. Фильтр типа mail.!=warning срабатывает для сообщений с приоритетом, отличным от warning. Фильтр типа mail.* срабатывает для сообщений с любым приоритетом.
# все сообщения от mail, кроме notice и info записывать в файл /var/log/mail.err.log mail.*;mail.!=notice;mail.!=info /var/log/mail.err.log # сообщения от mail уровня notice и info записывать в файл /var/log/mail.info.log mail.=notice;mail.=info /var/log/mail.info.log
# все сообщения от mail, кроме notice и info записывать в файл /var/log/mail.err.log mail.warning /var/log/mail.err.log # сообщения от mail уровня notice и info записывать в файл /var/log/mail.info.log mail.!warning /var/log/mail.info.log
Фильтр может быть размещен на нескольких строках — для этого нужно добавить обратную косую черту.
*.=info;*.=notice;\ mail,ftp.none /var/log/messages
2. Фильтры на основе свойств
Позволяют фильтровать сообщения, используя свойства hostname, fromhost, fromhost-ip, syslogtag, programname, msg и еще множество других.
:свойство, [!]операция-сравнения, "значение"
Операция сравнения может принимать значения contains — свойство содержит значение, isequal — свойсто совпадает с значением, startswith — свойсто начинается с значения, regex — свойство соответствует регулярному выражению (BRE — базовые рег.выражения), ereregex — свойство соответствует регулярному выражению (ERE — расширенные рег.выражения).
:msg, contains, "error" /var/log/errors.log :fromhost, regex, ".*ubuntu.*" /var/log/ubuntu-servers.log :msg, regex, "fatal .* error" /var/log/fatal-errors.log
Наиболее полезные свойства
msg— тело сообщенияhostname— имя хоста, отправившего сообщениеsource— имя хоста, отправившего сообщение (алиас)fromhost— имя хоста, от которого было получено сообщениеfromhost-ip— ip-адрес хоста, от которого было получено сообщениеsyslogtag— имя и номер процесса, напримерrsyslogd[12345]programname— имя приложенияsyslogfacility— источник сообщения в виде цифрыsyslogfacility-text— источник сообщения в виде текстаsyslogseverity— приоритет сообщения в виде цифрыsyslogpriority— приоритет сообщения в виде цифры (алиас)syslogseverity-text— приоритет сообщения в виде текстаsyslogpriority-text— приоритет сообщения в виде текста (алиас)pri— источник и приоритет в виде числаpri-text— источник и приоритет в виде текстаtimegenerated— время, когда сообщение было получено
3. Фильтры на основе выражений
Позволяют фильтровать, используя сложные выражения, которые могут включать логические, арифметические и строковые операции.
if выражение then действие else действие
if $msg contains 'error' then /var/log/error.log
if $msg contains "555" then { action(type="omfile" file="/var/log/555.log") } else { action(type="omfile" file="/var/log/non-555.log") }
if ($msg contains "important") then { action(type="omfile" file="/var/log/important.log" template="outfmt") } else if ($msg startswith "slow-query:") then { action(type="omfile" file="/var/log/slow-log.log" template="outfmt") } else { action(type="omfile" file="/var/log/general.log" template="outfmt") }
Шаблоны
Шаблоны позволяют задавать формат выводимой информации (1) и использовать динамические имена файлов логов (2). Шаблоны должны быть заданы до использования в правилах. Шаблоны, совместимые со стандартными форматами syslogd, жестко запрограммированы в rsyslogd — можно использовать любой из них по имени, например RSYSLOG_FileFormat.
# старый способ создания шаблона $template MyLogFormat,"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
# новый способ создания шаблона (тип string) template(name="MyLogFormat" type="string" string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" )
# новый способ создания шаблона (тип list) template(name="MyLogFormat" type="list") { property(name="timestamp" dateFormat="rfc3339") constant(value=" ") property(name="hostname") constant(value=" ") property(name="syslogtag") property(name="msg" spifno1stsp="on" ) property(name="msg" droplastlf="on" ) constant(value="\n") }
Жестко запрограммированные шаблоны, которые можно использовать
RSYSLOG_TraditionalFileFormat—"%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"RSYSLOG_FileFormat—"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"RSYSLOG_TraditionalForwardFormat—"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"RSYSLOG_SysklogdFileFormat—"%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg%\n"RSYSLOG_ForwardFormat—"<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"RSYSLOG_SyslogProtocol23Format—"<%PRI%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %APP-NAME% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n"
Шаблоны можно использовать для создания действий с динамическими именами файлов. Например, чтобы записывать сообщения с разных хостов в разные файлы — можно создать следующий шаблон.
# старый способ создания шаблона $template LogFileName,"/var/log/system-%HOSTNAME%.log"
# новый способ создания шаблона template(name="LogFileName" type="string" string="/var/log/system-%HOSTNAME%.log")
Наборы правил
Наборы правил — это контейнеры для правил. Один набор может содержать множество правил. По аналогии с языком программирования можно представить себе набор правил как программу. Набор правил может быть «привязан» к определенному входу. Это означает, что когда через этот вход поступает сообщение, привязанная к нему «программа» будет выполнена (но не будет выполнена для других входов).
module(load="imuxsock") module(load="imudp") ruleset(name="remote") { $template RemoteLogFile,"/var/log/remote/%fromhost%/%programname%.%syslogseverity-text%.log" *.* ?RemoteLogFile } ruleset(name="local") { $template LocalLogFile,"/var/log/local/%programname%.%syslogseverity-text%.log" *.* ?LocalLogFile } input(type="imudp" port="514" ruleset="remote") input(type="imuxsock" ruleset="local")
module(load="imuxsock") module(load="imtcp") # здесь глобальные директивы и правила для локальных сообщений ruleset(name="remote") { action(type="omfile" file="/var/log/remote/file.log") } input(type="imtcp" port="514" ruleset="remote")
module(load="imuxsock") module(load="imtcp") ruleset(name="remote10514") { action(type="omfile" file="/var/log/remote-10514") } ruleset(name="remote10515") { action(type="omfile" file="/var/log/remote-10515") } ruleset(name="remote10516") { if $syslogfacility-text == "mail" then { action(type="omfile" file="/var/log/mail-10516") # команда stop останавливает обработку сообщения и не # позволит записать его в файл /var/log/remote-10516 stop } action(type="omfile" file="/var/log/remote-10516") } input(type="imtcp" port="10514" ruleset="remote10514") input(type="imtcp" port="10515" ruleset="remote10515") input(type="imtcp" port="10516" ruleset="remote10516")
Из старого формата в новый
1. Конвертация правил
Пример старого формата правила — фильтр и действие
mail.info /var/log/mail.info.log
Примеры нового формата правила — фильтр и действие
mail.info action(type="omfile" file="/var/log/mail.info.log")
if $syslogfacility-text == "mail" and $syslogseverity-text == "info" then { action(type="omfile" file="/var/log/mail.info.log") }
2. Конвертация модулей
Пример старого формата загрузки модуля и установки для него параметров
$ModLoad imtcp $InputTCPMaxSession 500
Пример нового формата загрузки модуля и установки для него параметров
module(load="imtcp" maxSessions="500")
3. Конвертация действий
Примеры старого и нового формата действия
# старый формат, запись в файл cron.* /var/log/cron.log # новый формат, запись в файл cron.* action(type="omfile" file="/var/log/cron.log")
# старый формат, отправка по протоколу udp на другой хост cron.* @remote:514 # новый формат, отправка по протоколу udp на другой хост cron.* action(type="omfwd" target="remote" protocol="udp" port="514")
# старый формат, отправка по протоколу tcp на другой хост cron.* @@remote:514 # новый формат, отправка по протоколу tcp на другой хост cron.* action(type="omfwd" target="remote" protocol="tcp" port="514")
# старый формат, отправка сообщения пользователю username *.emerg :omusrmsg:username # новый формат, отправка сообщения пользователю username *.emerg action(type="omusrmsg" user="username")
4. Конвертация шаблонов
Примеры создания шаблона старым и новым способом
# старый способ создания шаблона $template MyLogFormat,"%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
# новый способ создания шаблона template(name="MyLogFormat" type="string" string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" )
Проверка правил
Если сообщения не записываются в указанные файлы — была допущена ошибка в правилах и требуется отладка. Давайте напишем скрипт, который будет отправлять сообщения c разным приоритетом severity. И создадим файл конфигурации /etc/rsyslog.d/10-test.conf, который будет их записывать в разные файлы.
#!/bin/bash logger -p mail.debug 'This is debug message' logger -p mail.info 'This is info message' logger -p mail.notice 'This is notice message' logger -p mail.warning 'This is warning message' logger -p mail.err 'This is err message' logger -p mail.crit 'This is crit message' logger -p mail.alert 'This is alert message' logger -p mail.emerg 'This is emerg message'
# все сообщения от mail, кроме notice, info и debug записывать в файл /var/log/mail.err.log # здесь второй, третий и четвертый фильтры сужают действие первого фильтра mail.*;mail.!=notice;mail.!=info;mail.!=debug /var/log/mail.err.log # сообщения от mail уровня notice, info и debug записывать в файл /var/log/mail.info.log # здесь второй и третий фильтры расширяют действие первого фильтра mail.=notice;mail.=info;mail.=debug /var/log/mail.info.log
Перезапустим службу rsyslog.service, чтобы применить новые настройки
$ sudo systemctl restart rsyslog.service
Запустим скрипт log.sh, который отправит сообщения службе rsyslog
$ ./log.sh
И посмотрим содержимое файлов /var/log/mail.err.log и /var/log/mail.info.log
$ cat /var/log/mail.err.log Nov 27 10:05:38 ubuntu-server evgeniy: This is warning message Nov 27 10:05:38 ubuntu-server evgeniy: This is err message Nov 27 10:05:38 ubuntu-server evgeniy: This is crit message Nov 27 10:05:38 ubuntu-server evgeniy: This is alert message Nov 27 10:05:38 ubuntu-server evgeniy: This is emerg message
$ cat /var/log/mail.info.log Nov 27 10:05:38 ubuntu-server evgeniy: This is debug message Nov 27 10:05:38 ubuntu-server evgeniy: This is info message Nov 27 10:05:38 ubuntu-server evgeniy: This is notice message
Когда все правила срабатывают, как и должны — удаляем файл конфигурации /etc/rsyslog.d/10-test.conf и перезапускаем службу rsyslog.service.
Отправка логов на удаленный сервер
Пусть у нас есть сервер для хранения логов и есть несколько клиентов, которые будут отправлять свои логи на этот сервер.
Для начала создаем файл /etc/rsyslog.d/10-remote.conf на всех клиентах
# все логи отправляем на сервер 192.168.110.32 по протоколу tcp (basic формат) *.* @@192.168.110.32:514
# все логи отправляем на сервер 192.168.110.32 по протоколу tcp (advanced формат) *.* action(type="omfwd" target="192.168.110.32" protocol="tcp" port="514")
На сервере убираем комментарий для директив в файле /etc/rsyslog.conf
# разрешить прием логов с удаленных клиентов по протоколу tcp module(load="imtcp") input(type="imtcp" port="514")
Собственно, на этом настройку можно завершить, только нужно перезагрузить службу rsyslog.service на сервере и клиенте.
$ sudo systemctl restart rsyslog.service
Но при этом все сообщения с клиентов будут записываться в файлы на log-сервере наравне с локальными сообщениями, с использованием правил для локальных сообщений. Это не слишком удобно для дальнейшего анализа логов. Поэтому создадим на сервере файл /etc/rsyslog.d/10-remote.conf.
$template RemoteLogFile,"/var/log/remote/%fromhost%/%programname%.%syslogseverity-text%.log" *.* ?RemoteLogFile & stop
Мы записываем логи каждого клиента в отдельную директорию внутри /var/log/remote. Каждая служба будет записывать сообщения в отдельный файл внутри этой директории. Кроме того, сообщения с разными severity будут записаны в разные файлы. После этого сообщение больше не обрабатывается.
Но в этом случае локальные сообщения сервера логов просто теряются — такой вариант нам не подходит. Давайте изменим файл 10-remote.conf таким образом, чтобы останавливать обработку правил только для сообщений с клиентов. А если это локальное сообщение — пусть оно проходит дальше и будет обработано правилами в файле 50-default.conf.
template(name="RemoteLogFile" type="string" string="/var/log/remote/%fromhost%/%programname%.%syslogseverity-text%.log" ) if $fromhost-ip contains "192.168.110." then { # модуль omfile встроенный, так что не нуждается в загрузке action(type="omfile" dynaFile="RemoteLogFile") stop }
Используя динамическое имя файла лога — мы разложили все сообщения по отдельным файлам. Представим теперь, что мы не хотим сохранять все сообщения — а только наиболее важные для нас.
template(name="RemoteAuthLogFile" type="string" string="/var/log/remote/%fromhost%/auth.log" ) template(name="RemoteSysLogFile" type="string" string="/var/log/remote/%fromhost%/sys.log" ) template(name="RemoteMailLogFile" type="string" string="/var/log/remote/%fromhost%/mail.log" ) if $fromhost-ip contains "192.168.110." then { if prifilt("auth,authpriv.*") then { action( type="omfile" dynaFile="RemoteAuthLogFile" template="RSYSLOG_TraditionalFileFormat" dirCreateMode="0755" ) stop } if prifilt("mail.warning") then { action( type="omfile" dynaFile="RemoteMailLogFile" template="RSYSLOG_TraditionalFileFormat" dirCreateMode="0755" ) stop } if prifilt("*.warning;auth,authpriv,mail.none") then { action( type="omfile" dynaFile="RemoteSysLogFile" template="RSYSLOG_TraditionalFileFormat" dirCreateMode="0755" ) } }
dirCreateMode="755". По умолчанию для объекта action значение dirCreateMode равно 0700. Хотя вроде бы в файле /etc/rsyslog.conf есть директива $DirCreateMode 0755. Но это как раз тот случай, когда есть конфликт между старыми и новыми директивами. $DirCreateMode действует глобально, если используется basic формат правил. Но мы используем объект action для создания действия — и глобальное значение игнорируется.
Кроме того, если мы не хотим на сервере логов хранить все сообщения — то и отправлять их с клиентов не нужно. Так что есть смысл отредактировать файлы конфигурации всех клиентов.
# сообщения warning и выше отправляем на сервер 192.168.110.32 по протоколу tcp (base формат) *.warning @@192.168.110.32:514
# сообщения warning и выше отправляем на сервер 192.168.110.32 по протоколу tcp (advanced формат) *.warning action(type="omfwd" target="192.168.110.32" protocol="tcp" port="514")
Службы rsyslog и journald
Служба rsyslogd может работать вместе со службой journald. Есть два способа настроить передачу сообщений в rsyslogd в системе с Systemd.
- Традиционно, cлужба
rsyslogdполучает локальные сообщения через сокет/dev/log— который сама и создает при запуске. Systemd заменяет/dev/logсимволической ссылкой на сокет/run/systemd/journal/dev-log. - Перенаправлять все сообщения Systemd в сокет
/run/systemd/journal/syslogс помощью опцииForwardToSyslogфайла конфигурации/etc/systemd/journald.conf.
В том и другом случае модуль imuxsock не нуждается в дополнительной настройке. В первом случае — модуль будет получать сообщения из /dev/log (который на самом деле /run/systemd/journal/dev-log). Во втором случае — модуль будет получать сообщения из /run/systemd/journal/syslog. При этом rsyslogd не будет пытаться создать или удалить сокет при запуске и остановке, потому что теперь за это отвечает Systemd.
- Postfix и Dovecot. Установка и настройка. Часть 2 из 2
- Postfix и Dovecot. Установка и настройка. Часть 1 из 2
- PHP-FPM. Установка и настройка
- Apache2. Установка и настройка. Часть 1 из 2
- Dante. Установка и настройка прокси-сервера
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка WireGuard на Ubuntu 20.04 LTS. Часть первая из двух
Поиск: Linux • Конфигурация • Настройка • Сервер • rsyslog • error • warning • notice