我正在尝试配置我的 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