ロギングは、WBEM 管理者がイベントを追跡して発生原因を調べることができるためのサービスです。イベントとは、たとえば、シリアルポートが提供されているのにそれにアクセスできない場合や、ファイルシステムのマウントでエラーメッセージが生成された場合、システムディスクが容量の限界に達した場合などのことです。
この章で取り上げる内容は次のとおりです。
ロギングサービスは、サービスプロバイダが返すことになっているすべてのアクションや、Solaris WBEM Services のコンポーネントが完了したすべてのアクションを記録します。 このサービスでは、通知用のメッセージとエラーメッセージがログに記録されます。たとえば、ユーザーがシリアルポートを無効にすると、シリアルポートプロバイダによってこの情報が自動的に記録されます。システムエラーなどの障害が発生した場合には、WBEM 管理者はログ記録を参照して発生原因を調べることができます。
コンポーネント、アプリケーション、およびプロバイダはすべて、イベントに応答してロギングを自動的に開始します。たとえば、CIM Object Manager は、インストールと起動が終わると自動的にイベントを記録します。
WBEM 環境向けに開発されるアプリケーションとプロバイダには、ロギングを設定できます。詳細は、「API によるロギングの有効化」を参照してください。ログデータは、ログビューアで表示してアプリケーション用に開発するロギング機能のデバッグを行うこともできます。
アプリケーションまたはプロバイダがイベントを記録するように設定すると、イベントはログファイルに書き込まれます。ログ記録はすべて、パス /usr/sadm/wbem/log に格納されます。ログファイルは、次の命名規則を使用します。
wbem_log.#
# は、ログファイルのバージョンを示すために付加される番号です。.1 が付いたログファイル (例: wbem_log.1) は、最も新しいバージョンです。.2 が付いたログファイルは、その次に新しいバージョンです。拡張子が大きいファイル (例: wbem_log.16) は、バージョンが古いことを示します。最も新しいバージョンのファイル、それ以前のバージョンのファイルとも、/usr/sadm/wbem/log 内に 1 つのアーカイブとして同時に存在します。
次の状況の 1 つが発生する場合、ファイル拡張子 .1 によるログファイルの名前変更および、保存が行われます。
現在のファイルが、Solaris_LogServiceProperties クラスによって指定されたファイルサイズ限度に達した。デフォルト値は wbemService.properties ファイルに設定されている
Solaris_LogServiceProperties クラスのプロパティによるログファイルの使用方法の制御については、「ログファイルの規則」を参照してください。
Solaris_LogService クラスの clearLog() メソッドが、現在のログファイルに対して呼び出された
Solaris_LogService クラスとそのメソッドの詳細は、「Solaris_LogService」を参照してください。
Solaris_LogServiceProperties クラスは、Solaris_Core1.0.mof で定義されています。Solaris_LogServiceProperties クラスには、次のログファイル属性を制御するプロパティがあります。
ログファイルが記録されるディレクトリ
ログファイル名
ログファイルに許可されるサイズ。このサイズに達すると、/usr/sadm/wbem/log でファイル拡張子 .1 によるログファイルの名前変更、保存、およびアーカイブが行われる
アーカイブ内に格納できるログファイルの数
SysLog (Solaris オペレーティング環境のデフォルトのロギングシステム) にログデータを書き込む機能
データをログファイルに書き込むアプリケーションにこれらの属性のどれかを指定するには、Solaris_LogServiceProperties の新しいインスタンスを作成し、その関連プロパティの値を設定します。新しいインスタンスのプロパティ値を設定する方法については、例 5-14 を参照してください。
ロギングサービスは、一般的なログ記録として、アプリケーションログ、システムログ、およびセキュリティログの 3 種類を提供しています。ログ記録は、通知用のメッセージのことも、エラーまたは警告を記述したデータのこともあります。ログに表示できる標準のフィールドがデータに定義されていますが、ログはすべてのフィールドを使用するとは限りません。たとえば、通知用のログではイベントについて説明した簡単なメッセージが示され、エラーログでは詳細なメッセージが示される場合があります。
ログデータフィールドの中には、CIM Repository 内のデータを識別するものがあります。これらのフィールドは、Solaris_LogRecord クラス内の読み取り専用のキー修飾子が付けられたプロパティです。これらのフィールドの値は設定できません。ログファイル内の次のフィールドの値は設定できます。
Category - ログ記録の種類
Severity - ログファイルに記録されたデータの原因となった状況の重大度
AppName - データを出したアプリケーションの名前
UserName - ログデータが生成された時にそのアプリケーションを使用していたユーザーの名前
ClientMachineName - ログデータを生成した状況が起きたコンピュータの名前
ServerMachineName - ログデータを生成した状況が起きたサーバーの名前
SummaryMessage - 状況を説明する簡単なメッセージ
DetailedMessage - 状況を説明する詳しいメッセージ
data - ログメッセージの解釈のためにアプリケーションとプロバイダが提示できる背景情報
ロギングには、2 つの Solaris スキーマクラス、Solaris_LogRecord と Solaris_LogService が使用されます。
Solaris_LogRecord は、Solaris_Core1.0.mof でログファイル内のエントリをモデル化するように定義されています。イベントに応答してアプリケーションまたはプロバイダが Solaris_LogRecord クラスを呼び出す場合、Solaris_LogRecord クラスはそのイベントによって生成されるデータをすべてログファイルに書き込みます。Solaris_LogRecord クラスの定義を Solaris プロバイダの一部として見るには、任意のテキストエディタで Solaris_Core1.0.mof ファイルを表示してください。Solaris_Core1.0.mof ファイルは、/usr/sadm/mof に入っています。
Solaris_LogRecord は、プロパティのベクトルとキー修飾子を使用して、データを生成したイベント、システム、ユーザー、およびアプリケーションまたはプロバイダの属性を指定します。アプリケーションと CIM Repository 間で使用されるように、読み取り専用修飾子の値が透過的に生成されます。たとえば、値 RecordID はログエントリを個別に識別しますが、生成されたデータが表示される場合にログ書式の一部としては示されません。
書き込み可能修飾子の値は設定できます。たとえば、イベントが発生したシステムを識別する ClientMachineName と ServerMachineName のようなプロパティの修飾子の値を設定できます。
SysLogFlag プロパティが真に設定されていると、ログレコードの詳しいメッセージが UNIX システムの syslog デーモンに自動的に送信されます。
Solaris_LogService クラスは、ロギングサービスのオペレーションの制御と、ログデータの処理方法の定義を行います。このクラスには、アプリケーションが特定のイベントについてのデータを発行元アプリケーションから CIM Object Manager へ送信するために使用できる一連のメソッドが含まれます。データは、CIM Object Manager からの応答 (CIM Repository からのデータ検出など) を生成するトリガーとなります
Solaris_LogService クラスは、次のメソッドを使用します。
clearLog - 現在のログファイルの名前変更、保存、または保存されたログファイルの削除を行う
getNumRecords - 特定のログファイルに記録されているログの数を返す
listLogFiles - /usr/sadm/wbem/log に格納されているすべてのログファイルの一覧を返す
getCurrentLogFileName - 最新のログファイルの名前を返す
getNumLogFiles - /usr/sadm/wbem/log に格納されているログファイルの数を返す
getLogFileSize - 特定のログファイルのサイズをメガバイト単位で返す
getSyslogSwitch - ログデータを SysLog (Solaris オペレーティング環境のロギングサービス) に送る
getLogStorageName - ログファイルが格納されるホストコンピュータまたはデバイスの名前を返す
getLogFileDir - ログファイルが格納されるディレクトリのパスと名前を返す
setProperties - ロギングプロパティを設定する
Solaris_Core1.0.mof ファイル内の Solaris_LogService の定義は、任意のテキストエディタでこのファイルを開いて表示できます。Solaris_Core1.0.mof ファイルは、/usr/sadm/mof に入っています。
ログファイルの内容は現在 Log Viewer で表示できますが、独自の方法でログファイルを表示したい場合はロギング API を使用して Log Viewer を作成できます。この API を使用すると、次のことができます。
アプリケーションからログファイルへデータを書き込む
ログファイルから Log Viewer へデータを読み込む
ロギングをどのように扱うかを指定するロギングプロパティを設定する
アプリケーションでデータをログファイルに書き込むには、次の作業を行います。
Solaris_LogRecord クラスの新しいインスタンスを作成する
ログファイルに書き込まれるプロパティを設定し、プロパティの修飾子の値を設定する
出力する新しいインスタンスとプロパティを設定する
必要なすべての java クラスをインポートします。例 5-1 に示すクラスは必要な最小限のクラスです。
import java.rmi.*; import com.sun.wbem.client.CIMClient; import com.sun.wbem.cim.CIMInstance; import com.sun.wbem.cim.CIMValue; import com.sun.wbem.cim.CIMProperty; import com.sun.wbem.cim.CIMNameSpace; import com.sun.wbem.cim.CIMObjectPath; import com.sun.wbem.cim.CIMClass; import com.sun.wbem.cim.CIMException; import com.sun.wbem.solarisprovider.*; import java.util.*; |
CIMClient の値
CIMObjectPath の値
CIMNameSpace の値
public class CreateLog { public static void main(String args[]) throws CIMException { if ( args.length != 3) { System.out.println("Usage: CreateLog host username password"); System.exit(1); } CIMClient cc = null; CIMObjectPath cop = null; try { CIMNameSpace cns = new CIMNameSpace(args[0]); cc = new CIMClient(cns, args[1], args[2]); |
プロパティのベクトルが返されるように指定します。修飾子のプロパティに値を設定します。
Vector keys = new Vector(); CIMProperty logsvcKey; logsvcKey = new CIMProperty("category"); logsvcKey.setValue(new CIMValue(new Integer(2))); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("severity"); logsvcKey.setValue(new CIMValue(new Integer(2))); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("AppName"); logsvcKey.setValue(new CIMValue("SomeApp")); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("UserName"); logsvcKey.setValue(new CIMValue("molly")); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("ClientMachineName"); logsvcKey.setValue(new CIMValue("dragonfly")); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("ServerMachineName"); logsvcKey.setValue(new CIMValue("spider")); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("SummaryMessage"); logsvcKey.setValue(new CIMValue("brief_description")); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("DetailedMessage"); logsvcKey.setValue(new CIMValue("detailed_description")); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("data"); logsvcKey.setValue(new CIMValue("0xfe 0x45 0xae 0xda")); keys.addElement(logsvcKey); logsvcKey = new CIMProperty("SyslogFlag"); logsvcKey.setValue(new CIMValue(new Boolean(true))); keys.addElement(logsvcKey); |
ログ記録用に CIMObjectPath の新しいインスタンスを宣言します。
CIMObjectPath logreccop = new CIMObjectPath("Solaris_LogRecord", keys); |
Solaris_LogRecord の新しいインスタンスを宣言します。ファイルに書き込むようにプロパティのベクトルを設定します。
CIMInstance ci = new CIMInstance(); ci.setClassName("Solaris_LogRecord"); ci.setProperties(keys); //System.out.println(ci.toString()); cc.setInstance(logreccop,ci); } catch (Exception e) { System.out.println("Exception: "+e); e.printStackTrace(); } |
データがログファイルに書きこまれたあと、セッションを閉じます
// セッションを閉じる。 if(cc != null) { cc.close(); } } } |
アプリケーションでログファイルから Log Viewer にデータを読み込むには、次の作業を行います
Solaris_LogRecord クラスのインスタンスを列挙する
目的のインスタンスを取得する
出力デバイス (通常はユーザーインタフェース) にインスタンスのプロパティを出力する
必要なすべての java クラスをインポートします。例 5-7 に示すクラスは、インポートする必要がある最小限のクラスです。
import java.rmi.*; import com.sun.wbem.client.CIMClient; import com.sun.wbem.cim.CIMInstance; import com.sun.wbem.cim.CIMValue; import com.sun.wbem.cim.CIMProperty; import com.sun.wbem.cim.CIMNameSpace; import com.sun.wbem.cim.CIMObjectPath; import com.sun.wbem.cim.CIMClass; import com.sun.wbem.cim.CIMException; import com.sun.wbem.solarisprovider.*; import java.util.*; import java.util.Enumeration; |
クラス ReadLog を宣言します。
public class ReadLog { public static void main(String args[]) throws CIMException { if ( args.length != 3) { System.out.println("Usage: ReadLog host username password"); System.exit(1); |
ReadLog クラスのクライアント、オブジェクトパス、およびネームスペースの値を設定します。
} CIMClient cc = null; CIMObjectPath cop = null; try { CIMNameSpace cns = new CIMNameSpace(args[0]); cc = new CIMClient(cns, args[1], args[2]); cop = new CIMObjectPath("Solaris_LogRecord"); |
Solaris_LogRecord のインスタンスを列挙します。
Enumeration e = cc.enumInstances(cop, true); for (; e.hasMoreElements(); ) { |
プロパティの値を出力デバイスに送ります。
System.out.println("------------------------ ---------"); CIMObjectPath op = (CIMObjectPath)e.nextElement(); CIMInstance ci = cc.getInstance(op); System.out.println("Record ID : " + (((Long)ci.getProperty("RecordID").getValue(). getValue()).longValue())); System.out.println("Log filename : " + ((String)ci.getProperty("FileName").getValue(). getValue())); int categ = (((Integer)ci.getProperty("category"). getValue().getValue()).intValue()); if (categ == 0) System.out.println("Category : Application Log"); else if (categ == 1) System.out.println("Category : Security Log"); else if (categ == 2) System.out.println("Category : System Log"); int severity = (((Integer)ci.getProperty ("severity").getValue().getValue()).intValue()); if (severity == 0) System.out.println("Severity : Informational"); else if (severity == 1) System.out.println("Severity : Warning Log!"); else if (severity == 2) System.out.println("Severity : Error!!"); System.out.println("Log Record written by :" + ((String)ci.getProperty("AppName").getValue(). getValue())); System.out.println("User : " + ((String)ci. getProperty("UserName").getValue().getValue())); System.out.println("Client Machine : " + ((String)ci. getProperty("ClientMachineName").getValue().getValue ())); System.out.println("Server Machine : " + ((String)ci. getProperty("ServerMachineName").getValue().getValue ())); System.out.println("Summary Message : " + ((String) ci.getProperty("SummaryMessage").getValue().getValue ())); System.out.println("Detailed Message : " + ((String) ci.getProperty("DetailedMessage").getValue().getValue ())); System.out.println("Additional data : " + ((String) ci.getProperty("data").getValue().getValue())); boolean syslogflag = ((Boolean)ci.getProperty("syslogflag").getValue(). getValue()).booleanValue(); if (syslogflag == true) { System.out.println("Record was written to syslog as well"); } else { System.out.println("Record was not written to syslog"); } System.out.println("----------------------------- ----"); } |
エラーが発生した場合は、ユーザーにエラーメッセージを返します。
... } catch (Exception e) { System.out.println("Exception: "+e); e.printStackTrace(); } ... |
ファイルからデータが読み取られたあとセッションを閉じます。
// セッションを閉じる。 if(cc != null) { cc.close(); } } } |
Solaris_LogServiceProperties クラスのインスタンスを作成し、そのプロパティ値を設定すれば、アプリケーションやプロバイダでロギングをどのように扱うかを制御できます。次の例は、ロギングプロパティの設定方法を示したものです。プロパティは、/usr/sadm/bin/wbem/wbemservices.properties ファイルに格納されます。
public class SetProps { public static void main(String args[]) throws CIMException { if ( args.length != 3) { System.out.println("Usage: SetProps host username password"); System.exit(1); } CIMClient cc = null; try { CIMNameSpace cns = new CIMNameSpace(args[0]); cc = new CIMClient(cns, args[1], args[2]); CIMObjectPath logpropcop = new CIMObjectPath("Solaris_Log ServiceProperties"); Enumeration e = cc.enumInstances(logpropcop, true); for (; e.hasMoreElements(); ) { CIMObjectPath op = (CIMObjectPath)e.nextElement(); CIMInstance ci = cc.getInstance(op); ci.setProperty("Directory", new CIMValue("/tmp/bar1/")); ci.setProperty("FileSize", new CIMValue("10")); ci.setProperty("NumFiles", new CIMValue("2")); ci.setProperty("SyslogSwitch", new CIMValue("off")); cc.setInstance(logpropcop,ci); } } catch (Exception e) { System.out.println("Exception: "+e); e.printStackTrace(); } // セッションを閉じる。 if(cc != null) { cc.close(); } } |
Log Viewer を使えば、ログレコードをすべて詳細に表示できます。記録されたデータは、Log Viewer のグラフィカルユーザーインタフェースを使って表示します。Log Viewer は、Solaris WBEM Services のインストール時に /usr/sadm/bin にインストールされます。Log Viewer を実行するには、ログレコードがあらかじめ作成されている必要があります。
ログレコードを作成したら Log Viewer を起動します。