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.con.

#  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 — сообщения от службы FTP
  • mail — сообщения от почтовой службы
  • mark — проверочные сообщения, формируемые службой rsyslog
  • syslog — сообщения от службы rsyslog
  • uucp — копирование файлов между компьютерами (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.

Поиск: Linux • Конфигурация • Настройка • Сервер

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.