AirMacのログをsyslogdで記録する

Time Capsuleのネットワークに接続して、AirMac Expressでネットワークを拡張で運用している。導入した時から、AirMac Expressが不規則にネットワークから切断する。AirMac Expressを再起動すれば、何の問題もなく繋がるのだけど、毎日または数日ごとに繰り返す再起動には疲れてきた...。こうなったら、AirMacのログを調べてみようと思い立った。

ところが、AirMac Expressを再起動すると、それまで記録されていたログは奇麗さっぱり削除されてしまう...。そこで、AirMac Expressのログを残すために、AirMacユーティリティの「Syslog 書き込みアドレス:」を設定してみた。忘れないようにメモ。

AirMac ユーティリティ 5.6.1のインストール

  • OSX 10.8では、AirMac ユーティリティ 6.3.1がインストールされている。
  • ところが、AirMac ユーティリティ 6.3.1には、なぜかSyslogの設定が存在しない...。
  • Syslogの設定には、AirMac ユーティリティ 5.6.1が必要である。
  • OSX 10.6環境には、AirMac ユーティリティ 5.6.1がインストールされているので、それをコピーするのが手っ取り早い。

しかし、OSX 10.6環境が手元にない場合...

  • その場合、特殊な方法で旧バージョンのAirMac ユーティリティ 5.6.1をインストールする必要がある。
ダウンロードするもの

以下のファイルをダウンロードフォルダにダウンロードしておく。

取り出し
  • extractor.zipを解凍して、AirPort Utility Extractor.appを実行する。
    • AirPortUtility5.6.1.dmg と AirPort Utility Extractor.app は、同じダウンロードフォルダに存在する状態。
  • 完了すると、デスクトップにOld AirPort Utility.appが生成されている。
  • これが AirMac ユーティリティ 5.6.1 なのだ。

TimeCapsuleの設定

  • AirMac ユーティリティ 5.6.1を起動する。
  • バージョンアップしますか?って聞かれるけど、決してバージョンアップしない。

  • Time Capsuleをダブルクリックして、詳細 >> ログと統計情報 を開く。

  • 「Syslog 書き込み先アドレス:」にMacBookのアドレス「10.0.1.100」を入力した。
    • システム環境設定 >> ネットワーク で確認した。
  • 「アップデート」ボタンを押して、Time Capsuleの設定を変更した。


以下の作業前に、TimeMachineなどでバックアップしておくこと、必須!(システムの設定を弄るので)

com.apple.syslogd.plistの設定

  • /System/Library/LaunchDaemons/com.apple.syslogd.plistを修正して、syslogdAirMacのログを受信できるように設定する。
  • ところで、OSX 10.8 Mountain Lionでは、com.apple.syslogd.plistはバイナリ化されてしまった...。
  • plutilコマンドでXMLに変換しても、コメントアウトされた NetworkListener の項目は存在しない。
  • ならば、バイナリとXMLの変換とか、手作業による修正など非常に面倒なので、defaultsコマンドで一気に修正してしまうのだ。
$ sudo defaults write /System/Library/LaunchDaemons/com.apple.syslogd.plist Sockets -dict-add NetworkListener "{ SockServiceName = syslog; SockType = dgram; }"
  • NetworkListenerは、plistルート直下のキーではなく、Socketsキー以下なので、仕方なく上記のような書き方になってしまった。
予備知識
  • 一方、OSX 10.6 Snow Leopardまでは、com.apple.syslogd.plistはユーザーが理解可能なXMLファイルであった。こんな感じの内容。
<?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.syslogd</string>
    <key>OnDemand</key>
    <false/>
	<key>HopefullyExitsLast</key>
	<true/>
	<key>EnableTransactions</key>
	<true/>
	<key>ProgramArguments</key>
    <array>
<!--
	Un-comment the following lines to run syslogd with a sandbox profile.
	Sandbox profiles restrict processes from performing unauthorized
	operations; so it may be necessary to update the profile
	(/usr/share/sandbox/syslogd.sb) if any changes are made to the syslog
	configuration (/etc/syslog.conf).
-->
<!--
		<string>/usr/bin/sandbox-exec</string>
		<string>-f</string>
		<string>/usr/share/sandbox/syslogd.sb</string>
-->
		<string>/usr/sbin/syslogd</string>
    </array>
	<key>MachServices</key>
	<dict>
		<key>com.apple.system.logger</key>
		<true/>
	</dict>
	<key>Sockets</key>
	<dict>
		<key>AppleSystemLogger</key>
		<dict>
			<key>SockPathName</key>
			<string>/var/run/asl_input</string>
			<key>SockPathMode</key>
			<integer>438</integer>
		</dict>
		<key>BSDSystemLogger</key>
		<dict>
			<key>SockPathName</key>
			<string>/var/run/syslog</string>
			<key>SockType</key>
			<string>dgram</string>
			<key>SockPathMode</key>
			<integer>438</integer>
		</dict>
