TL; DR - отправлять определенные журналы с помощью rsyslog (на сервер Redis): как выбрать журналы для отправки?
Я хочу переслать на сервер Redis набор (и только этот набор) журналов, например, nginx входит в систему /var/log/nginx/*.log
. Для этого я думал использовать rsyslog средство (local7 в моем примере). Тем не мение :
local7.*
журналы на сервер Redis: я получаю все журналы системы (auth, authpriv, cron, local7 и т. д.)/var/log/nginx/*.log
не сработает но /var/log/nginx/some-access.log
будет отправлено на мой сервер Redis через rsyslog. Как же тогда получить все логи одной директории?)Конфигурация использует три модуля и отправляет журналы с 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 в конфигурацию, так как его легко найти в Интернете, и он занимает здесь лишнее место.