まずはlogrotate.confファイルを編集し、以下の内容にする。トリッキーなのは、postrotateの部分。weechatはログファイルをopenした状態のままcloseしないが、fifoプラグインを使えば、weechatの外側からweechatにログを中断して再開する命令を出すことができる。このままだとweechatが複数立ち上がっている場合は全てのプロセス宛に同じ命令を出すことになるが、それは気にしない。
$ vi /*******/etc/logrotate.conf $ cat /*******/etc/logrotate.conf /*******/.weechat/logs/irc.freenode.#weechat.weechatlog { daily missingok rotate 100 postrotate for fifo in ~/.weechat/weechat_fifo_* do echo -e 'irc.freenode.#weechat */logger disable\nirc.freenode.#weechat */logger set 9' >$fifo done endscript }
その後にlogrotate.statusを作っておく。
$ touch /*******/lib/logrotate.status
実行テストを行う。-d オプションはdebugモード。confファイルにミスがあったり、statusファイルが存在しないとこのとき注意される。
$ /usr/sbin/logrotate -d -s /*******/lib/logrotate.status /*******/etc/logrotate.conf reading config file /*******/etc/logrotate.conf reading config info for /*******/.weechat/logs/irc.freenode.#weechat.weechatlog Handling 1 logs rotating pattern: /*******/.weechat/logs/irc.freenode.#weechat.weechatlog after 1 days (100 rotations) empty log files are rotated, old logs are removed considering log /*******/.weechat/logs/irc.freenode.#weechat.weechatlog log does not need rotating
実行すると、以下のようになる。これは成功した例。ただし、/*******/.weechat/logs/irc.freenode.#weechat.weechatlogがまだ1世代しかないので、ローテーションは行われていない。また、stateファイルを表示すると、ローテーションに成功したことがわかる。
$ /usr/sbin/logrotate -s /*******/lib/logrotate.status /*******/etc/logrotate.conf $ ls -la irc.freenode.#weechat.weechatlog* -rw-r--r-- 1 **** **** 1730652 2011-02-07 12:46 irc.freenode.#weechat.weechatlog $ cat /*******/lib/logrotate.status logrotate state -- version 2 "/*******/.weechat/logs/irc.freenode.#weechat.weechatlog" 2011-2-7
強制的にローテーションを行うにはlogrotate に -f オプションをつけて実行する。
$ /usr/sbin/logrotate -f -s /*******/lib/logrotate.status /*******/etc/logrotate.conf $ ls -la irc.freenode.#weechat.weechatlog* -rw-r--r-- 1 hoge hoge 1730652 2011-02-07 12:46 irc.freenode.#weechat.weechatlog.1 $ cat /*******/lib/logrotate.status logrotate state -- version 2 "/*******/.weechat/logs/irc.freenode.#weechat.weechatlog" 2011-2-7
-fオプションをつけて再度 logrotate を走らせるとローテーションが行われ、通し番号の大きいファイルが作成されたことがわかる。
$ /usr/sbin/logrotate -f -s /*******/lib/logrotate.status /*******/etc/logrotate.conf $ ls -la irc.freenode.#weechat.weechatlog* -rw-r--r-- 1 hoge hoge 3688 2011-02-07 15:25 irc.freenode.#weechat.weechatlog.1 -rw-r--r-- 1 hoge hoge 1730652 2011-02-07 12:46 irc.freenode.#weechat.weechatlog.2 $ cat /*******/lib/logrotate.status logrotate state -- version 2 "/*******/.weechat/logs/irc.freenode.#weechat.weechatlog" 2011-2-7
logroteteはデーモンではないので、実行するだけだとローテーションは1回しか行われない。これを定期的に実行するにはcronを使う。-f オプションをつければここで1時間に1回実行させることも可能のはず。
$ crontab -e 0 0 * * * /usr/sbin/logrotate -s /*******/lib/logrotate.status /*******/etc/logrotate.conf