web-dev-qa-db-ja.com

プロダクション用にログファイルを適切に自動/手動でローテーションする方法Rails App

カスタムメイドのサードパーティがあるサーバーの管理を引き継いでいますRails app。アプリ開発者は、Rubyログファイルが大きくなり、私に次のリンクを示しました:- https://stackoverflow.com/questions/4883891/Ruby-on-Rails-production-log-rotation

ログは/ root/production/app/logにあります。このフォルダには、.logで終わるファイルがいくつか含まれています。現在のログファイルのサイズは約2GBで、フォルダーには「logname.log.2013_01_18.bz2」の形式のアーカイブログファイルもあります。

Sshコマンドの履歴を検索して、アーカイブファイルの作成に使用されたコマンドが表示されるかどうかを確認しましたが、コマンドはそれほど遠くに戻りません。 「cat/var/lib/logrotate/status」も実行しましたが、logrotateが上記のフォルダーのログをローテーションしなかったようではありません。

基本的に:

  1. ログを手動でローテーションするコマンドを実行したり、毎週日曜日の夜にログを自動的にローテーションさせたりしたいのですが。
  2. ログをローテーションするためにRailsアプリをシャットダウンする必要がある場合、これを実行するために毎週日曜日の夜にメンテナンスウィンドウがあるため、これで問題はありません。
  3. 最後に、ログファイルを毎週bz2に圧縮する必要があるのか​​、前月に関連するローテーションされたログのログを毎月圧縮するだけなのかわかりません。これは主に、このアプリがログをどのように利用するか正確にわからないため、Railsアプリを利用したことがなく、ログローテーションを手動で構成する必要もなかったためです。

現時点では、すべてのログファイルを破棄せずに保持する必要があります。ローテーションを試みる前にログをバックアップするなど、ログのローテーションに関連する懸念事項に関する情報は大歓迎です。

4
Damainman

logrotateはシステムがログをローテーションするために使用されるため、2つの選択肢があります。これらのアプリログのローテーションをシステムローテーションに組み込むか、独自にセットアップして、手動で実行するか、rootユーザーのcrontabから実行することができます(Railsアプリがディレクトリとして与えられた場合、rootとして実行されると仮定しますは/root/...)です。

システムローテーション

システムの既存のログローテーション内でログローテーションを設定するには、/etc/logrotate.dディレクトリに新しいファイルを追加するだけです。それをrailsapp.confと呼びます。そこで他の例を使用して作成します。また、logrotateのmanページを参照してください。

ユーザーローテーション

logrotateの独自のインスタンスを実行する場合は、それを実行するためのコマンドラインスイッチを指定するだけです。

  1. 最初に/etc/logrotate.conf/root/Rails_logrotate.confのコピーを作成します
  2. ファイルを編集して、ログのローテーションを希望どおりに構成します(つまり、すべてのログを保持する、毎週ローテーションするなど)。
  3. それを実行します

    # 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スイッチを使用して詳細にすることもできます。

  1. このログファイルから始めます。

    $ 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
    
  2. 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
    
  3. 結果を確認する

    $ 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
    

週刊cron

これを毎週日曜日に実行するには、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 * * * *".

参考文献

11
slm