我试图configuration我的rsyslog客户端将消息转发到我的syslog-ng日志存储库系统。 转发邮件“开箱即用”,但是我的客户正在logging简称,而不是FQDN。 因此,syslog repo上的消息也使用短名称,这是一个问题,因为不能容易地确定消息来自哪个系统。 我的客户通过DHCP / DNS获取他们的名字。
我尝试了很多解决scheme,试图让这个工作,但没有成功。 我正在使用rsyslog 4.6.2和syslog-ng 3.2.5。
我已经尝试将$PreserveFQDN on设置$PreserveFQDN on /etc/rsyslog.conf中的第一个指令(并重新启动rsyslog)。 这似乎没有效果。
hostname --fqdn在客户端返回正确的FQDN,所以问题不在于系统能否真正找出自己的FQDN。
$LocalHostName <fqdn>看起来很有希望,但是这个指令在我的rsyslog版本中不可用(自4.7.4+,5.7.3+,6.1.3+可用)。 升级目前不是一种select。
configurationsyslog-ng服务器以基于通过DNS的反向查找来填充名称不是一个选项。 反向DNS和公有云存在复杂性。
指定转发器使用自定义模板看起来像是一个可行的选项乍一看。 我可以指定以下内容,这将导致本地日志logging开始使用syslog-ng回购的FQDN。
$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%" $ActionForwardDefaultTemplate MyTemplate
但是,当我把这个地方,syslog ng似乎无法按设施或优先级分类消息。 消息以FQDNforms出现,但所有内容都放在user.log中。 当我不使用自定义模板时,消息在设施和优先级下正确分类,但名称简短。
所以,总而言之,如果我手动把rsyslog诱骗到包含FQDN,那么优先级和设施就会丢失syslog-ng的细节。 我怎样才能得到rsyslog做FQDN日志logging工作正常去syslog-ng存储库?
rsyslog客户端configuration:
$ModLoad imuxsock.so # provides support for local system logging (eg 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-ngconfiguration(简要摘录):
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); };
好的,我find了一个方法。 事实certificate,$ ActionForwardDefaultTemplate默认设置为:
$ActionForwardDefaultTemplate RSYSLOG_ForwardFormat
根据这个 RSYSLOG_ForwardFormat 文档 , RSYSLOG_ForwardFormat专门用于维护不同系统日志之间的互操作性。 没有令人震惊的是,如果你修改了这个Forward模板,就像我之前描述的那样,其他syslogs的一些function会中断:
$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%" $ActionForwardDefaultTemplate MyTemplate
我find的解决方法是挖掘RSYSLOG_ForwardFormat使用的后端模板并模仿它。 在挖掘源代码之后,我终于发现RSYSLOG_ForwardFormat实际上是这样的:
"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
因此,如果我使用几乎相同的内容创build了一个自定义模板,但是将我的FQDNreplace为%HOSTNAME%macros,那么syslog-ng设施分离将正常工作,而系统将使用FQDN进行日志logging:
$template MyForwardTemplate, "<%PRI%>%TIMESTAMP% <fqdn> %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%" $ActionForwardDefaultTemplate MyForwardTemplate