Solaris WBEM Services の管理

第 5 章 システムのロギング

ロギングは、WBEM 管理者がシステムのイベントを追跡して発生原因を調べるためのサービスです。シリアルポートにアクセスできない場合や、ファイルシステムのマウントでエラーメッセージが表示された場合、システムディスクが容量の限界に達した場合などのイベントを記録することができます。

この章で取り上げる内容は次のとおりです。

ロギングについて

ロギングサービスは、サービスプロバイダが返すことになっているすべてのアクションや、Solaris WBEM Services のコンポーネントが完了したすべてのアクションを記録します。内容情報およびエラーをログに記録することができます。たとえば、ユーザーがシリアルポートを無効にすると、シリアルポートプロバイダによってこの情報が自動的に記録されます。システムエラーなどの障害が発生した場合には、WBEM 管理者はログ記録を参照して発生原因を調べることができます。

コンポーネント、アプリケーション、およびプロバイダはすべて、システムイベントに応答してロギングを自動的に開始します。たとえば、CIM Object Manager は、インストールと起動が終わると自動的にイベントを記録します。

WBEM 環境向けに作成されるアプリケーションとプロバイダには、ロギングを設定できます。詳細は、「API によるロギングの有効化」を参照してください。Solaris Management Console (SMC) ログビューア内のログデータを参照して、セットアップしたロギング機能のデバッグを行うことができます。SMC についての詳細は、smc(1M) のマニュアルページを参照してください。

ログファイル

アプリケーションまたはプロバイダがイベントを記録するように設定すると、イベントはログファイルに書き込まれます。ログ記録はすべて、パス /var/sadm/wbem/logr に格納されます。ログファイルは、次の命名規則を使用します。


wbem_log.#

# は、ログファイルのバージョンを示すために付加される番号です。.1 が付いたログファイル (例: wbem_log.1) は、最後に保存されたバージョンです。.2 が付いたログファイルは、その前に保存されたバージョンです。拡張子が大きいファイル (例: wbem_log.16) ほど、バージョンが古いことを示します。最も新しいバージョンのファイル、それ以前のバージョンのファイルとも、/usr/sadm/wbem/log 内に 1 つのアーカイブとして同時に存在します。

次の 2 つの状況のうちの 1 つが発生した場合、ログファイルはファイル名拡張子 .1 による名前変更が行われ、保存されます。

ログファイルの規則

Solaris_LogServiceProperties クラスは、Solaris_Core1.0.mof で定義されています。Solaris_LogServiceProperties クラスには、次のログファイル属性を制御するプロパティがあります。

データをログファイルに書き込むアプリケーションにこれらの属性のどれかを指定するには、Solaris_LogServiceProperties の新しいインスタンスを作成し、その関連プロパティの値を設定します。新しいインスタンスのプロパティ値を設定する方法については、例 5-1 を参照してください。

ログファイルの形式

ロギングサービスは、一般的なログ記録として、アプリケーションログ、システムログ、およびセキュリティログの 3 種類を提供しています。ログ記録は、通知用のメッセージのことも、エラーまたは警告を記述したデータのこともあります。ログに表示できる標準のフィールドがデータに定義されていますが、ログはすべてのフィールドを使用するとは限りません。たとえば、通知用のログではイベントについて説明した簡単なメッセージが示され、エラーログでは詳細なメッセージが示される場合があります。

ログデータフィールドの中には、CIM Repository 内のデータを識別するものがあります。これらのフィールドは、Solaris_LogRecord クラス内の読み取り専用のキー修飾子が付けられたプロパティです。これらのフィールドの値は設定できません。ログファイル内の次のフィールドの値は設定できます。

ログクラス

ロギングには、2 つの Solaris スキーマクラス、Solaris_LogRecordSolaris_LogService の使用が含まれます。

Solaris_LogRecord クラス

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 はログエントリを個別に識別しますが、生成されたデータが表示される場合にログ書式の一部としては示されません。

書き込み可能修飾子の値は設定できます。たとえば、イベントが発生したシステムを識別する ClientMachineNameServerMachineName のようなプロパティの修飾子の値を設定できます。

SysLogFlag プロパティが真に設定されていると、ログレコードの詳しいメッセージが Solaris システムの syslog デーモンに自動的に送信されます。

Solaris_LogService クラス

Solaris_LogService クラスは、ロギングサービスのオペレーションの制御と、ログデータの処理方法の定義を行います。このクラスには、アプリケーションが特定のイベントについてのデータを発行元アプリケーションから CIM Object Manager へ送信するために使用できる一連のメソッドが含まれます。データは、CIM Object Manager からの応答 (CIM Repository からのデータ検出など) を生成するトリガーとなります。

