web-dev-qa-db-fra.com

Comment puis-je obtenir rsyslogd pour enregistrer le nom de domaine complet d'un serveur au lieu de son nom d'hôte court?

J'essaie d'implémenter un serveur syslog centralisé simple en utilisant rsyslogd (4.2.0-2ubuntu8.1) sur Ubuntu 10.04 LTS. À ce stade, tous mes nœuds clients envoient des journaux au serveur central, mais les clients envoient des messages de journal qui contiennent leur nom d'hôte court au lieu de leur nom de domaine complet.

Selon la page de manuel Ubuntu rsyslogd:

Si l'hôte distant se trouve dans le même domaine que l'hôte, rsyslogd s'exécute sur, seul le nom d'hôte simple sera enregistré au lieu du fqdn entier.

C'est problématique pour moi, car je réutilise des noms courts entre les environnements, par exemple core1.example.com et core1.stg.example.com enregistrent tous les deux leurs messages en tant que core1.

Le client et le serveur ont le même/etc/default/rsyslog:

RSYSLOGD_OPTIONS="-c4"

et le même fichier /etc/rsyslogd.conf:

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

Les clients ont ce fichier /etc/rsyslog.d/remote.conf, leur disant d'envoyer au serveur distant:

*.* @@syslog.example.com

et le serveur utilise ce fichier /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

Comme le client et le serveur partagent une configuration qui spécifie "$ PreserveFQDN on", je m'attends à voir les noms d'hôte FQDN dans les messages syslog, mais le paramètre semble n'avoir eu aucun effet. La plupart des autres paramètres que j'ai trouvés pour rsyslog visent à supprimer les domaines des FQDN au lieu de les conserver. Je pense que la racine du problème est que mes clients n'envoient pas le FQDN en premier lieu, mais je ne vois pas comment forcer ce comportement.

Quelqu'un peut-il commenter ce que je pourrais manquer? J'imagine que je ne suis pas la seule personne qui a besoin de noms de domaine complets pour être inclus dans les messages de journal.

22
cwjohnston

J'ai également rencontré ce problème. Voici comment j'ai pu le réparer.

  1. Sur les clients, modifiez le fichier/etc/hosts de sorte que le nom d'hôte souhaité passe avant localhost.

    127.0.0.1 hostnameforlogs localhost

  2. Sur les clients et le serveur, modifiez /etc/rsyslog.conf pour inclure cette instruction:

    $ PreserveFQDN sur

  3. Sur le serveur, j'ai utilisé la variable% HOSTNAME% pour les modèles dans rsyslog.conf:

41
Matt McMillan

Pour modifier le nom d'hôte envoyé par rsyslog, ajoutez la directive suivante en tant que toute première ligne dans /etc/rsyslog.conf avant le chargement des modules:

$LocalHostName yourhostname

Alternativement, pour que rsyslog envoie avec le nom de domaine complet (FQDN, tel que system1.example.com) au lieu du simple nom d'hôte (system1), utilisez la directive:

$PreserveFQDN on

Cela est rarement nécessaire. Nous vous recommandons d'utiliser le nom d'hôte (sans le nom de domaine) sauf si vous avez des systèmes portant le même nom.

Une autre façon de le définir (qui vous permet d'envoyer différents journaux sous différents noms d'hôte) consiste à définir un modèle personnalisé:

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

Ce pourrait être un bug. Le support FQDN est ou était connu pour être bancal , bien qu'aucun des bogues FQDN enregistrés ne semble s'appliquer.

Comme solution de contournement, si vous ne faites aucun relais, utilisez %FROMHOST% au lieu de% HOSTNAME%.

Je ne peux parler qu'à 7.6.x, mais $PreserveFQDN était tout ce qu'il fallait pour que cela fonctionne. Vous pouvez éviter d'avoir à jouer avec /etc/hosts si le nom de domaine complet de votre nœud est correctement configuré.

Exemple pour les systèmes CentOS/RHEL:

$ -> vi /etc/sysconfig/network

# Change this
HOSTNAME=service-a-1

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

Assurez-vous de redémarrer.

0
Mike Purcell

Vous pouvez l'utiliser dans la configuration rsyslog côté client.

$LocalHostName {{HOSTNAME}}

et remplacez {{HOSTNAME}} avec le nom d'hôte souhaité ou vous pouvez le modéliser sur chacun des clients en utilisant moustache automatiquement.

0
Rahul Shaw