it-swarm.com.de

Wie kann ich rsyslogd dazu bringen, den vollqualifizierten Domänennamen eines Servers anstelle seines kurzen Hostnamens zu protokollieren?

Ich versuche, einen einfachen zentralisierten Syslog-Server mit stock rsyslogd (4.2.0-2ubuntu8.1) unter Ubuntu 10.04 LTS zu implementieren. Zu diesem Zeitpunkt senden alle meine Clientknoten Protokolle an den zentralen Server, aber die Clients senden Protokollnachrichten, die ihren kurzen Hostnamen anstelle ihres vollqualifizierten Domänennamens enthalten.

Per der Ubuntu rsyslogd Manpage:

Befindet sich der Remote-Host in derselben Domäne wie der Host, auf dem rsyslogd ausgeführt wird, wird nur der einfache Hostname anstelle des gesamten fqdn protokolliert.

Dies ist für mich problematisch, da ich Kurznamen zwischen Umgebungen wiederverwenden kann, z. core1.example.com und core1.stg.example.com protokollieren beide ihre Nachrichten als core1.

Sowohl Client als auch Server haben dasselbe/etc/default/rsyslog:

RSYSLOGD_OPTIONS="-c4"

und dieselbe /etc/rsyslogd.conf-Datei:

$ModLoad imuxsock
$ModLoad imklog
$PreserveFQDN on
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$IncludeConfig /etc/rsyslog.d/*.conf

Clients verfügen über diese Datei /etc/rsyslog.d/remote.conf, in der sie aufgefordert werden, diese an den Remote-Server zu senden:

*.* @@syslog.example.com

und der Server verwendet diese Datei /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

Da sowohl Client als auch Server eine Konfiguration gemeinsam nutzen, in der "$ PreserveFQDN on" angegeben ist, erwarte ich, dass FQDN-Hostnamen in Syslog-Nachrichten angezeigt werden, aber die Einstellung scheint keine Auswirkungen gehabt zu haben. Die meisten anderen Einstellungen, die ich für rsyslog gefunden habe, zielen darauf ab, Domänen von FQDNs zu entfernen, anstatt sie beizubehalten. Ich denke, die Wurzel des Problems ist, dass meine Clients den vollqualifizierten Domänennamen nicht an erster Stelle senden, aber ich sehe nicht, wie ich dieses Verhalten erzwingen kann.

Kann jemand kommentieren, was mir fehlen könnte? Ich stelle mir vor, ich bin nicht die einzige Person, die FQDNs benötigt, um in Protokollnachrichten enthalten zu sein.

22
cwjohnston

Ich bin auch auf dieses Problem gestoßen. Hier ist, wie ich es beheben konnte.

  1. Ändern Sie auf den Clients die Datei/etc/hosts so, dass der gewünschte Hostname vor localhost steht.

    127.0.0.1 Hostnameforlogs localhost

  2. Ändern Sie auf den Clients und dem Server /etc/rsyslog.conf, um diese Anweisung einzuschließen:

    $ PreserveFQDN ein

  3. Auf dem Server habe ich die Variable% HOSTNAME% für die Vorlagen in rsyslog.conf verwendet:

41
Matt McMillan

Um den Hostnamen zu ändern, den rsyslog sendet, fügen Sie die folgende Anweisung als allererste Zeile in /etc/rsyslog.conf hinzu, bevor Module geladen werden:

$LocalHostName yourhostname

Verwenden Sie alternativ die Anweisung, damit rsyslog mit dem vollqualifizierten Domänennamen (FQDN, z. B. system1.example.com) anstelle des Hostnamens (system1) gesendet wird:

$PreserveFQDN on

Dies wird selten benötigt. Wir empfehlen die Verwendung des Hostnamens (ohne den Domänennamen), es sei denn, Sie haben Systeme mit identischem Namen.

Eine alternative Möglichkeit zum Festlegen (mit der Sie verschiedene Protokolle als unterschiedliche Hostnamen senden können) besteht darin, eine benutzerdefinierte Vorlage festzulegen:

$template MyTemplate, "<%pri%> %timestamp% MySpoofedHostName %syslogtag% %msg%\n"
$ActionForwardDefaultTemplate MyTemplate
7
Emilio Macias

Es könnte ein Fehler sein. FQDN-Unterstützung ist oder war bekanntermaßen wackelig , obwohl keiner der registrierten FQDN-Fehler zuzutreffen scheint.

Wenn Sie keine Weiterleitung durchführen, verwenden Sie als Problemumgehung %FROMHOST% Anstelle von% HOSTNAME%.

Ich kann nur mit 7.6.x sprechen, aber $PreserveFQDN war alles, was es brauchte, um zu funktionieren. Sie können vermeiden, sich mit /etc/hosts wenn der vollqualifizierte Domänenname Ihres Knotens korrekt eingerichtet ist.

Beispiel für CentOS/RHEL-Systeme:

$ -> vi /etc/sysconfig/network

# Change this
HOSTNAME=service-a-1

# To this
HOSTNAME=service-a-1.sn1.vpc3.example.com

Stellen Sie sicher, dass Sie neu starten.

0
Mike Purcell

Sie können dies in der clientseitigen rsyslog-Konfiguration verwenden.

$LocalHostName {{HOSTNAME}}

und ersetzen Sie {{HOSTNAME}} mit dem gewünschten Hostnamen oder Sie können ihn auf jedem Client mit Schnurrbart automatisch detemplatisieren.

0
Rahul Shaw