我试图在Ubuntu 10.04 LTS上使用股票rsyslogd(4.2.0-2ubuntu8.1)来实现一个简单的集中式系统日志服务器。 此时,我的所有客户端节点都将日志发送到中央服务器,但客户端正在发送包含其短主机名而不是其FQDN的日志消息。
根据Ubuntu rsyslogd手册页:
如果远程主机与主机位于同一个域中,则rsyslogd正在运行,只会logging简单的主机名而不是整个fqdn。
这对我来说是有问题的,因为我正在重复使用环境之间的短名称,例如core1.example.com和core1.stg.example.com都将它们的消息logging为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”的configuration,所以我希望在系统日志消息中看到FQDN主机名,但是这个设置似乎没有效果。 我为rsyslogfind的大多数其他设置旨在从FQDN剥离域而不是保留它们。 我认为问题的根源在于我的客户首先不会发送FQDN,但我不知道如何强制这种行为。
任何人都可以评论我可能会失踪? 我想我不是唯一需要将FQDN包含在日志消息中的人。
我也遇到了这个问题。 这是我能够解决这个问题。
在客户端上修改/ etc / hosts文件,以便所需的主机名在localhost之前。
127.0.0.1 hostnameforlogs localhost
在客户端和服务器上修改/etc/rsyslog.conf来包含这个语句:
$ PreserveFQDN
在服务器上,我使用rsyslog.conf中模板的%HOSTNAME%variables:
这可能是一个错误。 FQDN的支持是或已知是不可靠的 ,虽然没有注册的FQDN错误似乎适用。
作为一种解决方法,如果您不进行任何中继,请使用%FROMHOST%
而不是%HOSTNAME%。
要更改主机名rsyslog发送,请在加载任何模块之前将以下指令添加为/etc/rsyslog.conf中的第一行:
$LocalHostName yourhostname
或者,要让rsyslog使用完全限定的域名(FQDN,如system1.example.com)而不是主机名(system1)发送,请使用以下指令:
$PreserveFQDN on
这是很less需要的。 我们build议使用主机名(不带域名),除非您有相同名称的系统。
设置它的另一种方法(允许您以不同的主机名发送不同的日志)是通过设置一个自定义模板:
$template MyTemplate, "<%pri%> %timestamp% MySpoofedHostName %syslogtag% %msg%\n" $ActionForwardDefaultTemplate MyTemplate
我只能说7.6.x,但$PreserveFQDN
是它所需要的所有工作。 如果您的节点的FQDN设置正确,您可以避免与/etc/hosts
混淆。
CentOS / RHEL系统示例:
$ -> vi /etc/sysconfig/network # Change this HOSTNAME=service-a-1 # To this HOSTNAME=service-a-1.sn1.vpc3.example.com
一定要重新启动。
你可以在客户端rsyslogconfiguration中使用它。
$LocalHostName {{HOSTNAME}}
并用所需的主机名replace{{HOSTNAME}}
,或者您可以使用胡子自动在每个客户端上对其进行打开。