Назад | Перейти на главную страницу

Пересылка определенных журналов rsyslog

TL; DR - отправлять определенные журналы с помощью rsyslog (на сервер Redis): как выбрать журналы для отправки?

Я хочу переслать на сервер Redis набор (и только этот набор) журналов, например, nginx входит в систему /var/log/nginx/*.log. Для этого я думал использовать rsyslog средство (local7 в моем примере). Тем не мение :

Конфигурация использует три модуля и отправляет журналы с local7 на мой сервер Redis следующим образом:

local7.* @redis_ip:port
$ModLoad imuxsock # provides support for local system logging
$ModLoad omhiredis # support for sending to Redis
$ModLoad imfile # For tailing files

Два других блока кода - это два разных способа настройки rsyslog, с которыми я столкнулся.

Конфигурация 1 (рекомендуют обычные люди конфигурации):

$InputFileName /var/log/nginx/*.log
$InputFileTag nginx
$InputFileFacility local7
$InputRunFileMonitor

Конфиг 2 (другой синтаксис - тот, который я нашел в документации rsyslog для версии 8.16.0):

input(
  type="imfile"
  File="/var/log/nginx/*.log"
  Tag="nginx:"
  Facility="local7"
)

Для вывода в redis:

action(
  name="rsyslog_redis"
  type="omhiredis"
  mode="queue"
  key="rsyslog_redis_key"
  template="jsonlines"  # use a JSON template defined below
)

Заметка

Если я просто удалю конфигурацию 1 или конфигурацию 2 и использую authpriv.* @redis_ip:port например, я все равно буду получать все журналы (так что журналы из средство syslog, cron, auth, authpriv и т. д.), как если бы authpriv. * в authpriv.* @redis_ip:port не повлиял на rsyslog.

Я запускаю rsyslog с /usr/local/sbin/rsyslog -f /etc/rsyslog.conf и проверка с помощью опции -N1 говорит, что все правильно.

Вопросы, которые я проверил, для меня ничего не изменили:

Поскольку у меня наконец-то что-то работает и, вероятно, я знаю, в чем была моя ошибка, вот ответ на мой собственный вопрос:

$ModLoad imuxsock # provides support for local system logging
$ModLoad omhiredis # support for sending to Redis
$ModLoad imfile # For tailing files

if $syslogtag == "nginx:" then {
  action(
    name="rsyslog_redis"
    server="redis_ip"
    port="redis_port"
    type="omhiredis"
    mode="queue"
    key="rsyslog_redis" # we need the same key in Logstash's config
    template="jsonlines"  # use the JSON template defined below
  )
}

input(
  type="imfile"
  File="/var/log/nginx/access.log"
  Tag="nginx:"
)

позволяет мне отправлять nginx access.log и только те на мой сервер Redis.

Моя ошибка возникла из-за блока действие (..) это не было ограничено оператором if. Поэтому он отправлял все журналы. Это объясняет мою первую заметку в вопросе, где authpriv.* @redis_ip:port ничего бы не изменил.

Ответ : action (..) будет отправлять журналы, даже если в нем не определен сервер, поэтому окружите его операторами if, чтобы выбрать, какие журналы будут пересылаться.

Примечание: я не добавлял шаблон jsonlines в конфигурацию, так как его легко найти в Интернете, и он занимает здесь лишнее место.