TL;DR - 使用 rsyslog 发送特定日志(到 redis 服务器):如何选择要发送的日志?
我想向 redis 服务器转发一组(并且只有那组)日志,例如 nginx logs in /var/log/nginx/*.log
。为此,我正在考虑使用 rsyslog工具(在我的示例中为 local7)。然而 :
- 我不能只处理
local7.*
到 redis 服务器的日志:我收到了系统的所有日志(auth、authpriv、cron、local7 等) - 我无法处理一个目录的所有日志(例如:
/var/log/nginx/*.log
不会工作但/var/log/nginx/some-access.log
会通过rsyslog发送到我的redis服务器。那么如何获取一个目录的所有日志?)
配置使用了三个模块,并以这种方式将日志从 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
)
- Rsyslog 8.16.0,使用模块 omhiredis 从源构建(用于输出到 Redis)
- Debian 8
笔记
例如,如果我只是删除配置 1 或配置 2 并使用authpriv.* @redis_ip:port
,我仍然会获取所有日志(因此来自设施syslog、cron、auth、authpriv 等的日志)就好像 authpriv.* inauthpriv.* @redis_ip:port
对 rsyslog 没有影响一样。
我从/usr/local/sbin/rsyslog -f /etc/rsyslog.conf
rsyslog 开始并使用选项 -N1 检查它说它是正确的。
我检查过的问题对我没有任何改变:
由于我终于得到了一些工作,并且可能我知道我的错误在哪里,这里是我自己问题的答案:
允许我发送 nginx access.log 并且只发送那些到我的 redis 服务器。
我的错误来自不受if 语句限制的块操作(..) 。因此,它正在发送所有日志。
authpriv.* @redis_ip:port
这解释了我在哪里不会改变任何东西的问题中的第一个注释。答案: action(..) 将发送日志,即使其中没有定义服务器,所以用 if 语句将其包围以选择转发哪些日志。
注意:我没有将模板“jsonlines”添加到配置中,因为人们可以很容易地在互联网上找到它,而且这里会占用一些不必要的空间。