私はパーソナライズされたサードパーティのRailsアプリケーションを持つサーバーの管理を担当しています。アプリケーション開発者は、Rubyのログファイルがますます大きくなっていると言い、次のリンクを教えました。https://stackoverflow.com/questions/4883891/ruby-on-rails-product-log-rotation
ログは/root/product/app/logにあります。このフォルダには、.log で終わる複数のファイルが含まれています。現在のログファイルサイズは約2 GBで、フォルダには「logname.log.2013_01_18.bz2」形式のアーカイブログファイルも含まれています。
アーカイブファイルを生成するためにどのコマンドが使用されたかを確認するためにsshコマンド履歴を検索してみましたが、そのコマンドはそれまでさかのぼりません。また、 "cat /var/lib/logrotate/status"を実行しましたが、logrotateが上記のフォルダのログを回転しないようです。
オリジナル:
- ログを手動で回転させるか、毎週日曜日の夜に自動的にログを回転させるコマンドを実行できるようにしたいです。
- ログを回転させるためにRailsアプリケーションを終了する必要がある場合は、毎週日曜日の夜にメンテナンス期間があるため問題はありません。
- 最後に、ログファイルを毎週bz2に圧縮する必要があるのか、それとも前の月に関連する循環ログに対して月単位で圧縮する必要があるのかはわかりません。これは、主にこのアプリケーションがログをどのように使用しているのかわからず、Railsアプリケーションを使用したことがなく、ログ回転を手動で構成する必要がなかったためです。
この時点では、すべてのログファイルを削除せずにアーカイブする必要があります。回転を試みる前にログをバックアップするなど、ログの回転に関するすべての情報を歓迎します。
答え1
logrotate
システムはそれを使用してログを回転させるため、2つの選択肢があります。これらのアプリケーションログの循環をシステム循環にマージしたり、独自の循環を設定して手動で実行したり、rootユーザーのcrontabで実行したりできます(Railsアプリケーションがrootとして実行され、そのディレクトリがあると仮定/root/...
)。
システム循環
システム上の既存のログ間でログ循環を設定するには、ディレクトリに新しいファイルを追加するだけです/etc/logrotate.d
。呼びなさいrailsapp.conf
。私はそこにある他の例を使ってそれに基づいて構築します。また、logrotate
マニュアルページとも通信します。
ユーザー循環
独自のインスタンスを実行するには、logrotate
コマンドラインスイッチを指定します。
- まず、コピーを作成してみてください。
/etc/logrotate.conf
/root/rails_logrotate.conf
- 必要に応じてログローテーションを設定するようにファイルを編集します(たとえば、すべてのログの維持、毎週のローテーションなど)。
走る
# 1st time $ logrotate -d -f -s $HOME/my_logrotate.state logrotate.conf # afterwards $ logrotate -d -s $HOME/my_logrotate.state logrotate.conf
すべてが正常に機能したら、切り替えることなくこれらのコマンドを再実行できます
-d
。これはデバッグ目的でのみ使用され、実際には何もせずに何をすべきかを示すためのものです。$ logrotate -s $HOME/my_logrotate.state logrotate.conf
-v
また、このスイッチを使用したときに表示される出力と同様に、このスイッチを使用して詳細を表示することもできます-d
。
はい
このログファイルから始めてください。
$ dd if=/dev/zero of=afile bs=1k count=10k 10240+0 records in 10240+0 records out 10485760 bytes (10 MB) copied, 0.0702393 s, 149 MB/s $ ll afile -rw-rw-r-- 1 saml saml 10485760 Aug 6 14:37 afile $ touch -t 201307010101 afile $ ll afile -rw-rw-r-- 1 saml saml 10485760 Jul 1 01:01 afile
今走る
logrotate
$ logrotate -v -f -s $HOME/my_logrotate.state logrotate.conf reading config file logrotate.conf reading config info for /home/saml/afile Handling 1 logs rotating pattern: /home/saml/afile forced from command line (1 rotations) empty log files are rotated, old logs are removed considering log /home/saml/afile log needs rotating rotating log /home/saml/afile, log->rotateCount is 1 dateext suffix '-20130806' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' glob finding old rotated logs failed renaming /home/saml/afile to /home/saml/afile-20130806 creating new /home/saml/afile mode = 0664 uid = 500 gid = 501
検査結果
$ ll afile* -rw-rw-r-- 1 saml saml 0 Aug 6 14:40 afile -rw-rw-r-- 1 saml saml 10485760 Jul 1 01:01 afile-20130806
週間計画
毎週日曜日に実行するには、rootユーザーに対して次のcrontabエントリを作成できます。
$ crontab -e
次の行を追加します。
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 0 * * sun logrotate -v -f -s $HOME/my_logrotate.state $HOME/logrotate.conf
次に、上記の内容を保存します。
実際の日、分、秒などを指定する代わりに、この種のショートカットを使用することもできます。
string meaning
------ -------
@reboot Run once, at startup.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnight (same as @daily)
@hourly Run once an hour, "0 * * * *".