Solaris WBEM 開発ガイド

ログメッセージの読み取りと書き込み

Solaris MOF ファイルには、ログクラスが含まれます。クライアントは、これらのクラスを使用してエラー、警告、および情報メッセージをログに記録し、読み取ることができます。たとえば、ログメッセージから次のような状態を読み取ることができます。

ログクラスの基盤となるプロバイダは、ログ要求を syslog デーモン (Solaris オペレーティング環境のデフォルトログシステム) に転送できます。詳細は、syslogd(1M) のマニュアルページを参照してください。

ログファイルについて

WBEM ログメッセージは、/var/sadm/wbem/log ディレクトリ内の個々のログファイルに格納されます。Solaris_LogServiceProperties クラスの singleton インスタンスでは、次のプロパティを操作できます。

各ログエントリの形式は、CIM_LogRecord のサブクラスである Solaris_LogEntry クラスによって定義されます。Solaris_LogEntrySolaris_Device.mof 内に、CIM_LogRecordCIM_Device26.mof 内に存在します。

ログメッセージには、次の要素が含まれます。

表 4–8 ログメッセージの要素

要素 

説明 

Category

メッセージの種類 – アプリケーション、システム、またはセキュリティ 

Severity

状況の重大性 – 警告またはエラー 

Application

ログメッセージを書き込んだアプリケーション (またはプロバイダ) の名前 

User

ログメッセージの生成時にアプリケーションを使用していたユーザー名 

Client Machine

ログメッセージの生成時にユーザーが使用していたシステム名および IP アドレス 

Server Machine

ログメッセージの原因となったイベントが発生したシステム名 

Summary Message

イベントの概要説明 

Detailed Message

イベントの詳細説明 

Data

イベントをより把握するための状況説明 

SyslogFlag

メッセージを syslogd(1M) に送信するかどうかを指定するブール値のフラグ

次の例では、ログを作成し、その内容を表示します。


例 4–25 Solaris_LogEntry のインスタンス作成

このプログラム例では、Solaris_LogEntry のインスタンスを作成し、そのインスタンスを設定します。

