Mac OS Xにおいて定期的なログローテートを行うには「newsyslog」を使う。今回はApacheとSquidのログについて設定する。設定ファイル「/private/etc/newsyslog.conf」に、以下の行を追加した。
#### Apache用の設定 /var/log/apache2/access_log 644 7 * $W1D04 JB /var/run/httpd.pid /var/log/apache2/error_log 644 7 * $W1D04 JB /var/run/httpd.pid #### Squid用の設定 /opt/local/var/squid/logs/access.log squid:squid 644 7 * $W1D04 JB /opt/local/var/run/squid/squid.pid /opt/local/var/squid/logs/cache.log squid:squid 644 7 * $W1D04 JB /opt/local/var/run/squid/squid.pid /opt/local/var/squid/logs/store.log squid:squid 644 7 * $W1D04 JB /opt/local/var/run/squid/squid.pid
以降の説明は以下のサイトを参考にさせていただきました。
MacOSXでサーバー稼業 : Web共有機能のログをローテーションさせよう
http://earlybirds.ddo.jp/namahage/inegalog/article.php?id=64
newsyslog.conf(5) OS X Manual Page
https://developer.apple.com/library/mac/#documentation/darwin/reference/manpages/man5/newsyslog.conf.5.html#//apple_ref/doc/man/5/newsyslog.conf
newsyslog.confの設定
newsyslog.confの各行は以下のような構成になっている。
logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
| sizeとwhenはどちらか片方しか指定できず、もう片方には「*」を置いておく。 | |
| logfilename | ログファイル名 |
|---|---|
| owner:group | 新しく作るログファイルの所有権(省略可) |
| mode | 新しく作るログファイルのパーミッション |
| count | 保存するログの限度数 |
| size | ローテートを始めるサイズ(KB単位) |
| when | ローテートを始める時刻 |
| flags | 圧縮状態などを決めるフラグ |
| /pid_file | pidファイルへのパス(省略可) |
| sig_num | ローテート時にプロセスへ送るシグナル(省略可) |
[*]: dump(8)コマンドで使用される。 |
|
| B | newsyslogがローテートしたことをログ自身に記さない。 |
|---|---|
| C | 指定されたログが存在しなければ作成する。 |
| D | 新しく作成するログファイルにUF_NODUMPフラグを付ける[*]。 |
| G | 指定されたログファイル名をシェルの規則によって展開する。 |
| J | 古いログファイルをbzip2(1)で圧縮する。 |
| N | ログファイルをローテートするときにシグナルを送るプロセスは存在しない。 |
| U | 指定されたpidファイルに含まれるIDはプロセスのIDではなく、プロセスグループのIDである。 |
| Z | 古いログファイルをgzip(1)で圧縮する。 |
| – | 何も意味しない。後に続く文字列をフラグと区別するために使う。 |
「size」指定はキロバイト単位で行う。例えば、「100」を指定した場合、ログファイルが100KBに達するたびにローテートが行われる。
「when」指定は複雑だ。書式としては@形式と$形式の2つがある。
- @形式
-
「
@YYYYMMDDThhmmss形式」で絶対時刻を指定する。しかし、後述する理由で分以下の指定にはあまり意味がない。@20100315T0430002010年3月15日4時30分 @15T043000毎月15日4時30分 @T3000毎時30分 - $形式
-
これは更に5つの形式に分かれる。
$Dhh毎日 hh時$Ww毎週 w曜日$WwDhh毎週 w曜日hh時$Mdd毎月 dd日$MddDhh毎月 dd日hh時記号 取り得る値 hh0~23 w0(日)~6(土) dd1~31、L(晦日)
纏めると、一番初めに挙げた例「$W1D04 JB」は次のような意味になる。
- 毎週月曜日4時に実行する。
- ファイルを
bzip2で圧縮する。 - ログファイルにローテートしたことを記さない。
newsyslogの起動
例えば、Linuxに於いてのログローテートはlogrotateコマンドをcronで定期的に実行することで行う。Mac OS XにおいてLinuxにおけるcronの役目に当たるのはlaunchdである。
launchdの設定ファイル群は/System/Library/LaunchDaemons1にある。newsyslogに関する設定ファイルを見てみよう。
$ vim /System/Libarary/LaunchDaemons/com.apple.newsyslog.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.newsyslog</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/newsyslog</string>
</array>
<key>LowPriorityIO</key>
<true/>
<key>Nice</key>
<integer>1</integer>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>30</integer>
</dict>
</dict>
</plist>
ハイライトした部分を見るとわかるとおり、newsyslogは毎時30分に起動する。つまり少なくとも初期設定のままでは、newsyslog.confでは分単位の指定には意味がないのだ。
毎時一回の実行というのは用途から言えば十分ではあるが、最初に試したときは指定した時間になっても起動せず、30分後に実行されたので面食らってしまった。
もし、もっと高頻度で実行したいときは次のサイトを参考にしてこのファイルを書き換えよう。
LaunchDaemons (launchctl, launchd.plist) の使い方 – maruko2 Note.
http://www.maruko2.com/mw/LaunchDaemons_(launchctl,_launchd.plist)_%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
-
他にも
/Library/LaunchDaemons等、いくつかのディレクトリに存在する。 ↩