<!--
	Un-comment the following lines to enable the network syslog protocol listener.
-->
<!--
		<key>NetworkListener</key>
		<dict>
			<key>SockServiceName</key>
			<string>syslog</string>
			<key>SockType</key>
			<string>dgram</string>
		</dict>
-->
	</dict>
</dict>
</plist>
  • 末尾側でコメントアウトされている NetworkListener の設定を有効にすることで、AirMacからのログを受信可能な syslogd になる。
    • ユーザーに優しい。

syslogdの再起動

  • 以上の修正をしてMacBookを再起動すれば、AirMacからのログはsyslogに記録されるようになるのだ。
予備知識
  • しかし、再起動はちょっと面倒くさい...。そんな時は、launchctlコマンドで再起動と同じ効果がある。
$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
$ sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
  • 変更したcom.apple.syslogd.plistの設定内容が、syslogdに反映されるのだ。

コンソールで確認

  • syslogの内容は、アプリケーション >> ユーティリティ >> コンソール.app で確認できる。
  • ファイル項目の最初にあるsystem.logを選択すると、AirMacのログが確認できるはず。
    • 但し、設定後まだ何もログが出力されないと確認できない。
  • AirMac ユーティリティで、Time Capsuleにアクセスすると、確実にログが出力される。
    • ウィンドウを一旦閉じて、再度ダブルクリックして開くのだ。
Oct 17 14:42:04 timecapsule admin: Connection accepted from [::ffff:10.0.1.100]:53978.
Oct 17 14:42:10 timecapsule admin: Connection accepted from [::ffff:10.0.1.100]:54018.
Oct 17 14:42:10 timecapsule admin: Connection accepted from [::ffff:10.0.1.100]:54019.

できた、できた!

ログファイルを分ける

  • AirMacのログがsyslogに記録されるようになったのだが、syslogには本来のシステムログも記録されている。
  • AirMacのログだけを追跡しようとした場合、あまり見やすい状態とは言えない。
  • コンソールで検索するのも良さそうだが、ここでは別途 /var/log/airmac.log というファイルに出力してみる。
  • /etc/syslog.confの末尾に「local0.* /var/log/airmac.log」を追記する。
$ sudo sh -c "echo 'local0.* /var/log/airmac.log' >> /etc/syslog.conf"
  • 追記が完了すると、/etc/syslog.confはこのような状態になっているはず。
$ cat /etc/syslog.conf
# Note that flat file logs are now configured in /etc/asl.conf

install.*						@127.0.0.1:32376
local0.* /var/log/airmac.log
  • できれば、エディタで/etc/syslog.confを開いて、タブ位置まで整形しておいた方が好ましい。(今後のために)
  • 設定を反映させるため、MacBookの再起動か、または以下の launchctl コマンドを実行する。
$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
$ sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
  • 以上で、/var/log/airmac.logにAirMacのログが記録されるようになった。
  • しかし、/var/log/system.logにも記録される...。(二重に記録されてる)
予備知識1
  • syslog.confのフォーマットは以下のようになっている。
ファシリティ(メッセージの種類) . プライオリティ(重要度) アクション
local0 . * /var/log/airmac.log
  • AirMacのログは、local0という種類になっている。
  • そして、メッセージには重要度が設定されている。
プライオリティ 意味
emerg システムダウンなどの非常に危険な状態
alert システム破損などの緊急事態発生
crit ハードウェアの傷害などの危険状態
err 一般的なエラーメッセージ
warning 警告メッセージ
notice 通知メッセージ
info 一般的な情報
debug デバッグメッセージ
none 出力しない
* すべてのメッセージ
  • つまり、local0.* /var/log/airmac.log ≒ AirMacのログ、すべてを、/var/log/airmac.logに保存する、と読めるのだ。
予備知識2
  • 実は、syslogdをコントロールする設定ファイルは、もう1つある。
  • syslog.conf先頭のコメントにもあるとおり、/etc/asl.confがある。
##
# configuration file for syslogd and aslmanager
##

# redirect com.apple.message.domain to /var/log/DiagnosticMessages
? [T com.apple.message.domain] store_dir /var/log/DiagnosticMessages

# redirect com.apple.performance* messages to /var/log/performance
? [A= Facility com.apple.performance] store_dir /var/log/performance

