Memo/Linux/logrotate

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/logrotate
 


logrotate

  • sizeオプションを付けるとログがそのサイズ以上になった時に強制的に毎日rotateされる。

postrotateでファイルを消すとlogrotateが失敗する

  • 環境
    • CentOS 7
    • logrotate 3.8.6
  • 現象
    • 「/var/log/example/<random id>.log」のファイルができ、ファイルサイズが0のファイルを消したい。以下のようにするとlogroate自体が失敗する
    • エラー「logrotate: ALERT exited abnormally with [1]」が/var/log/messagesに出てlogrotateが停止する。他のログのlogrotateがそこで止まる。
    • /etc/logrotate.d/example
      /var/log/example/*.log {
      ...
        sharedscripts
        postrotate
          /usr/bin/find /var/log/example/ -type f -size 0 -mmin +7 -delete
        endscript
  • 解決?
    • lastaction〜endscriptで削除処理を行う

prerotate, postrotate, sharedscripts:

  • firstaction〜endscript
    • prerotateが実行される前に1回だけ実行される。rotate対象が無い場合は実行されない。
  • prerotate〜endscript
    • rotateされる前に実行される。
  • postrotate〜endscript
    • rotate後に実行される。
  • lastaction〜endscript
    • postrotateの後に実行される。rotate対象が無い場合は実行されない
    • スクリプトにエラーがあってもエラーメッセージを表示するだけで、中断しない。
  • sharedscripts
    • 対象ログが複数あっても、1回だけprerotate, postrotateが実行される。これが無い場合、対象ログファイル数だけ実行される。
    • 対象ファイルがなければ、実行されない。
    • 例:プロセスにシグナル(kill -USR1等)を送って、ログファイルを開き直してくれる機能がある場合はつけるべき。

rotateしたファイルに日付を付ける

  • logrotate-3.7.3以降、dateextを付ける。"yum.log-20130101.gz" になる
    /var/log/yum.log {
        missingok
        notifempty
        yearly
        create 0600 root root
        compress
        dateext
    }
  • dateextに非対応な場合、任意の日付文字列を使いたい場合
    /var/log/yum.log {
        missingok
        notifempty
        yearly
        create 0600 root root
        compress
        lastaction
            EXT=`/bin/date +%Y%m%d`
            /bin/mv yum.1.gz yum.log-${EXT}.gz 
        endscript
    }

error: error opening /var/log/messages.1: No such file or directory

  • 環境
    • CentOS 7.x 64bit
    • logrotate-3.8.6-7.el7_2.x86_64
    • dateextを後から追加した
  • エラー
    sudo logrotate -dv /etc/logrotate.d/syslog
    ...
    removing old log /var/log/messages.1
    error: error opening /var/log/messages.1: No such file or directory
  • 設定に missingok があっても削除対象のファイルが無い場合は上記のエラーが出た
  • 解決
    • /var/lib/logrotate.status の該当行を消す。(古いログが残り続けるので注意)

デバッグ

  • ログファイルは変更されない
    logrotate -dv /etc/logrotate.d/lsyncd
  • 一度実行されると、以下ファイルに日付が記録されるので、もう一度実行したい場合下記ファイルの日付を書き換える
    vi /var/lib/logrotate.status

3.8.0以上の「su」オプション

  • logrotate3.8.0から「su」オプションが追加され、ログディレクトリの権限チェックが厳しくなった。
    • added "su" option
    • CentOS7のlogrotateは3.8.6なので影響を受ける
    • 「su」で指定したuser, groupが「create」で指定したuser, groupのファイルを作成できない場合、エラーになる。
    • 「su」が無いと「ALERT exited abnormally」で失敗する。
    • ログディレクトリの権限が「rooかつ、o+w(0777)」「root以外でg+w(0775)」の場合、「because parent directory has insecure permissions」というエラーメッセージと共にスキップされる
  • 例:zabbix-agent
    • 「/var/log/zabbix/」が以下の場合、groupが"zabbix", パーミッションが0775
      LANG=C ll /var/log/ | grep zabbix
      drwxrwxr-x  2 root   zabbix     30 Dec 11 20:55 zabbix
    • 「/etc/logrotate.d/zabbix-agent」に「su」オプションが必須になる
      /var/log/zabbix/zabbix_agentd.log {
              missingok
              notifempty
              compress
              create 0664 zabbix zabbix
              su zabbix zabbix
      }

時間毎に実行する

  • logrotate 3.8.5以降で対応
    • hourly オプションが指定可能
    • ファイル名の日付も dateformat で変更可能

logrotateが動作しない場合

  • /var/log/messages に以下のエラーが記録されていた
    sudo zgrep logrotate /var/log/messages
    03:10:00 <hostname> logrotate: ALERT exited abnormally with [1]
    • logrotate -dvでチェックしてみる
      sudo logrotate -vd /etc/logrotate.conf |& grep ^error
      ...
      error: line 100 too long in state file /var/lib/logrotate.status
    • /var/lib/logrotate.status が壊れているようなので修復。今回のケースは最終行が途切れていたため、最終行のみ削除した
      sudo vim /var/lib/logrotate.status
    • /var/log/glusterfs/が空の場合に出る。
      error: glusterfs:23 glob failed for /var/log/glusterfs/bricks/*.log: そのようなファイルやディレクトリはありません
      error: stat of /var/log/glusterfs/*.log failed: そのようなファイルやディレクトリはありません

ロックされているログのローテート

Java製のアプリ等で、シグナルによるログの再生成を行ってくれない場合、ログがrotateされない場合がある。

  • ログを空にする場合
    echo -n > /var/log/example.log
  • logrotate @IT:logrotateの設定ファイルで指定できる主なコマンド
    • /etc/logrotate.d/nginx nginxの場合、-USR1シグナルでログファイルの再オープンをしてくれる
      /var/log/nginx/*.log {
          weekly
          rotate 4
          missingok
          compress
          notifempty
          sharedscripts
          postrotate
              [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
          endscript
      }
    • /etc/logrotate.d/example copytruncate が使えるがコピー > 空にするのわずかな間のログは消える可能性がある
      /var/log/example.log {
          copytruncate
          missingok
          compress
          notifempty
      }
  • cronolog 単体で使える。削除は別途行う必要がある
    yum install cronolog --enablerepo=epel
    
    vim /etc/httpd/conf/httpd.conf
    ----
    CustomLog "|/usr/sbin/cronolog /var/logs/logfile.%Y%m%d" common
    ----
  • rotatelogs を通してパイプに書く。apache依存。削除は別途行う必要がある
    yum install httpd
    
    vim /etc/httpd/conf/httpd.conf
    ----
    CustomLog "|/usr/sbin/rotatelogs -l /var/logs/logfile.%Y%m%d 86400" combined
    ----

btmpログをローテーションさせる

  • CentOS5.xでは不正ログインを記録する /var/log/btmp はログローテーションされておらず、数GBになる場合がある。
cat >> /etc/logrotate.conf << EOS

/var/log/btmp {
    missingok
    monthly
    minsize 1M
    create 0600 root utmp
    rotate 1
    compress
}
EOS

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-04-16 (木) 16:35:26 (51d)