メッセージをsyslog-ngログリポジトリシステムに転送するようにrsyslogクライアントを構成しようとしています。メッセージの転送は「そのまま」機能しますが、クライアントはFQDNではなく短い名前をログに記録しています。その結果、syslogリポジトリのメッセージも短い名前を使用します。これは、メッセージの発信元のシステムを簡単に判別できないため問題です。私のクライアントはDHCP/DNSを介して名前を取得します。
私はこれを機能させるためにいくつかの解決策を試しましたが、成功しませんでした。 rsyslog4.6.2とsyslog-ng3.2.5を使用しています。
/etc/rsyslog.confの最初のディレクティブとして$PreserveFQDN on
を設定してみました(そしてもちろんrsyslogを再起動しました)。効果がないようです。
クライアントのhostname --fqdn
は適切なFQDNを返すため、問題はシステムが実際に独自のFQDNを把握できるかどうかではありません。
$LocalHostName <fqdn>
は有望に見えましたが、このディレクティブは私のバージョンのrsyslogでは使用できません(4.7.4以降、5.7.3以降、6.1.3以降で使用可能)。現在、アップグレードはオプションではありません。
DNSを介した逆引き参照に基づいて名前を設定するようにsyslog-ngサーバーを構成することはオプションではありません。逆引きDNSとパブリッククラウドには複雑さがあります。
フォワーダーがカスタムテンプレートを使用するように指定することは、一見すると実行可能なオプションのように見えます。次のように指定できます。これにより、ローカルロギングがsyslog-ngリポジトリのFQDNの使用を開始します。
$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%"
$ActionForwardDefaultTemplate MyTemplate
ただし、これを配置すると、syslog-ngは機能または優先度でメッセージを分類できないようです。メッセージはFQDNとして受信されますが、すべてがuser.logに入力されます。カスタムテンプレートを使用しない場合、メッセージは機能と優先度の下で適切に分類されますが、短い名前が使用されます。
したがって、要約すると、rsyslogを手動でだましてFQDNを含めると、優先度と機能がsyslog-ngに失われます。 rsyslogに、syslog-ngリポジトリに適切に機能するFQDNロギングを実行させるにはどうすればよいですか?
rsyslogクライアント構成:
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so # provides kernel logging support (previously done by rklogd)
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
$WorkDirectory /var/spool/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList # run asynchronously
$ActionResumeRetryCount -1 # infinite retries if Host is down
*.* @syslog-ng1.example.com
*.* @syslog-ng2.example.com
syslog-ng構成(簡潔にするために要約):
options {
flush_lines (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
use_fqdn (yes);
create_dirs (no);
keep_hostname (yes);
};
source src {
unix-stream("/dev/log");
internal();
udp(ip(0.0.0.0) port(514));
};
destination per_Host_destination {
file( "/var/log/syslog-ng/devices/$Host/$FACILITY.log" owner("root") group("root") perm(0644) dir_owner(root) dir_group(root) dir_perm(0775) create_dirs(yes));
};
log { source(src); destination(per_facility_destination); };
さて、私は方法を見つけました。 $ ActionForwardDefaultTemplateがデフォルトで設定されていることがわかります:
$ActionForwardDefaultTemplate RSYSLOG_ForwardFormat
このrsyslogのドキュメント に従って、RSYSLOG_ForwardFormat
は異なるsyslog間の相互運用性を維持するために特に使用されます。最初に説明したようにこのForwardテンプレートを変更すると、他のsyslogの一部の機能が機能しなくなることは驚くことではありません。
$template MyTemplate, "%timestamp% <FQDN> %syslogtag%%msg%"
$ActionForwardDefaultTemplate MyTemplate
私が見つけた回避策は、RSYSLOG_ForwardFormat
が使用するバックエンドテンプレートを掘り起こして模倣することでした。ソースを調べた後、最終的にRSYSLOG_ForwardFormat
が実際には次のようになっていることがわかりました。
"<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
したがって、ほぼ同じ内容のカスタムテンプレートを作成し、%HOSTNAME%
マクロの代わりにFQDNを使用すると、syslog-ng機能の分離が適切に機能し、システムはFQDNでログに記録します。
$template MyForwardTemplate, "<%PRI%>%TIMESTAMP% <fqdn> %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
$ActionForwardDefaultTemplate MyForwardTemplate