转发特定日志 rsyslog

转发特定日志 rsyslog

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会由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.*authpriv.* @redis_ip:port对 rsyslog 没有影响一样。

我启动 rsyslog/usr/local/sbin/rsyslog -f /etc/rsyslog.conf并使用选项 -N1 检查它,结果显示一切正确。

我检查过的问题对我来说没有任何改变:

答案1

由于我终于完成了一些工作,并且可能知道我的错误出在哪里,因此这里是我自己问题的答案:

$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”添加到配置中,因为可以在互联网上轻松找到它,而且它会占用一些不必要的空间。

相关内容