¿Cómo consigo que rsyslogd registre el FQDN de un servidor en lugar de su nombre de host corto?

22

Estoy tratando de implementar un servidor syslog centralizado simple usando stock rsyslogd (4.2.0-2ubuntu8.1) en Ubuntu 10.04 LTS. En este punto, todos mis nodos de cliente envían registros al servidor central, pero los clientes envían mensajes de registro que contienen su nombre de host corto en lugar de su FQDN.

Según la página de manual de Ubuntu rsyslogd:

Si el host remoto se encuentra en el mismo dominio que el host, rsyslogd se está ejecutando, solo se registrará el nombre de host simple en lugar del fqdn completo.

Esto es problemático para mí, ya que estoy reutilizando nombres cortos entre entornos, por ejemplo, core1.example.com y core1.stg.example.com, ambos registran sus mensajes como core1.

Tanto el cliente como el servidor tienen el mismo / etc / default / rsyslog:

RSYSLOGD_OPTIONS="-c4"

y el mismo archivo /etc/rsyslogd.conf:

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

Los clientes tienen este archivo /etc/rsyslog.d/remote.conf, que les dice que envíen al servidor remoto:

*.* @@syslog.example.com

y el servidor usa este archivo /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

Como el cliente y el servidor comparten una configuración que especifica "$ PreserveFQDN on", espero ver nombres de host FQDN en los mensajes de syslog, pero la configuración parece no haber tenido efecto. La mayoría de las otras configuraciones que he encontrado para rsyslog están destinadas a eliminar los dominios de los FQDN en lugar de retenerlos. Creo que la raíz del problema es que mis clientes no envían el FQDN en primer lugar, pero no veo cómo forzar ese comportamiento.

¿Alguien puede comentar sobre lo que podría estar perdiendo? Me imagino que no soy la única persona que necesita que se incluyan los FQDN en los mensajes de registro.

cwjohnston
fuente
Posteriormente construí e instalé el paquete rsyslog 4.6.4-2ubuntu4 de Ubuntu 11.04 en mi servidor y un subconjunto de mis nodos de cliente, pero como resultado no he observado un cambio en este comportamiento.
cwjohnston

Respuestas:

38

Me encontré con este problema también. Así es como pude arreglarlo.

  1. En los clientes, modifique el archivo / etc / hosts para que el nombre de host deseado aparezca antes que localhost.

    127.0.0.1 hostnameforlogs localhost

  2. En los clientes y el servidor, modifique /etc/rsyslog.conf para incluir esta declaración:

    $ PreserveFQDN en

  3. En el servidor utilicé la variable% HOSTNAME% para las plantillas en rsyslog.conf:

Matt McMillan
fuente
1
Esto debería ser marcado como la respuesta
ErJab
1
Por favor marque lo anterior como la respuesta.
Greg Annandale
1
Después de 4 años, esta respuesta todavía tiene piernas. Gracias por ayudar a Matt en una Nochebuena devops.
Joe
7

Para cambiar el nombre de host que envía rsyslog, agregue la siguiente directiva como la primera línea en /etc/rsyslog.conf antes de cargar cualquier módulo:

$LocalHostName yourhostname

Alternativamente, para que rsyslog se envíe con el nombre de dominio completo (FQDN, como system1.example.com) en lugar de simplemente el nombre de host (system1), use la directiva:

$PreserveFQDN on

Esto rara vez se necesita. Recomendamos usar el nombre de host (sin el nombre de dominio) a menos que tenga sistemas con nombres idénticos.

Una forma alternativa de configurarlo (que le permite enviar diferentes registros como diferentes nombres de host) es estableciendo una plantilla personalizada:

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

Podría ser un error. El soporte de FQDN es o se sabía que era inestable , aunque ninguno de los errores de FQDN registrados parece aplicarse.

Como solución alternativa, si no realiza ninguna retransmisión, use en %FROMHOST%lugar de% HOSTNAME%.

Gilles 'SO- deja de ser malvado'
fuente
1
El uso %FROMHOST%me da un FQDN, pero parece ser el resultado de una búsqueda inversa en la dirección IP del nodo del cliente. Dado que mis sistemas se ejecutan en AWS EC2, desafortunadamente, esto siempre generará un FQDN que no tiene un significado inmediato para mí.
cwjohnston
0

Solo puedo hablar con 7.6.x, pero $PreserveFQDNera todo lo que necesitaba para que funcionara. Puede evitar tener que meterse con /etc/hostssi el FQDN de su nodo está configurado correctamente.

Ejemplo para sistemas CentOS / RHEL:

$ -> vi /etc/sysconfig/network

# Change this
HOSTNAME=service-a-1

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

Asegúrese de reiniciar.

Mike Purcell
fuente
0

Puede usar esto en la configuración de rsyslog del lado del cliente.

$LocalHostName {{HOSTNAME}}

y reemplácelo {{HOSTNAME}}con el nombre de host deseado o puede descartarlo en cada uno de los clientes usando bigote automáticamente.

Rahul Shaw
fuente