logrotateはログファイルの自動ローテーション、圧縮、削除等を行うツールで、
  ミドルウェア等のシステム内にあるプログラムが吐くログを管理することが可能。
  logrotateを使うことでログの肥大化を防ぎ、管理者の好きなようにログの管理ができる。
  redhat系、debian系でも、たいていはデフォルトで入っている。

  [環境]
  AmazonLinux2

  例1:
  (1) nginxのログローテーション用のコンフィグを確認
    $ sudo less /etc/logrotate.d/nginx
      /var/log/nginx/*log {
        create 0644 nginx nginx
        daily
        rotate 10
        missingok
        notifempty
        compress
        sharedscripts
        postrotate
            /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
        endscript
      }

    ・コンフィグの書き方は以下。
      <ログイファイルのパス>{
        ・・・設定記入・・・
      }
      
    ・設定ファイルの中身はmanコマンドで確認できるが基本的なものを以下に記載。下のもの以外にもまだまだたくさんある。
      create・・・作成するファイルのモード、所有者、グループの指定
      daily・・・毎日ローテーションする。他にはhourly、weekly、monthly、yearlyがある。
      rotate・・・ローテーションの世代数を指定。指定数を越えたものは古い順から削除。
      missingok・・・ログファイルが存在しない場合はスルー。
      notifempty・・・ログファイルが空の場合はローテーションしない。
      compress・・・圧縮機能を利用。デフォルトはgzip。
      sharedscripts・・・対象のログファイルがワイルドカード(*)や複数指定されている時、全部を共通にして一度だけ実行されるようにする。
                        例えば上の例であれば/var/log/nginxのaccess.logとerror.logのローテーションの完了後にpostrotate/endscript内の
                        スクリプトが実行されるようになる。
      postrotate/endscript・・・ログファイルがローテーションされた時に、2つの間にあるスクリプトが実行される(bin/sh)

  (2) cronを確認(daily)
    $ sudo less /etc/cron.daily
      #!/bin/sh

      /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
      EXITVALUE=$?
      if [ $EXITVALUE != 0 ]; then
          /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
      fi
      exit 0

    ・/etc/logrotate.confをみると、/etc/logrotate.dを読み込むようになっている。
    

  (3) 設定に誤りがないかテスト
    $ sudo logrotate -df /etc/logrotate.d/nginx

  (4) 実行
    $ sudo logrotate -fv /etc/logrotate.d/nginx


  例2:
  /var/www/rails/<railsプロジェクト名>/current/log/*.log{
    daily
    missingok
    rotate 10
    size 20M
    dateext
    notifempty
    su <ユーザー名> <ユーザー名>
    compress
    lastaction
      unicorn_pid=/var/www/rails/<railsプロジェクト名>/current/tmp/pids/unicorn.pid
      test -s $unicorn_pid && kill -USR1 "$(cat $unicorn_pid)"
  
      sidekiq_pid=/var/www/rails/<railsプロジェクト名>/current/tmp/pids/sidekiq-0.pid
      test -s $sidekiq_pid && kill -USR2 "$(cat $sidekiq_pid)"
    endscript
  }
トップへ