logrotete

basic

  • /etc/logrotate.conf
  • /etc/logrotate.d/test
  • ex. /etc/logrotate.d/test
/var/log/test.log {
    weekly
    rotate 5
    compress
    delaycompress
    missingok
    notifempty
}

いろいろ

/var/log/td-agent/test2.log {
  daily
  maxsize 100M
  rotate 30
  compress
  delaycompress
  notifempty
  create 640 td-agent td-agent
  sharedscripts
  postrotate
    pid=/var/run/td-agent/td-agent.pid
    if [ -s "$pid" ]
    then
      kill -USR1 "$(cat $pid)"
    fi
  endscript
}
  • maxsize指定でそのサイズを超えたときに時間指定のタイミングを待たずrotateを走らせることができる.
  • pre/postrotateではrotate時の前後にshell script形式で実行したいactionを記述できる.
  • create指定ではrotate後にfileを生成できる.(inode番号が変わったりはあるが,ファイルが存在しないことによるデーモンのクラッシュ等はある程度抑制できる)

Tips

  • logrotateでinode番号が変わる/なくなることにより動作中のprocessが正常に書き込みが行えなくなる可能性がある.
    • 影響のあるプロセスがわかっている場合,対象のプロセスに対してSIGHUPを送るなどして新しいinodeで掴み直してもらうなどの対処が可能.
    • 上記が不可能な場合はcopytruncateを用いることでinode番号は変えずにrotateする際にファイルの中身を移植しinodeを保持することができる.
      • ただしいfdの開き方や操作中のdaemonなどによってはseekが保持され書き込み位置が想定外になったり思わぬハマり方をする可能性もある.
      • そもそも移植はマシンの負荷コストもそれなりに高いのでできれば避けたいものである.