第10回Mac OS X Server勉強会 Mac OSXシステム管理 読書会「ログ」

by スパダイナさん
第10回Mac OS X Server勉強会 午後の部
Mac OSXシステム管理(amazon)という本を読み進めていきます。
この本は購入時に入っている葉書を郵便で送ると、Webページで本を読むことができるそうです。
割と重い本ですから、助かりますね。

Console.app

ログを見るアプリケーションとして、Console.appがある。


Consoleとは、ログを見るアプリケーションであったらしい。使ったことは無かった。

Mac OSXの主なログ出力先

  • /Library/Logs Mac
  • ~/Library/Logs ユーザ系
  • /var/log BSD

これらのログを一括で見られる、フィルタリング機能などついたアプリケーションが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コマンドで、これらファイルをロードすると、
デーモンが動作して、ログをローテーションしてくれる。

ローテーションされたASLログの置き場所
# Mac OSX 10.5.5
/var/log/asl.db
# Mac OSX 10.5.6
/var/log/asl/

ファイルから、ディレクトリ型に置く形式に変更された模様。
よって、前からOSXを使用している人のマシンには、asl.dbというゴミファイルが残っている。

ログサーバの構築

外部から送信されるログメッセージを受け取るサーバを構築する。

サーバ側(ログ受信側)

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な会社で働きたくなってしまいました。
どうするかな。