web-dev-qa-db-ja.com

rsyslogをsyslog-ngに転送し、FQDNとファシリティを分離します

メッセージを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); };
4
Joshua Miller

さて、私は方法を見つけました。 $ 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
2
Joshua Miller