我正在尝试使用 Ubuntu 10.04 LTS 上的常规 rsyslogd (4.2.0-2ubuntu8.1) 实现一个简单的集中式 syslog 服务器。此时,我已将所有客户端节点都发送日志到中央服务器,但客户端发送的日志消息包含其短主机名而不是 FQDN。
根据 Ubuntu rsyslogd 手册页:
如果远程主机与运行 rsyslogd 的主机位于同一域中,则只会记录简单主机名,而不是整个 fqdn。
这对我来说是有问题的,因为我在环境之间重复使用了短名称,例如 core1.example.com 和 core1.stg.example.com 都将其消息记录为 core1。
客户端和服务器都有相同的 /etc/default/rsyslog:
RSYSLOGD_OPTIONS="-c4"
和相同的 /etc/rsyslogd.conf 文件:
$ModLoad imuxsock
$ModLoad imklog
$PreserveFQDN on
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$IncludeConfig /etc/rsyslog.d/*.conf
客户端有这个 /etc/rsyslog.d/remote.conf 文件,告诉它们发送到远程服务器:
*.* @@syslog.example.com
并且服务器使用此 /etc/rsyslog.d/server.conf 文件:
$ModLoad imtcp
$InputTCPServerRun 514
$DirGroup root
$DirCreateMode 0755
$FileGroup root
$template PerHostAuth,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/auth.log"
$template PerHostCron,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/cron.log"
$template PerHostSyslog,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/syslog"
$template PerHostDaemon,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/daemon.log"
$template PerHostKern,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/kern.log"
$template PerHostLpr,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/lpr.log"
$template PerHostUser,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/user.log"
$template PerHostMail,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/mail.log"
$template PerHostMailInfo,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/mail.info"
$template PerHostMailWarn,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/mail.warn"
$template PerHostMailErr,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/mail.err"
$template PerHostNewsCrit,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/news.crit"
$template PerHostNewsErr,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/news.err"
$template PerHostNewsNotice,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/news.notice"
$template PerHostDebug,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/debug"
$template PerHostMessages,"/srv/rsyslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages"
auth,authpriv.* ?PerHostAuth
*.*;auth,authpriv.none -?PerHostSyslog
cron.* ?PerHostCron
daemon.* -?PerHostDaemon
kern.* -?PerHostKern
lpr.* -?PerHostLpr
mail.* -?PerHostMail
user.* -?PerHostUser
mail.info -?PerHostMailInfo
mail.warn ?PerHostMailWarn
mail.err ?PerHostMailErr
news.crit ?PerHostNewsCrit
news.err ?PerHostNewsErr
news.notice -?PerHostNewsNotice
*.=debug;\
auth,authpriv.none;\
news.none;mail.none -?PerHostDebug
*.=info;*.=notice;*.=warn;\
auth,authpriv.none;\
cron,daemon.none;\
mail,news.none -?PerHostMessages
由于客户端和服务器共享一个指定“$PreserveFQDN on”的配置,我期望在系统日志消息中看到 FQDN 主机名,但该设置似乎没有效果。我发现 rsyslog 的大多数其他设置都旨在从 FQDN 中删除域而不是保留它们。我认为问题的根源是我的客户端首先不发送 FQDN,但我不知道如何强制这种行为。
有人能评论一下我可能遗漏了什么吗?我想我不是唯一一个需要在日志消息中包含 FQDN 的人。
答案1
我也遇到了这个问题。下面是我修复它的方法。
在客户端上修改 /etc/hosts 文件,使得所需的主机名位于 localhost 之前。
127.0.0.1 hostnameforlogs 本地主机
在客户端和服务器上修改 /etc/rsyslog.conf 以包含以下语句:
$PreserveFQDN 开启
在服务器上,我使用 rsyslog.conf 中的模板的 %HOSTNAME% 变量:
答案2
要更改 rsyslog 发送的主机名,请在加载任何模块之前在 /etc/rsyslog.conf 中添加以下指令作为第一行:
$LocalHostName yourhostname
或者,要让 rsyslog 使用完全限定域名 (FQDN,例如 system1.example.com) 而不是简单的主机名 (system1) 发送,请使用以下指令:
$PreserveFQDN on
这很少需要。我们建议使用主机名(不带域名),除非您有同名的系统。
另一种设置方法(允许您以不同的主机名发送不同的日志)是设置自定义模板:
$template MyTemplate, "<%pri%> %timestamp% MySpoofedHostName %syslogtag% %msg%\n"
$ActionForwardDefaultTemplate MyTemplate
答案3
这可能是一个错误。FQDN 支持存在问题(或已知存在问题),尽管没有一个注册 FQDN 错误似乎适用。
作为一种解决方法,如果您不进行任何中继,请使用%FROMHOST%
而不是 %HOSTNAME%。
答案4
You can use this in client side rsyslog config.
$LocalHostName {{HOSTNAME}}
and replace {{HOSTNAME}}
with the desired hostname or you can detemplatize it on each of the client using mustache automatically.