最初の質問に対する答えは次のとおりです。
はい、syslog()への呼び出しはすべてブロックされます。非常に短い時間かもしれませんが、それでもファイル記述子を含む同期呼び出しです。詳細についてはman 3 syslog
、を参照してください。
サーバーが非同期アーキテクチャとプリミティブを使用していない限り、常にいくつかのロックが存在します。たとえば、ログに別のスレッドを使用することで、この問題を軽減することはできますが、排除することはできません。他の2つの質問については本当にわかりませんが、rsyslogdソースコード(およびsyslog()ファミリーの関数の1つ)を調べることが唯一の方法です。
より一般的には、ログをUDP:514 "ネットワークSyslogプロトコル"を介して外部サーバーに移動すると、ロックを作成する可能性がほぼゼロになります。高負荷時に一部のログが失われる可能性があるという欠点があります。
まず、「元の」サーバーでは、すべてのロギングがsyslog経由で行われるようにする必要があります。たとえば、Apache2では次を指定する必要があります。
ErrorLog "syslog:daemon"
他のサーバーについては、適切なマニュアルページを参照してください。これを確認できない場合は、ファイルシステムにログオンすると、
次に、元のrsyslogd構成で、選択したファシリティ(この例では「デーモン」)のすべてのsyslogトラフィックを1つ以上の外部syslogサーバーに送信するように要求します。rsyslog構成ファイルでは、以下を指定できます。
daemon.* @192.168.128.1
daemon.* @192.168.254.1
ログの2つのコピーを2つの異なるサーバーに同時に送信する。
3番目に、宛先サーバーで、UDP:514を介したsyslogメッセージの受信を有効にします。これは(宛先)rsyslogd構成ファイルにあり、通常はデフォルトで無効になっています(先頭の#sを削除するだけで十分です:
$ModLoad imudp
$UDPServerRun 514
4つ目はオプションですが強く推奨されていますが、高解像度のタイムスタンプも有効にします。
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
また、このオプションは通常デフォルトで無効になっています(なぜ地球にいるのですか?)。