Solaris_LogService クラスには、次のメソッドがあります。

Solaris_LogServiceProperties クラスでは、ロギングプロパティを設定することができます。「ロギングプロパティの設定」を参照してください。

Solaris_LogService クラスの定義は、/usr/sadm/mof/ にある Solaris_Core1.0.mof ファイル内で参照することができます。

API によるロギングの有効化

ログファイルの内容を、Solaris Management Console (SMC) ログビューアで参照することができます。Solaris Management Console についての詳細は、smc(1M) のマニュアルページを参照してください。

ログファイルをカスタマイズした方法で参照したい場合は、独自のログビューアを開発することもできます。WBEM ロギング API を使用して、次のことを行うロギングプログラムを開発することができます:

ログファイルへのデータの書き込み

アプリケーションでデータをログファイルに書き込むには、次の作業を行います。

データを書き込むために Solaris_LogRecord のインスタンスを作成する方法
  1. 必要なすべての java クラスをインポートします。以下に示すクラスは必要な最小限のクラスです。


    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.*;
  2. 公開クラス CreateLog と次の値を宣言します。

    • 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]);
  3. プロパティのベクトルが返されるように指定します。修飾子のプロパティに値を設定します。


    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);
  4. ログ記録用に CIMObjectPath クラスの新しいインスタンスを宣言します。


    CIMObjectPath logreccop = new CIMObjectPath("Solaris_LogRecord", keys);
  5. 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();
    	}
  6. データがログファイルに書きこまれたあと、セッションを閉じます。


    // セッションを閉じる
    	if(cc != null) {
    	    cc.close();
    	}
        }
    }

ログファイルからのデータの読み取り

アプリケーションでログファイルからログビューアにデータを読み込むには、次の作業を行います。

Solaris_LogRecord クラスのインスタンスを取得し、データを読み取る方法
  1. 必要なすべての java クラスをインポートします。以下にリストされているクラスは、必要な最小限のクラスです。


    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;
  2. クラス 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);
  3. ReadLog クラスの CIMClientCIMObjectPath、および CIMNameSpace の値を設定します。


    } 	
    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");
  4. Solaris_LogRecord のインスタンスを列挙します。


    Enumeration e = cc.enumInstances(cop, true);
        for (; e.hasMoreElements(); ) {
  5. プロパティの値を出力デバイスに送ります。


    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("---------------------------------");
  6. エラーが発生した場合は、ユーザーにエラーメッセージを返します。


    ...
    	catch (Exception e) {
    	    System.out.println("Exception: "+e);
    		e.printStackTrace(); }
    ...
  7. ファイルからデータが読み取られたあとセッションを閉じます。


    // セッションを閉じる
    	if(cc != null) {
    	    cc.close();
    	}
    }
    }

ロギングプロパティの設定

Solaris_LogServiceProperties クラスのインスタンスを作成し、そのインスタンスのプロパティ値を設定すれば、アプリケーションやプロバイダでロギングをどのように扱うかを制御できます。次の例は、ロギングプロパティの設定方法を示したものです。プロパティは、/usr/sadm/lib/wbem/WbemServices.properties ファイルに格納されます。


例 5-1 ロギングプロパティの設定


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();
	}

	// close session.
	if(cc != null) {
	    cc.close();
	}    
}

ログデータの表示

記録されたデータを参照するためのグラフィカルユーザーインタフェースを提供するアプリケーションである Solaris Management Console (SMC) ログビューアで、ログレコードのすべての詳細を参照することができます。SMC についての詳細は、smc(1M) のマニュアルページを参照してください。

ログビューアの起動

ログレコードを作成後、SMC および SMC のログビューアを起動します。

SMC およびログビューアを起動する方法
  1. 以下のようにして SMC 起動コマンドのロケーションへ移動します。


    # cd /usr/sbin
    
  2. 次のコマンドを実行して SMC を起動します。


    # ./smc
    
  3. 「ナビゲーション (Navigation)」パネルで「このコンピュータ (This Computer)」をダブルクリックして (またはその隣にある展開/縮小の機能を持つアイコンをシングルクリックして) その下にあるツリーを展開します。「システムステータス (System Status)」をダブルクリックすると、「ログビューア (Log Viewer)」アイコンが表示されます。

  4. 「ログビューア (Log Viewer)」アイコンをクリックしてアプリケーションを起動します。

図 5-1 Solaris Management Console で「ログビューア (Log Viewer)」を選択した状態

Graphic