web-dev-qa-db-ja.com

ログのローテーション後にRsyslogがリモートサーバーへのデータ送信を停止する

私の構成では、imfileを使用した/home/user/my_app/shared/log/Unicorn.stderr.logの変更の追跡を担当するrsyslogがあります。コンテンツは、TCPを使用して別のリモートロギングサーバーに送信されます。

ログファイルがローテーションすると、rsyslogはリモートサーバーへのデータ送信を停止します。

RsyslogをリロードしてHUPシグナルを送信し、それを完全に再起動してみましたが、何も機能しませんでした。

実際に機能することがわかった唯一の方法は汚いものでした。

  • サービスを停止し、rsyslog statファイルを削除して、rsyslogを再起動します。これらすべては、私のlogrotateファイルのpostrotateフックにあります。
  • 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を実行しています。

9
Vincent B.

問題は実際には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
}
8
Vincent B.

Logrotateファイルに/home/user/shared/log/*.logのエントリが含まれていますが、これは/home/user/my_app/shared/log/Unicorn.stderr.logのログファイルと一致しません。そのディレクトリのlogrotateエントリを追加し、copytruncateが含まれていることを確認する必要があります。現状のまま、rsyslogは現在のファイルの名前を変更して新しいファイルを作成し、imfileは現在名前が変更されたファイルのファイルハンドルに従います。

2
Jenny D