Как получить rsyslogd для регистрации полного доменного имени сервера вместо его короткого имени хоста?

22

Я пытаюсь реализовать простой централизованный сервер системного журнала, используя стандартный rsyslogd (4.2.0-2ubuntu8.1) на Ubuntu 10.04 LTS. На этом этапе все мои клиентские узлы отправляют журналы на центральный сервер, но клиенты отправляют журнальные сообщения, которые содержат свое короткое имя хоста вместо своего полного доменного имени.

Согласно справочной странице по Ubuntu rsyslogd:

Если удаленный хост находится в том же домене, что и хост, на котором работает rsyslogd, в журнал будет записано только простое имя хоста, а не весь fqdn.

Это проблематично для меня, так как я повторно использую короткие имена между средами, например, core1.example.com и core1.stg.example.com, оба записывают свои сообщения как 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», я ожидаю увидеть имена хостов FQDN в сообщениях системного журнала, но, похоже, этот параметр не дал никакого эффекта. Большинство других настроек, которые я нашел для rsyslog, направлены на удаление доменов из полных доменных имен вместо их сохранения. Я думаю, что корень проблемы в том, что мои клиенты не отправляют FQDN в первую очередь, но я не вижу, как заставить это поведение.

Кто-нибудь может прокомментировать то, что мне может не хватать? Я полагаю, что я не единственный человек, которому нужны полные доменные имена для включения в сообщения журнала.

cwjohnston
источник
Впоследствии я собрал и установил пакет rsyslog 4.6.4-2ubuntu4 из Ubuntu 11.04 на моем сервере и подмножестве моих клиентских узлов, но в результате этого не заметил изменений в этом поведении.
cwjohnston

Ответы:

38

Я столкнулся с этой проблемой также. Вот как я смог это исправить.

  1. На клиентах измените файл / etc / hosts так, чтобы желаемое имя хоста предшествовало localhost.

    127.0.0.1 hostnameforlogs localhost

  2. На клиентах и ​​сервере измените /etc/rsyslog.conf, чтобы включить этот оператор:

    $ PreserveFQDN на

  3. На сервере я использовал переменную% HOSTNAME% для шаблонов в rsyslog.conf:

Мэтт Макмиллан
источник
1
Это должно быть помечено как ответ
ErJab
1
Пожалуйста, отметьте выше, как ответ.
Грег Аннандейл
1
Через 4 года у этого ответа все еще есть ноги. Спасибо за помощь Мэтту в канун Рождества.
Джо
7

Чтобы изменить имя хоста, отправляемое rsyslog, добавьте следующую директиву в качестве самой первой строки в /etc/rsyslog.conf перед загрузкой любых модулей:

$LocalHostName yourhostname

В качестве альтернативы, чтобы rsyslog отправлял с полным доменным именем (FQDN, например system1.example.com) вместо простого имени хоста (system1), используйте директиву:

$PreserveFQDN on

Это редко нужно. Мы рекомендуем использовать имя хоста (без имени домена), если у вас нет систем с одинаковыми именами.

Альтернативный способ установить его (который позволяет вам отправлять разные журналы как разные имена хостов) - это установить собственный шаблон:

$template MyTemplate, "<%pri%> %timestamp% MySpoofedHostName %syslogtag% %msg%\n"
$ActionForwardDefaultTemplate MyTemplate
Эмилио Макиас
источник
4

Это может быть ошибка. Поддержка FQDN является или, как было известно, шаткой , хотя ни одна из зарегистрированных ошибок FQDN, кажется, не применима.

В качестве обходного пути, если вы не выполняете ретрансляцию, используйте %FROMHOST%вместо% HOSTNAME%.

Жиль "ТАК - перестать быть злым
источник
1
Использование %FROMHOST%дает мне полное доменное имя, но, похоже, это результат обратного просмотра IP-адреса клиентского узла. Поскольку мои системы работают на AWS EC2, это, к сожалению, всегда приводит к полному доменному имени, которое не имеет для меня непосредственного значения.
cwjohnston
0

Я могу говорить только с 7.6.x, но это $PreserveFQDNбыло все, что нужно для его работы. Вы можете избежать возни, /etc/hostsесли полное доменное имя вашего узла настроено правильно.

Пример для систем CentOS / RHEL:

$ -> vi /etc/sysconfig/network

# Change this
HOSTNAME=service-a-1

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

Обязательно перезагрузите компьютер.

Майк Перселл
источник
0

Вы можете использовать это в конфигурации rsyslog на стороне клиента.

$LocalHostName {{HOSTNAME}}

и замените его {{HOSTNAME}}на желаемое имя хоста, или вы можете автоматически определить его на каждом клиенте, используя усы .

Рахул Шоу
источник