# redirect com.apple.eventmonitor* messages to /var/log/eventmonitor
? [A= Facility com.apple.eventmonitor] store_dir /var/log/eventmonitor

# authpriv messages are root/admin readable
? [= Facility authpriv] access 0 80

# remoteauth critical, alert, and emergency messages are root/admin readable
? [= Facility remoteauth] [<= Level critical] access 0 80

# broadcast emergency messages
? [= Level emergency] broadcast

# save kernel [PID 0] and launchd [PID 1] messages
? [<= PID 1] store

# ignore "internal" facility
? [= Facility internal] ignore

# save everything from emergency to notice
? [<= Level notice] store

# Flat file configurations formerly in syslog.conf

# install messages get saved only in install.log
? [= Facility install] file /var/log/install.log format=bsd
? [= Facility install] ignore

# kernel messages get saved in system.log
? [= Sender kernel] file /var/log/system.log mode=0600 gid=80 format=bsd

# emergency - notice get saved in system.log
? [<= Level notice] file /var/log/system.log

# Facility auth to level info gets saved in system.log
? [= Facility auth] [<= Level info] file /var/log/system.log

# Facility authpriv gets saved in system.log
? [= Facility authpriv] file /var/log/system.log

# Facility mail gets saved in mail.log
? [= Facility mail] file /var/log/mail.log mode=0644 format=bsd

# Facility com.apple.alf.logging gets saved in appfirewall.log
? [= Facility com.apple.alf.logging] file /var/log/appfirewall.log
  • 見てのとおり、OSX 10.8 mountain Lionでは、むしろ/etc/asl.confの設定が主流だったのだ。
    • システムデフォルトの設定は、ほとんどがasl.confで設定されている。

ログローテーション

  • /var/log/airmac.logに記録されるようになったは良いが、今後このログファイルはどうなるのだろうか?
  • AirMacに接続している限り、syslogdは刻々と記録し続ける。
  • すると、いずれairmac.logは、巨大なファイルへと成長するはず。
  • 巨大なファイルに繰り返し追記するのは、無駄が多い...。
  • そうならないために、/var/system.logのようなファイルなどは、ログローテーションという仕組みで管理されている。
  • /var/system.logがある一定のサイズになったら、/var/system.log.0のように番号管理された別ファイルとなり、/var/system.log.0.bz2として圧縮保存される。
  • 心機一転、/var/system.logは0バイトの新規ファイルとして作り直され、再び追記されていく。
  • /var/system.log.0.bz2から/var/system.log.7.bz2まで番号管理され、それより古いファイルは自動的に削除される。
  • OSXには以上のようなログローテーションの仕組みがあり、その設定は/etc/newsyslog.confで行うのだ。
# configuration file for newsyslog
# $FreeBSD: /repoman/r/ncvs/src/etc/newsyslog.conf,v 1.50 2005/03/02 00:40:55 brooks Exp $
#
# Entries which do not specify the '/pid_file' field will cause the
# syslogd process to be signalled when that log file is rotated.  This
# action is only appropriate for log files which are written to by the
# syslogd process (ie, files listed in /etc/syslog.conf).  If there
# is no process which needs to be signalled when a given log file is
# rotated, then the entry for that file should include the 'N' flag.
#
# The 'flags' field is one or more of the letters: BCGJNUWZ or a '-'.
#
# Note: some sites will want to select more restrictive protections than the
# defaults.  In particular, it may be desirable to switch many of the 644
# entries to 640 or 600.  For example, some sites will consider the
# contents of maillog, messages, and lpd-errs to be confidential.  In the
# future, these defaults may change to more conservative ones.
#
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/appfirewall.log		640  5     1000	*     J
/var/log/ftp.log			640  5	   1000	*     J
/var/log/hwmond.log			640  5	   1000	*     J
/var/log/install.log			640  5	   1000	*     J
/var/log/ipfw.log			640  5	   1000	*     J
/var/log/lookupd.log			640  5	   1000	*     J
/var/log/lpr.log			640  5	   1000	*     J
/var/log/mail.log			640  5	   1000	*     J
/var/log/ppp.log			640  5	   1000	*     J
/var/log/secure.log			640  5	   1000	*     J
/var/log/system.log			640  7	   *	@T00  J
/var/log/wtmp				644  3	   *	@01T05 B
  • なるほど、設定項目の詳細は分からないが、/var/log/airmac.logの行を以下のように追記してみた。
/var/log/airmac.log		640  3     10	*     J
  • たぶん、10KBごとにログローテションして、番号管理は0〜3まで。
  • 10KBとしたのは、ローテーションの効果を素早く確認したいため。

この設定でしばらく使ってみることにする。