本番 Rails アプリケーションのログファイルを自動/手動で正しく回転する方法

本番 Rails アプリケーションのログファイルを自動/手動で正しく回転する方法

私はパーソナライズされたサードパーティの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が上記のフォルダのログを回転しないようです。

オリジナル:

  1. ログを手動で回転させるか、毎週日曜日の夜に自動的にログを回転させるコマンドを実行できるようにしたいです。
  2. ログを回転させるためにRailsアプリケーションを終了する必要がある場合は、毎週日曜日の夜にメンテナンス期間があるため問題はありません。
  3. 最後に、ログファイルを毎週bz2に圧縮する必要があるのか​​、それとも前の月に関連する循環ログに対して月単位で圧縮する必要があるのか​​はわかりません。これは、主にこのアプリケーションがログをどのように使用しているのかわからず、Railsアプリケーションを使用したことがなく、ログ回転を手動で構成する必要がなかったためです。

この時点では、すべてのログファイルを削除せずにアーカイブする必要があります。回転を試みる前にログをバックアップするなど、ログの回転に関するすべての情報を歓迎します。

答え1

logrotateシステムはそれを使用してログを回転させるため、2つの選択肢があります。これらのアプリケーションログの循環をシステム循環にマージしたり、独自の循環を設定して手動で実行したり、rootユーザーのcrontabで実行したりできます(Railsアプリケーションがrootとして実行され、そのディレクトリがあると仮定/root/...)。

システム循環

システム上の既存のログ間でログ循環を設定するには、ディレクトリに新しいファイルを追加するだけです/etc/logrotate.d。呼びなさいrailsapp.conf。私はそこにある他の例を使ってそれに基づいて構築します。また、logrotateマニュアルページとも通信します。

ユーザー循環

独自のインスタンスを実行するには、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
    

週間計画

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

引用する

関連情報