Я пытаюсь реализовать простой централизованный сервер системного журнала, используя стандартный rsyslogd (4.2.0-2ubuntu8.1) в Ubuntu 10.04 LTS. На этом этапе все мои клиентские узлы отправляют журналы на центральный сервер, но клиенты отправляют журнальные сообщения, которые содержат свое короткое имя хоста вместо своего FQDN.
На странице руководства 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, нацелены на удаление доменов из полных доменных имен вместо их сохранения. Я думаю, что корень проблемы в том, что мои клиенты вообще не отправляют полное доменное имя, но я не вижу, как заставить такое поведение.
Кто-нибудь может прокомментировать то, что мне может не хватать? Я полагаю, что я не единственный, кому нужно включать полные доменные имена в сообщения журнала.
Я тоже столкнулся с этой проблемой. Вот как я смог это исправить.
На клиентах измените файл / etc / hosts так, чтобы желаемое имя хоста было перед localhost.
127.0.0.1 имя хоста для журналов localhost
На клиентах и сервере измените /etc/rsyslog.conf, включив в него этот оператор:
$ PreserveFQDN на
На сервере я использовал переменную% HOSTNAME% для шаблонов в rsyslog.conf:
Чтобы изменить имя хоста, которое отправляет rsyslog, добавьте следующую директиву в качестве самой первой строки в /etc/rsyslog.conf перед загрузкой любых модулей:
$LocalHostName yourhostname
В качестве альтернативы, чтобы rsyslog отправлял с полным доменным именем (FQDN, например system1.example.com) вместо простого имени хоста (system1), используйте директиву:
$PreserveFQDN on
Это редко требуется. Мы рекомендуем использовать имя хоста (без имени домена), если у вас нет систем с одинаковыми именами.
Альтернативный способ установить его (который позволяет отправлять разные журналы как разные имена хостов) - это установить собственный шаблон:
$template MyTemplate, "<%pri%> %timestamp% MySpoofedHostName %syslogtag% %msg%\n"
$ActionForwardDefaultTemplate MyTemplate
Это могло быть ошибкой. Поддержка полного доменного имени является или известна как ненадежная, хотя ни один из зарегистрированные ошибки FQDN похоже, применяются.
В качестве обходного пути, если вы не выполняете ретрансляцию, используйте %FROMHOST%
вместо% HOSTNAME%.
Я могу разговаривать только с 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
Обязательно перезагрузитесь.
Вы можете использовать это в конфигурации rsyslog на стороне клиента.
$LocalHostName {{HOSTNAME}}
и заменить {{HOSTNAME}}
с желаемым именем хоста или вы можете детемплатизировать его на каждом из клиентов, используя усы автоматически.