如何让 rsyslogd 记录服务器的 FQDN 而不是它的短主机名?

cwj*_*ton 25 ubuntu logging rsyslog

我正在尝试在 Ubuntu 10.04 LTS 上使用股票 rsyslogd (4.2.0-2ubuntu8.1) 实现一个简单的集中式系统日志服务器。在这一点上,我的所有客户端节点都将日志发送到中央服务器,但是客户端发送的日志消息包含它们的短主机名而不是它们的 FQDN。

根据 Ubuntu rsyslogd 联机帮助页:

如果远程主机与主机位于同一域中,rsyslogd 正在运行,则只会记录简单的主机名而不是整个 fqdn。

这对我来说是有问题的,因为我在环境之间重复使用短名称,例如 core1.example.com 和 core1.stg.example.com 都将它们的消息记录为 core1。

客户端和服务器都有相同的 /etc/default/rsyslog:

RSYSLOGD_OPTIONS="-c4"
Run Code Online (Sandbox Code Playgroud)

和相同的 /etc/rsyslogd.conf 文件:

$ModLoad imuxsock
$ModLoad imklog
$PreserveFQDN on
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$IncludeConfig /etc/rsyslog.d/*.conf
Run Code Online (Sandbox Code Playgroud)

客户端有这个 /etc/rsyslog.d/remote.conf 文件,告诉他们发送到远程服务器:

*.* @@syslog.example.com
Run Code Online (Sandbox Code Playgroud)

并且服务器使用这个 /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
Run Code Online (Sandbox Code Playgroud)

由于客户端和服务器共享一个指定“$PreserveFQDN on”的配置,我希望在系统日志消息中看到 FQDN 主机名,但该设置似乎没有效果。我为 rsyslog 找到的大多数其他设置旨在从 FQDN 中剥离域而不是保留它们。我认为问题的根源在于我的客户首先不发送 FQDN,但我不知道如何强制这种行为。

任何人都可以评论我可能缺少的东西吗?我想我不是唯一需要在日志消息中包含 FQDN 的人。

小智 45

我也遇到了这个问题。这是我修复它的方法。

  1. 在客户端上修改 /etc/hosts 文件,使所需的主机名出现在 localhost 之前。

    127.0.0.1 主机名forlogs localhost

  2. 在客户端和服务器上修改 /etc/rsyslog.conf 以包含以下语句:

    $PreserveFQDN 开启

  3. 在服务器上,我将 %HOSTNAME% 变量用于 rsyslog.conf 中的模板:


小智 9

要更改 rsyslog 发送的主机名,请在加载任何模块之前将以下指令添加为 /etc/rsyslog.conf 中的第一行:

$LocalHostName yourhostname
Run Code Online (Sandbox Code Playgroud)

或者,要让 rsyslog 使用完全限定的域名(FQDN,例如 system1.example.com)而不是简单的主机名(system1)发送,请使用指令:

$PreserveFQDN on
Run Code Online (Sandbox Code Playgroud)

这很少需要。我们建议使用主机名(不带域名),除非您有同名的系统。

设置它的另一种方法(允许您将不同的日志作为不同的主机名发送)是通过设置自定义模板:

$template MyTemplate, "<%pri%> %timestamp% MySpoofedHostName %syslogtag% %msg%\n"
$ActionForwardDefaultTemplate MyTemplate
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 5

这可能是一个错误。尽管已注册的 FQDN 错误似乎都不适用,但FQDN 支持现在或过去都不稳定。

作为解决方法,如果您不执行任何中继,请使用%FROMHOST%%HOSTNAME%。

  • 使用“%FROMHOST%”确实给了我一个 FQDN,但它似乎是对客户端节点的 IP 地址进行反向查找的结果。由于我的系统在 AWS EC2 上运行,不幸的是,这总是会产生一个对我没有直接意义的 FQDN。 (2认同)