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
形式」で絶対時刻を指定する。しかし、後述する理由で分以下の指定にはあまり意味がない。@20100315T043000
2010年3月15日4時30分 @15T043000
毎月15日4時30分 @T3000
毎時30分 - $形式
-
これは更に5つの形式に分かれる。
$Dhh
毎日 hh
時$Ww
毎週 w
曜日$WwDhh
毎週 w
曜日hh
時$Mdd
毎月 dd
日$MddDhh
毎月 dd
日hh
時記号 取り得る値 hh
0~23 w
0(日)~6(土) dd
1~31、L(晦日)
纏めると、一番初めに挙げた例「$W1D04 JB
」は次のような意味になる。
- 毎週月曜日4時に実行する。
- ファイルを
bzip2
で圧縮する。 - ログファイルにローテートしたことを記さない。
newsyslog
の起動
例えば、Linuxに於いてのログローテートはlogrotate
コマンドをcron
で定期的に実行することで行う。Mac OS XにおいてLinuxにおけるcron
の役目に当たるのはlaunchd
である。
launchd
の設定ファイル群は/System/Library/LaunchDaemons
1にある。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
等、いくつかのディレクトリに存在する。 ↩