将 rsyslog 转发到 syslog-ng,并分离 FQDN 和设备

将 rsyslog 转发到 syslog-ng,并分离 FQDN 和设备

我正在尝试配置我的 rsyslog 客户端以将消息转发到我的 syslog-ng 日志存储库系统。转发消息“开箱即用”,但我的客户端正在记录短名称,而不是 FQDN。因此,syslog 存储库上的消息也使用短名称,这是一个问题,因为无法轻松确定消息来自哪个系统。我的客户端通过 DHCP/DNS 获取其名称。

我尝试了很多解决方案,但都没有成功。我使用的是 rsyslog 4.6.2 和 syslog-ng 3.2.5。

我尝试将其设置$PreserveFQDN on为 /etc/rsyslog.conf 中的第一个指令(当然还要重新启动 rsyslog)。但似乎没有效果。

hostname --fqdn客户端返回正确的 FQDN,因此问题不在于系统是否真正能够找出自己的 FQDN。

$LocalHostName <fqdn>看起来很有希望,但这个指令在我的 rsyslog 版本中不可用(自 4.7.4+、5.7.3+、6.1.3+ 起可用)。目前无法升级。

配置 syslog-ng 服务器以通过 DNS 进行反向查找来填充名称不是一个选项。反向 DNS 和公共云存在复杂性。

乍一看,指定转发器使用自定义模板似乎是一个可行的选择。我可以指定以下内容,这会导致本地日志记录开始使用 syslog-ng repo 上的 FQDN。

$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%"
$ActionForwardDefaultTemplate MyTemplate

但是,当我实施此功能时,syslog-ng 似乎无法按设施或优先级对消息进行分类。消息以 FQDN 形式传入,但所有内容都放入 user.log 中。当我不使用自定义模板时,消息会根据设施和优先级正确分类,但使用简称。

因此,总而言之,如果我手动欺骗 rsyslog 包含 FQDN,优先级和设施将成为 syslog-ng 丢失的详细信息。我如何才能让 rsyslog 执行 FQDN 日志记录,并正确地转到 syslog-ng 存储库?

rsyslog 客户端配置:

$ModLoad imuxsock.so    # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so      # provides kernel logging support (previously done by rklogd)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 *
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log
$WorkDirectory /var/spool/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList   # run asynchronously
$ActionResumeRetryCount -1    # infinite retries if host is down
*.* @syslog-ng1.example.com
*.* @syslog-ng2.example.com

syslog-ng 配置(为简洁起见,略作删减):

options {
    flush_lines (0);
    time_reopen (10);
    log_fifo_size (1000);
    long_hostnames (off);
    use_dns (no);
    use_fqdn (yes);
    create_dirs (no);
    keep_hostname (yes);
};
source src {
    unix-stream("/dev/log");
    internal();
    udp(ip(0.0.0.0) port(514));
};
destination per_host_destination {
file( "/var/log/syslog-ng/devices/$HOST/$FACILITY.log" owner("root") group("root")  perm(0644) dir_owner(root) dir_group(root) dir_perm(0775) create_dirs(yes));
};
log { source(src); destination(per_facility_destination); };

答案1

好吧,我找到办法了。原来 $ActionForwardDefaultTemplate 默认设置为:

$ActionForwardDefaultTemplate RSYSLOG_ForwardFormat

这个 rsyslog 文档RSYSLOG_ForwardFormat专门用于维护不同系统日志之间的互操作性。如果您按照我最初描述的方式修改此 Forward 模板,其他系统日志的某些功能就会中断,这并不令人意外:

$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%"
$ActionForwardDefaultTemplate MyTemplate

我发现的解决方法是挖掘使用并模仿它的后端模板RSYSLOG_ForwardFormat。在深入研究源代码后,我最终发现它RSYSLOG_ForwardFormat实际上是这样的:

"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"

因此,如果我创建一个具有几乎相同内容的自定义模板,但用我的 FQDN 代替宏%HOSTNAME%,则 syslog-ng 设施分离可以正常工作,并且系统使用 FQDN 记录:

$template MyForwardTemplate, "<%PRI%>%TIMESTAMP% <fqdn> %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
$ActionForwardDefaultTemplate MyForwardTemplate

相关内容