a40405.pl
シンプルなlogrotateです。
- 1. 書式
- 2. オプション
- 3. 説明
- 4. テスト環境
- 5. ご注意
- 6. 簡単な使い方
- 6.1. 補足
- 7. スクリプトの変数
- 7.1. 全てオプションで参照できる変数
- 7.2. -mオプションでのみ参照できる変数
- 8. トラブルシューティング
perl a40405.pl [ファイル]... [オプション]...
2. オプション
- -f ファイル
- ローテートするログファイルです。ワイルドカードが使えます。デフォルトは「*.log」です。
- -t 秒数
- ローテートする間隔です。デフォルトは604800(7日)です。
- -r ローテート数
- ローテート数の最大値です。ローテート数がこの数を超えるログは削除されます。デフォルトは52です。
- -i
- 空のログをローテートします。デフォルトは空のログをローテートしません。
- -z ローテート数
- 圧縮するログのローテート数です。ローテート数がこの数のログは圧縮されます。この数を0にすると圧縮機能は無効になります。デフォルトは2です。
- -m Perlスクリプト...
-
ログを圧縮するスクリプトです。このスクリプトは、全てのログファイルがローテートされた後に、圧縮すべきファイル毎に実行されます。-uオプションの説明も参照して下さい。デフォルトは「`gzip
-n "$f.$z"`」です。
- -x 拡張子
- 圧縮されたログの拡張子です。デフォルトは「gz」です。
- -p Perlスクリプト...
-
ローテート前に実行するスクリプトです。このスクリプトは、全てのログファイルをローテートする前に一度だけ実行されます。ただし、ローテートすべきファイルが一つも無い場合には実行されません。デフォルトは「」(空)です。
- -u Perlスクリプト...
-
ローテート後に実行するスクリプトです。このスクリプトは、全てのログファイルがローテートされた後に一度だけ実行されます。だたし、ファイルが一つもローテートされなかった場合には実行されません。このスクリプトは-mオプションのスクリプトが実行される前に実行されます。デフォルトは「」(空)です。
これは、色々なプログラム(Windows
XPでのApacheを想定しています。)が書き出すログファイルの内容を定期的に別のファイルに移す(これの実現の為には、このプログラムをタスクスケジューラ等で定期的に実行する必要があります。)プログラムです。ログの内容の移動先は、元のログファイルのファイル名の後尾に「.ローテート数」を付けたファイル名のファイルになります。ローテート数は1から始まる10進数正数で、数が大きいほど古いログを示します。
access.log ← 現在稼動中のログファイル
access.log.1 ← 最近ローテートによって移されたログ
access.log.2.gz ← 最近より昔、ローテートによって移されたログ(圧縮済)
access.log.3.gz ← さらに昔、ローテートによって移されたログ
(圧縮済)
ローテートするログファイルは書式の「[ファイル]...」の部分で与えても-fオプションで与えても意味は変わりません。両方で与えるとマージされます。
4. テスト環境
- xampp-win32-1.6.1 xampp-win32-perl-addon-5.8.8-2.2.4
- GnuWin32 gzip-1.3.12
-
このプログラムは不具合があるとログやその他のファイルを失う可能性があるので、重要な用途に使う場合には各自で十分にテストして、利用者の責任にて使って下さい。
-
このプログラムにはcreate機能が無く、ローテート後の空のログファイルはログを書き出すプログラムが作成することになります。その為、ログファイルが既に存在していないと
いけないようなプログラムで問題が発生するかもしれません。
-
このプログラムはデフォルトで、gzipコマンドが必要です。gzipコマンドがインストールされていないシステムで使う場合には、オプション「-z
0」を与えて圧縮機能を無効にして下さい。
-
-zオプションを変更した場合、ローテート先のログに圧縮されたものと非圧縮のものが混在していてもローテート数はログ
の新しい順に正しく付きますが、-xオプションを変更した場合には変更前の拡張子のログは無視されてしまいます。
6. 簡単な使い方
ここでは、xampp-win32のApacheでの簡単な使い方を説明します。xampp-win32-perl-addonもインストールし、xampp\perl\binディレクトリにパスを通してperlコマンドが使えるようにしておいて下さい。
- gzip.exeをパスの通ったディレクトリにインストールします。gzip.exeは、GnuWin32のものを使います。ここからダウンロードできるみたいです。
- a40405.plを起動するバッチファイルを作ります。たとえばファイル名を「daily.bat」として、その内容を以下のようにします。
※ファイルのパス部分は各自の環境に合わせて便宜調整して下さい。
- 2で作った「daily.bat」をタスクスケジューラに登録して毎日実行されるようにします。タスクスケジューラはWindowsのコントロールパネルの中の「タスク」というのです。
- これで、毎週1回ログのローテートとApacheの再起動が行われます。
- daily.batは毎日実行されますが、実際にログのローテートとApacheの再起動の動作が行われるのは週1回です。
- daily.batを週1回だけ実行するようにもできますが、そうすると微妙な時間の誤差でローテートが行われる週と行われない週が出てくる可能性があります。そういうローテート間隔のバラ付きを気にしなければ、daily.batを任意の間隔で実行しても問題ありません。
-
ローテート数の最大値はデフォルトで52ですので、ログは概ね1年分蓄えられることになりますが、アクセスが全く無い週のアクセスログはローテートされないので、閑古鳥が鳴いているサイトでは1年分より多くのログが蓄えられることもありえます。
- daily.batの実行間隔の誤差は実行間隔が1週間を越え2週間未満の時に累積され、実行間隔が1週間未満の時に修正されます。実行間隔が2週間を超えたり、誤差が1週間分以上累積すると誤差の修正ができずに、1年分より多くのログが蓄えられることになります。
-
-uオプションでApacheを再起動していますが、これを省くと恐らくApacheは移動先のログファイルにログを書き出し続けてしまうと思います。再起動して新しいログファイルを作らせないといけません。「httpd.pid」のチェック省くと、メンテナンス等でApacheを停止させている時にdaily.batが実行されると、想定外にApacheが起動してしまうことになります。
7. スクリプトの変数
ここでは、-m、-p、-uオプションのPerlスクリプト内で参照できる主な変数の説明をします。
7.1. 全てオプションで参照できる変数
- $t $r $i $z $m $x $p $u
-
これらはコマンドラインオプションで与えたものが入っています。「-」を「$」に置き換えただけで意味は同じです。コマンドラインで与えた「"」(ダブルクォーテーション)は取り除かれています。値のないオプション(-i)の場合には真か偽かを判断できる値が入っています。
- @f
- ログファイルの配列です。ワイルドカードの解釈済みの全てのファイルが格納されています。
7.2. -mオプションでのみ参照できる変数
- $f
- 個々のログファイルです。
※厳密には全ての変数がどのオプションからでも参照できるのですが、意味のあるものが得られるかは謎です。
8. トラブルシューティング
-
ローテート処理の最中にプログラムがアボートしたと見えて、ローテート数が飛んでいる場合には、最近実行した時と同じ書式でこのプログラムを実行すれば自動的にローテート数が詰められます。通常はタスクスケジューラから自動的にこのプログラムが実行されるはずなので、急がなければ放置しておいても問題ありません。