読者です 読者をやめる 読者になる 読者になる

logrotateメモ

前提

logrotate 3.10.0
CentOS 7 (6でも一緒な気がする)

今回の内容

やりたいこと

  • ログのローテーションをlogrotateで管理したい
  • ファイルサイズが特定値に達したらローテーションして、また1日1回ローテーションしてほしい

補足

logrotateの設定で、sizeとdailyを指定していたのですが、ファイルサイズが指定サイズを超えてもローテーションしてくれませんでした。minsizeというものを知ったので、minsizeとdaily指定をしてみたがそれでも結果は同じでした。
いろいろ調べてごにょごにょやった結果、やりたいことはほぼできました。
その結果をまとめます。

結論

どうすることにしたのか、先に結論を書いておきます。

  • maxsizeとdaily指定(copytruncate, dateext, dateformat -%Y%m%d-%H%M%S)
  • /etc/cron.daily/logrotateを/etc/cron.hourly/へコピー

試行(思考)錯誤

size + dailyで試す

これでいけるだろうと思って設定していましたが、ログが出力され続けファイルサイズがsize指定値になってもローテーションされませんでした。
このころ、どういう仕組みでローテーションが実行されているのか知りませんでした。単純に、logrotateの設定でsize指定をしておけば"勝手に"ファイルサイズを検知してローテーションされると思っていました。この考え方が間違い。

minsize + dailyで試す

調べていると、minsizeというものがあることを知りました。すぐに試してみましたが結果は同じでした。
このころようやくmanコマンドを利用することに。

# 下記は3.10.0のもの。
       size size
              Log files are rotated only if they grow bigger then size bytes. If size is followed by k, the size is assumed to
              be in kilobytes.  If the M is used, the size is in megabytes, and if G is used, the size  is  in  gigabytes.  So
              size 100, size 100k, size 100M and size 100G are all valid.

       minsize  size
              Log files are rotated when they grow bigger than size bytes, but not  before  the  additionally  specified  time
              interval  (daily,  weekly,  monthly,  or yearly).  The related size option is similar except that it is mutually
              exclusive with the time interval options, and it causes log files to be rotated  without  regard  for  the  last
              rotation time.  When minsize is used, both the size and timestamp of a log file are considered.

どっちもサイズでローテーションするんやないの?ん?ってめっちゃ迷った時期です。
but not beforeってどう訳せばいいんやろ、not rotated beforeってことなのかなーとかいっぱい考えていました。
minsizeについてググりまくりました。stackoverflowのいくつかのコメントにはmanコマンドでの説明が十分じゃないからややこしいみたいなことも書いてあったような気がします。
このころもminsizeとか書いておけば"勝手に"検知して対応してくれると思っていた時期です。

maxsize + dailyで試す

ひたすら調べていると、logrotateのバージョンをあげるとmaxsizeというのが使えることがわかり、バージョンをあげて調べていた時期。

# 下記は3.10.0のもの。
       maxsize size
              Log files are rotated when they grow bigger than size bytes even before the additionally specified time interval
              (daily, weekly, monthly, or yearly).  The related size option is similar except that it  is  mutually  exclusive
              with the time interval options, and it causes log files to be rotated without regard for the last rotation time.
              When maxsize is used, both the size and timestamp of a log file are considered.

これを見ると分かるように、even before〜とあるので「これで!」とテンションが上がったのを覚えています。
結論の部分に書いてしまっていますけど、単純にmaxsizeを指定するだけではダメでした。

hourly

このころhourlyというものも指定できることを知りました。
指定してみましたがうんともすんとも言いませんでした。

ただ、hourlyやmaxsizeについて調べているとき、参考4に出会い、それが私の固定観念を捨てるのに役に立ちました。
あ、logrotate自体は自分で実行しないといけなくて、そのときに各設定がチェックされるのか、と。
そして同時期、参考1~3に出会い、logrotateがうまく勝手に検知してローテーションしているのではなく、cronやanacronのおかげなのかと知りました。
それらの記事が分かりやすすぎて書くことがありません。見てください。

ちなみにhourlyの説明

       hourly Log  files  are  rotated  every hour. Note that usually logrotate is configured to be run by cron
              daily. You have to change this configuration and run logrotate hourly to be able to really rotate
              logs hourly.

その後の私の頭の中

/etc/cron.d/0hourlyに書かれてあるように、毎時01分に/etc/cron.hourly配下のスクリプトが実行される。
/etc/cron.hourlyには0anacronというスクリプトが置いてあり、1~2つめのif文で、すでに本日分のcron.dailyが実行されていたら実行せずに終わる。そうでなければ(on_ac_powerのチェックはあるけど)anacronが実行される。
/etc/anacrontabに/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly配下のスクリプトが実行されるよう記述してあり、実行される。
logrotateスクリプトは/etc/cron.hourlyにはなく/etc/cron.dailyのみにあった。
ってことはhourlyを指定しててもlogrotate自体は1日に1回の実行になるのか。
/etc/cron.hourly配下にlogrotateスクリプトを置けば、毎時01分に実行されて、maxsizeチェックが働いてローテーションされるのか。
dailyチェックはいつ働くんやろう?00:01の実行で、/etc/cron.d/0hourlyの1~2つめのif文内には入らないはずやから、anacronが実行されるけど、/etc/anacrontabに書いてあるようにSTART_HOURS_RANGE=3-22やからこのとき/etc/cron.daily等配下のスクリプトは実行されないはず。logrotateスクリプトを/etc/cron.hourly配下に置いていたら実行される。あれっ、logrotateのdailyってどうやって判定してるんやろ・・・ソースコード見るしかないか・・・

ってな感じです。

まだやっていないこと

size、minsize、maxsizeの違いを実際に実行して比較。
logrotateのdaily判定についてソースコードを追う。