私の構成では、imfile
を使用した/home/user/my_app/shared/log/Unicorn.stderr.log
の変更の追跡を担当するrsyslogがあります。コンテンツは、TCPを使用して別のリモートロギングサーバーに送信されます。
ログファイルがローテーションすると、rsyslogはリモートサーバーへのデータ送信を停止します。
RsyslogをリロードしてHUPシグナルを送信し、それを完全に再起動してみましたが、何も機能しませんでした。
実際に機能することがわかった唯一の方法は汚いものでした。
kill -9
rsyslogを実行してやり直してください。Rsyslogの内部に触れずにこれを行うためのproper方法はありますか?
Rsyslogファイル
$ ModLoad immark $ ModLoad imudp $ ModLoad imtcp $ ModLoad imuxsock $ ModLoad imklog $ ModLoad imfile $ template WithoutTimeFormat、 "[environment] [%syslogtag%]-%msg%" $ WorkDirectory /var/spool/rsyslog $ InputFileName /home/user/my_app/shared/log/Unicorn.stderr.log $InputFileTag Unicorn-stderr $ InputFileStateFile stat-Unicorn-stderr $ InputFileSeverity info $ InputFileFacility local8 $ InputFilePollInterval 1 $ InputFilePersistStateInterval 1 $ InputRunFileMonitor #リモートサーバーに転送 $ syslogtagに 'Apache-'が含まれている場合、@@ my_server:5000; WithoutTimeFormat :syslogtag、contains、 "Apache-"〜 *。* @@ my_server:5000; SyslFormat
Logrotateファイル
/home/user/my_app/shared/log/*。log { daily missingok dateext rotate 30 compress notifempty extension gz copytruncate create 640 user user sharedscripts post-rotate (stop rsyslog && rm/var/spool/rsyslog/stat- * && start rsyslog 2>&1)|| true endscript }
参考までに、rsyslogユーザーはファイルを読み取ることができます。サーバーにアクセスでき、同じサイクルでローテーションしない他のログファイルは引き続き適切に追跡されます。
Ubuntu 12.04を実行しています。
問題は実際にはlogrotateが原因でした。
基本的に、Unicornを実行している私の構成では、copytruncate
ディレクティブを使用する必要はありません。 (ここで問題が発生します)
USR1-ワーカープロセスが所有するすべてのログを再度開きます。ログと見なされるものについては、Unicorn :: Util.reopen_logsを参照してください。現在のリクエストの処理が完了するまでログファイルは再度開かれないため、1つのリクエストに対して複数のログ行が(Railsによって行われたように)複数のログに分割されることはありません。
これは、この構成に更新した後、正しく機能し始めました。
/home/user/my_app/shared/log/*.log {
daily
missingok
dateext
rotate 30
compress
notifempty
extension gz
create 640 user user
sharedscripts
post-rotate
# Telling Unicorn to reload files
test -s /home/user/my_app/shared/pids/Unicorn.pid && kill -USR1 "$(cat /home/user/my_app/shared/pids/Unicorn.pid)"
# Reloading rsyslog telling it that files have been rotated
reload rsyslog 2>&1 || true
endscript
}
Logrotateファイルに/home/user/shared/log/*.log
のエントリが含まれていますが、これは/home/user/my_app/shared/log/Unicorn.stderr.log
のログファイルと一致しません。そのディレクトリのlogrotateエントリを追加し、copytruncate
が含まれていることを確認する必要があります。現状のまま、rsyslogは現在のファイルの名前を変更して新しいファイルを作成し、imfileは現在名前が変更されたファイルのファイルハンドルに従います。