第10回Mac OS X Server勉強会 Mac OSXシステム管理 読書会「ログ」
by スパダイナさん
第10回Mac OS X Server勉強会 午後の部
Mac OSXシステム管理(amazon)という本を読み進めていきます。
この本は購入時に入っている葉書を郵便で送ると、Webページで本を読むことができるそうです。
割と重い本ですから、助かりますね。
Mac OSXの主なログ出力先
これらのログを一括で見られる、フィルタリング機能などついたアプリケーションがConsole.appであると。
初めて使ったけど、割と便利です。
Consoleのオプション
- ログが更新されたらDockアイコンをジャンプさせる
このオプションをつけると、ぴょんぴょんアプリケーションが飛ぶ
- 表示メニュー → 表示項目で、Console.appの一覧に表示する内容を選択できる
- ファイルメニューから、ログ・データベース・クエリを作成できる
ログ・データベース・クエリは、ログを絞り込めるフィルタ定義。
ログの仕組み
syslogdを経由して、ログを書き込む
syslog.confで設定を変更できる。
Mac OSX 10.4からasl.db(max 25MB)にもログを書き込むようになっている。
syslog.conf
sudo less /etc/syslog.conf
syslog.confには、次の規則で、何を、どこへ、書き込むかが定義されている。
{ファシリティ}.{レベル} {書き込み先}
syslogコマンド
syslogを表示する
syslog
syslogを検索する
syslog -k Sender eq kernel syslog -k Sender Seq kernel
k = keyword、eq = equals、S = substring の意味
syslogを表示+待つ。
tailコマンドに近いか?
-w 17と入れると、17のメッセージが追加されるまで待つようだ。
syslog -w 17
w = waiting の意味
syslogコマンド使うと、権限の無いユーザも"/var/log/system.log"の内容を読めてしまうけど、良いのか?
いいや、良くない。ような気がする。
Mac OSXで権限が無くて、"/var/log/system.log"見られなくて困ったら、syslogコマンドを使おう。
もっと早めに知っていれば、、、あの時も、あの時も、、
loggerコマンド
ログにHello Worldと書き込む。
logger Hello World
ユーザ指定でログを出力する。
logger -t Test Hello World
ユーザ、ファシリティ、レベル指定でログを出力する。
logger -t Test -p local5.notice fake error
syslogコマンドで書き込み
-sつけると、syslogコマンドでも、ログを書き込める。
# Alertレベルで書き込み syslog -s -l Alert "Error"
Debugレベルでは、ログを書き込めない。
syslog -s -l Debug "Debug" #=> Warning: The current syslogd ASL filter value (Emergency - Notice)
エラーになる。フィルタでInfo、Debugレベルのログがフィルタリングされているから。
解答1
notifyutil -gコマンドを使用すると、あるNotificationの設定値を調べられる。
このコマンドで、まず、com.apple.system.syslog.asl_filterの設定値を調べる。
すると、デフォルトでは、63に設定されていることがわかる。
sudo notifyutil -g com.apple.system.syslog.asl_filter
com.apple.system.syslog.asl_filterは、おそらく/usr/bin/stringsコマンドで、
/usr/bin/syslogコマンドをパースして見つけたのだと思う。
次に、/usr/bin/syslogコマンドのバイナリファイルを、/usr/bin/stringsコマンドで読み込んで、
com.apple.system.syslog.asl_filterの設定がビット列で、次のように設定されていると推測する。
Debug 128 ( 8ビット目) Info 64 (7ビット目) Notice 32 (6 ビット目) Warning 16 (5ビット目) Err 8 (4ビット目) Crit 4 (3ビット目) Alert 2 (2ビット目) Emergency 1 (1ビット目)
notifyutil -sで、com.apple.system.syslog.asl_filterの設定を255に変更し、
notifyutil -pで設定の変更を通知し、/usr/sbin/syslogdに設定を反映させる。
sudo notifyutil -s com.apple.system.syslog.asl_filter 255 sudo notifyutil -p com.apple.system.syslog.asl_filter
以上の手順を踏むと、Debugレベルでログを出力できるようになる。
syslog -s -l Debug "Debug"
この解答の出し方は、この時の私には無理でした。
syslogコマンドは、実際には、syslogdコマンドがログを書き込んでいるということらしい。
解答2
家に帰って、上を参考にいろいろやって見つけた方法。
syslogコマンドで、ログのフィルタのレベルを変えるオプションがあるので、それを使う。
ただし、そのレベルの指定方法が見つからなくて困った。
最終的には、stringsコマンドでsyslogdコマンドを読んで、その中で、
[p]anic (emergency) [a]lert [c]ritical [e]rror [w]arning [n]otice [i]nfo [d]ebug
を見つけて、
最後の文字が、フィルタリングのレベルに対応していることを特定、
# Debugレベル以上のログを出力 sudo syslog -c syslogd -d # Infoレベル以上のログを出力 sudo syslog -c syslogd -i # Noticeレベル以上のログを出力 sudo syslog -c syslogd -n
次の手順で、Debugレベルのログを出力できることを確認できた。
syslog -s -l Alert Alert syslog -s -l Debug Debug #=> Warning: The current syslogd ASL filter value (Emergency - Notice) sudo syslog -c syslogd -d #=> Password: #=> Set ASL Data Store syslog filter mask: Emergency - Debug syslog -s -l Debug Debug # Console.appで確認する。 # テスト後は、設定をもとの状態まで戻す。 sudo syslog -c syslogd -n #=> Set ASL Data Store syslog filter mask: Emergency - Notice
ログファイルのローテーション
次のファイルで、ログのローテーションが管理されている。
/System/Library/LaunchDeamon/com.apple.newsyslog.plist /System/Library/LaunchDeamon/com.apple.aslmanager.plist
設定変更後、launchctl loadコマンドで、これらファイルをロードすると、
デーモンが動作して、ログをローテーションしてくれる。
ログサーバの構築
外部から送信されるログメッセージを受け取るサーバを構築する。
サーバ側(ログ受信側)
com.apple.syslogd.plistで定義された、NetworkListenerの項目のコメントアウトを外す。
sudo vi /System/Library/LaunchDaemons/com.apple.syslogd.plist
launchctlコマンドで、syslogdデーモンを再起動する。
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
クライアント側(ログ送信側)
syslog.confを編集して、
sudo vi /etc/syslog.conf
別のマシンにログメッセージを送信できるようにする。
# 全てのファシリティ、レベルのログを、IPアドレス10.1.0.119のマシンに送信する設定 *.* @10.1.0.119
ログサーバにログを送信する。
syslogコマンドの-rオプションでホストサーバを指定できる。
syslog -s -r @10.1.0.119 -l Alert "Log Message"
感想
今回の勉強会に参加したら、
また、Macな会社で働きたくなってしまいました。
どうするかな。