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


9

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

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

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

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

  • サービスを停止し、rsyslog statファイルを削除して、rsyslogを再起動します。これらすべては、私のlogrotateファイルのpostrotateフックにあります。
  • kill -9 rsyslogを実行してやり直してください。

rsyslog内部に触れずにこれを行う適切な方法はありますか?

Rsyslogファイル

$ ModLoad immark
$ ModLoad imudp
$ ModLoad imtcp
$ ModLoad imuxsock
$ ModLoad imklog
$ ModLoad imfile

$ template WithoutTimeFormat、 "[環境] [%syslogtag%]-%msg%"

$ WorkDirectory / var / spool / rsyslog

$ InputFileName /home/user/my_app/shared/log/unicorn.stderr.log
$ InputFileTag unicorn-stderr
$ InputFileStateFile stat-unicorn-stderr
$ InputFileSeverity情報
$ 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 {
  毎日
  Missingok
  dateext
  30回転
  圧縮する
  通知なし
  拡張gz
  コピー
  640ユーザーのユーザーを作成する
  共有スクリプト
  後回転
    (rsyslogを停止&& rm / var / spool / rsyslog / stat- * && rsyslog 2>&1を開始)|| 本当
  endscript
}

参考までに、rsyslogユーザーはファイルを読み取ることができます。サーバーにアクセスでき、同じサイクルでローテーションしない他のログファイルは引き続き適切に追跡されます。

Ubuntu 12.04を実行しています。

回答:


8

問題は実際にはlogrotateが原因でした。

基本的に、ユニコーンを実行している私の構成では、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
}

これらは、あなたのファイルを直接コピーしている場合、私はあなたの問題は、あなたが使用していたことを実際にだったと思うpost-rotate(のものではないです)の代わりに、postrotatepostrotateスクリプトが実行されていた場合、あなたが持っていた元logrotateのスクリプトが(rsyslogので罰金を働いているはずなので、 )...?
mltsy 14

2
いつだったかは覚えていませんが、に変更しpost-rotateましたlastaction。あなたのコメントはまだ非常に賢明であり、それが当時の私の問題を解決したかもしれません:)。記録のために、私はcopytruncateとにかくそれが遅いとファイルハンドルで遊ぶのでとにかく将来使用することを避けます。
Vincent B.

2

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


申し訳ありませんが、ファイル名は単なるタイプミスです。ただし、copytruncateが適切な場合があります。その1つだけを見てみましょう:)。
ビンセントB.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.