【Mac OS X】newsyslogを使ってログローテートする


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]
各部の説明
sizewhenはどちらか片方しか指定できず、もう片方には「*」を置いておく。
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 毎月ddhh
記号 取り得る値
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/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


  1. 他にも/Library/LaunchDaemons等、いくつかのディレクトリに存在する。 

コメントを残す