Copytruncateは実際にどのように機能しますか?

Copytruncateは実際にどのように機能しますか?

次の設定を使用してファイルを回転させる前に、次のcopytruncateことを知りたいです。logrotate

/app/syslog-ng/custom/output/all_devices.log { 
size 200M 
copytruncate
dateext 
dateformat -%Y%m%d-%s 
rotate 365 
sharedscripts 
compress
postrotate 
    /app/syslog-ng/sbin/syslog-ng-ctl reload 
endscript 
}

RHEL 7.x、8GBメモリ、4VCpu

質問:

syslog-NGがログ記録用にファイルを開いたときにどのようにファイルを切り捨てますかlogrotate?これは資源競争ではないか? syslog-NGは記録する内容がないとすぐにファイルを閉じますか?

ベストアンサー1

ライターはO_APPENDを使用して書き込み用にファイルを開くため、ログファイルの切り捨ては実際に機能します。

~からオープン(2)マニュアルページ:

O_APPEND:ファイルが追加モードで開きます。各 write(2) の前に、ファイルオフセットは lseek(2) と同様にファイルの末尾にあります。ファイルオフセットの変更と書き込みは、単一の原子ステップで実行されます。

前述のように、ジョブはアトミックなので、書き込みが実行されるたびに追加されます。現在の前の書き込み操作が完了する前に保存されたオフセットではなく、ファイルの終わりに一致するオフセットです。

これにより、切り取り操作の後に追加の操作が実行され、ファイルを再開せずにファイルの先頭に次のログ行を書き換えることができます。

(O_APPENDの同じ機能を使用すると、複数の作成者が互いの更新を妨げることなく同じファイルに追加することもできます。)

また、ロガーは単一の write(2) 操作を使用してログ行を記録し、切り捨てまたは同時書き込み操作中にログ行が 2 つに分割されるのを防ぎます。

copytruncatesyslog、syslog-ng、rsyslogなどのロガーは通常ログファイルの再開をサポートしているため、通常はSIGHUPを送信して使用する必要はありません。 logrotateのサポートはcopytruncate通常ログファイルに添付されますが、必ずしもログファイルを再開するための良い方法がない他のロガーのニーズに対応するために存在します(したがって、名前変更による回転はそのような場合は機能しません)。

またcopyrotate、logrotateがコピーを終了した後に切り捨てジョブが実行される前に、作成者はログファイルに1行を追加できるため、独自の競合状態があることに注意してください。この競合状態により、これらのログ行は永久に失われます。これがcopytruncate唯一の可能なアプローチではない限り、ログの回転が一般に推奨されない理由です。

おすすめ記事