Solaris WBEM Services Administrator's Guide

Using the APIs to Enable Logging

You can view log file contents in the Solaris Management Console (SMC) Log Viewer. For more information on the Solaris Management Console, see the man page smc(1M).

You can also develop your own log viewer if you prefer to view log files in a customized manner. You can use the WBEM logging APIs to develop a logging program which will:

Writing Data to a Log File

Enabling an application to write data to a log file involves the following main tasks:

How to Create an Instance of Solaris_LogRecord To Write Data
  1. Import all the necessary Java classes. The classes listed in Example 5-1 are the minimum classes that are required.


    Example 5-1 Creating an Instance of Solaris_LogRecord To Write Data

    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. Declare the public class CreateLog and the following values:

    • CIMClient instance

    • CIMObjectPath instance

    • CIMNameSpace instance

    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. Specify the vector of properties to be returned. Set values for the properties of the qualifiers.

    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. Declare the new instance of the CIMObjectPath class for the log record.

    CIMObjectPath logreccop = new CIMObjectPath("Solaris_LogRecord", keys);

  5. Declare the new instance of Solaris_LogRecord. Set the vector of properties to write to a file.

    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. Close the session after data has been written to the log file.

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

Reading Data From a Log File

Enabling an application to read data from a log file to a log viewer involves the following tasks:

How to Get an Instance of the Solaris_LogRecord Class and Read Data
  1. Import all the necessary Java classes. The classes listed below are the minimum required.

    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. Declare the class 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. Set the CIMClient, CIMObjectPath, and CIMNameSpace values of the ReadLog class.

    } 	
    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. Enumerate the instances of Solaris_LogRecord.

    Enumeration e = cc.enumInstances(cop, true);
        for (; e.hasMoreElements(); ) {
  5. Send the property values to an output device.

    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. Return an error message to the user if an error condition occurs.

    ...
    	catch (Exception e) {
    	    System.out.println("Exception: "+e);
    		e.printStackTrace(); }
    ...
  7. Close the session when the data has been read from the file.

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

Setting Logging Properties

You can create an instance of the Solaris_LogServiceProperties class and set property values for the instance to control how your application or provider handles logging. The following code example shows how to set logging properties. Properties are stored in the /usr/sadm/lib/wbem/WbemServices.properties file.


Example 5-2 Setting Logging 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();
	}

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