public class CreateLog {
    public static void main(String args[]) throws CIMException {

        // 渡されたコマンド行引数が不足している場合、
        // 使用法を表示する
        if (args.length < 3) {
            System.out.println("Usage: CreateLog host username password 
                               " + "[rmi|http]"); 
            System.exit(1);
        }

        String protocol = CIMClient.CIM_RMI;
        CIMClient cc = null;
        CIMObjectPath cop = null;
        BufferedReader d = new BufferedReader(new InputStreamReader
                                             (System.in));

        String input_line = "";

        // 作成するレコード数をユーザーに問い合わせる
        System.out.print("How many log records do you want to write? ");
        int num_recs = 0;

        try {
                num_recs = Integer.parseInt(d.readLine());
        } catch (Exception ex) {
                ex.printStackTrace();
                System.exit(1);
        }

        // try-catch ブロックのオーバーアーチ
        try {
            CIMNameSpace cns = new CIMNameSpace(args[0]);
            UserPrincipal up = new UserPrincipal(args[1]);
            PasswordCredential pc = new PasswordCredential(args[2]);

            // トランスポートプロトコルをデフォルトの RMI に設定する
            if (args.length == 4 && args[3].equalsIgnoreCase("http")) {
                protocol = CIMClient.CIM_XML;
            }

            cc = new CIMClient(cns, up, pc, protocol);

                Vector keys = new Vector();
                CIMProperty logsvcKey = null;


                // ログ記録の作成に必要な関連情報の入力を
                // ユーザーに求める

                System.out.println("Please enter the record Category: ");
                System.out.println("\t(0)application, (1)security, 
                                                      (2)system");
                logsvcKey = new CIMProperty("category");
                input_line = d.readLine();
                logsvcKey.setValue(new CIMValue(Integer.valueOf
                                               (input_line)));
                keys.addElement(logsvcKey);
                System.out.println("Please enter the record Severity:");
                System.out.println("\t(0)Informational, (1)Warning, 
                                                        (2)Error");
                logsvcKey = new CIMProperty("severity");
                input_line = d.readLine();
                logsvcKey.setValue(new CIMValue(Integer.valueOf
                                  (input_line)));
                keys.addElement(logsvcKey);
                logsvcKey = new CIMProperty("Source");
                System.out.println("Please enter Application Name:");
                logsvcKey.setValue(new CIMValue(d.readLine()));
                keys.addElement(logsvcKey);
                logsvcKey = new CIMProperty("SummaryMessage");
                System.out.println("Please enter a summary message:");
                logsvcKey.setValue(new CIMValue(d.readLine()));
                keys.addElement(logsvcKey);
                logsvcKey = new CIMProperty("DetailedMessage");
                System.out.println("Please enter a detailed message:");
                logsvcKey.setValue(new CIMValue(d.readLine()));
                keys.addElement(logsvcKey);
                logsvcKey = new CIMProperty("RecordData");
                logsvcKey.setValue(
                        new CIMValue("0xfe 0x45 0xae 0xda random data"));
                keys.addElement(logsvcKey);
                logsvcKey = new CIMProperty("SyslogFlag");
                logsvcKey.setValue(new CIMValue(new Boolean(true)));
                keys.addElement(logsvcKey);
                CIMObjectPath logreccop = 
                        new CIMObjectPath("Solaris_LogEntry", keys);
                CIMClass logClass = cc.getClass(logreccop);
                CIMInstance ci = logClass.newInstance();
                ci.setClassName("Solaris_LogEntry");
                ci.setProperties(keys);
                // System.out.println(ci.toString());

                // 要求された数のレコードインスタンスを作成する
                for (int i = 0; i < num_recs; i++) {
                        cc.createInstance(logreccop, ci);
                }
        } catch (Exception e) {
            System.out.println("Exception: "+e);
                e.printStackTrace();
        }

        // セッションの終了
        if (cc != null) {
            cc.close();
        }
    }
}


例 4–26 ログ記録リストの表示

このプログラム例では、ログ記録のリストを表示します。

 public class ReadLog {
    public static void main(String args[]) throws CIMException {

        String protocol = CIMClient.CIM_RMI;

        // 渡されたコマンド行引数が不足している場合、
        // 使用法を表示する
        if (args.length < 3) {
            System.out.println("Usage: ReadLog host username password " +
                               "[rmi|http]"); 
            System.exit(1);
        }

        CIMClient cc = null;
        CIMObjectPath cop = null;
        CIMObjectPath serviceObjPath = null;
        Vector inVec = new Vector();
        Vector outVec = new Vector();

        //  try-catch ブロックのオーバーアーチ
        try {
            CIMNameSpace cns = new CIMNameSpace(args[0]);
            UserPrincipal up = new UserPrincipal(args[1]);
            PasswordCredential pc = new PasswordCredential(args[2]);

            // トランスポートプロトコルをデフォルトの RMI に設定する
            if (args.length == 4 && args[3].equalsIgnoreCase("http")) {
                protocol = CIMClient.CIM_XML;
            }

            cc = new CIMClient(cns, up, pc, protocol);

            cop = new CIMObjectPath("Solaris_LogEntry");

            //  Solaris_LogEntry クラスのインスタンスリストを列挙する
            Enumeration e = cc.enumerateInstances(cop, true, false,
                                                false, false, null);

            // リストを繰り返し処理して、各プロパティを出力する
            for (; e.hasMoreElements(); ) {
                System.out.println("---------------------------------");
                CIMInstance ci = (CIMInstance)e.nextElement();
                System.out.println("Log filename : " + 
                    ((String)ci.getProperty("LogName").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("Source").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("RecordData").getValue().getValue()));
                boolean syslogflag =
    ((Boolean)ci.getProperty("SyslogFlag").getValue().getValue()).
booleanValue();
                if (syslogflag == true) {
                    System.out.println("Record was written to syslog");
                } 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();
        }
    }
}