Use a logger


 

+

Search Tips   |   Advanced Search

 

Use Java logging to log messages and add tracing.

Use WsLevel.DETAIL level and above for messages, and lower levels for trace. The WAS Extension API, package...

com.ibm.websphere.logging

...contains the WsLevel class.

For messages use:

WsLevel.FATAL
Level.SEVERE
Level.WARNING
WsLevel.AUDIT
Level.INFO
Level.CONFIG
WsLevel.DETAIL

For trace use:

Level.FINE
Level.FINER
Level.FINEST

  1. Use the logp method instead of the log or the logrb method.

    The logp method accepts parameters for class name and method name. The log and logrb methods will generally try to infer this information, but the performance penalty is prohibitive. In general, the logp method has less performance impact than the log or the logrb method.

  2. Avoid using the logrb method. This method leads to inefficient caching of resource bundles and poor performance.

  3. Use the isLoggable method to avoid creating data for a logging call that does not get logged. For example:

     if (logger.isLoggable(Level.FINEST)) 
    {
       
    // some expensive to compute method
       String s = dumpComponentState();  
       logger.logp(Level.FINEST, className, methodName, "componentX state dump:\n{0}", s);
    }
    

 

Example

The following sample applies to localized messages:


// Generally avoid use of FINE, FINER, FINEST levels for messages to be consistent with WAS
String componentName = "com.ibm.websphere.componentX";
 String resourceBundleName = "com.ibm.websphere.componentX.Messages";
 Logger logger = Logger.getLogger(componentName, resourceBundleName);


// "Convenience" methods - not generally recommended due to lack of class method names

//   - cannot specify message substitution parameters

//   - cannot  specify class and method names
 if (logger.isLoggable(Level.SEVERE))
  logger.severe("MSG_KEY_01");
 if (logger.isLoggable(Level.WARNING))
  logger.warning("MSG_KEY_01");
 if (logger.isLoggable(Level.INFO))
  logger.info("MSG_KEY_01");
 if (logger.isLoggable(Level.CONFIG))
  logger.config("MSG_KEY_01");



// log methods are not generally used due to lack of class and method  names

//   - enable use of WAS-specific levels

//   - enable use of message substitution parameters

//   - cannot specify class and method names if (logger.isLoggable(WsLevel.FATAL))
  logger.log(WsLevel.FATAL, "MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.SEVERE))
  logger.log(Level.SEVERE, "MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.WARNING))
  logger.log(Level.WARNING, "MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(WsLevel.AUDIT))
  logger.log(WsLevel.AUDIT, "MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.INFO))
  logger.log(Level.INFO, "MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.CONFIG))
  logger.log(Level.CONFIG, "MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(WsLevel.DETAIL))
  logger.log(WsLevel.DETAIL, "MSG_KEY_01", "parameter 1");



// logp methods are the way to log

//   - enable use of WAS-specific levels

//   - enable use of message substitution parameters

//   - enable use of class and method names if (logger.isLoggable(WsLevel.FATAL))
  logger.logp(WsLevel.FATAL, className, methodName, "MSG_KEY_01", 
"parameter 1");
 if (logger.isLoggable(Level.SEVERE))
  logger.logp(Level.SEVERE, className, methodName, "MSG_KEY_01", 
"parameter 1");
 if (logger.isLoggable(Level.WARNING))
  logger.logp(Level.WARNING, className, methodName, "MSG_KEY_01", 
"parameter 1");
 if (logger.isLoggable(WsLevel.AUDIT))
  logger.logp(WsLevel.AUDIT, className, methodName, "MSG_KEY_01", 
"parameter 1");
 if (logger.isLoggable(Level.INFO))
  logger.logp(Level.INFO, className, methodName, "MSG_KEY_01", 
"parameter 1");
 if (logger.isLoggable(Level.CONFIG))
  logger.logp(Level.CONFIG, className, methodName, "MSG_KEY_01", 
"parameter 1");
 if (logger.isLoggable(WsLevel.DETAIL))
  logger.logp(WsLevel.DETAIL, className, methodName, "MSG_KEY_01", 
"parameter 1");



// logrb methods are not generally used due to diminished performance  of switching resource bundles dynamically

//   - enable use of WAS-specific levels

//   - enable use of message substitution parameters

//   - enable use of class and method names String resourceBundleNameSpecial = 
"com.ibm.websphere.componentX.MessagesSpecial";
 if (logger.isLoggable(WsLevel.FATAL))
  logger.logrb(WsLevel.FATAL, className, methodName, resourceBundleNameSpecial, 
"MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.SEVERE))
  logger.logrb(Level.SEVERE, className, methodName, resourceBundleNameSpecial, 
"MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.WARNING))
  logger.logrb(Level.WARNING, className, methodName, resourceBundleNameSpecial, 
"MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(WsLevel.AUDIT))
  logger.logrb(WsLevel.AUDIT, className, methodName, resourceBundleNameSpecial, 
"MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.INFO))
  logger.logrb(Level.INFO, className, methodName, resourceBundleNameSpecial, 
"MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(Level.CONFIG))
  logger.logrb(Level.CONFIG, className, methodName, resourceBundleNameSpecial, 
"MSG_KEY_01", "parameter 1");
 if (logger.isLoggable(WsLevel.DETAIL))
  logger.logrb(WsLevel.DETAIL, className, methodName, resourceBundleNameSpecial, 
"MSG_KEY_01", "parameter 1");


For trace, or content not localized, the following sample applies:

// note - generally avoid use of FATAL, SEVERE, WARNING, AUDIT, 
// INFO, CONFIG, DETAIL levels for trace 

// to be consistent with WAS

String componentName = "com.ibm.websphere.componentX"; Logger logger = Logger.getLogger(componentName); // Entering / Exiting methods are used for non trivial methods if (logger.isLoggable(Level.FINER)) logger.entering(className, methodName); if (logger.isLoggable(Level.FINER)) logger.entering(className, methodName, "method param1"); if (logger.isLoggable(Level.FINER)) logger.exiting(className, methodName); if (logger.isLoggable(Level.FINER)) logger.exiting(className, methodName, "method result"); // Throwing method is not generally used due to lack of message - use logp with a throwable parameter instead if (logger.isLoggable(Level.FINER)) logger.throwing(className, methodName, throwable); // Convenience methods are not generally used due to lack of class / method names // - cannot specify message substitution parameters // - cannot specify class and method names if (logger.isLoggable(Level.FINE)) logger.fine("This is my trace"); if (logger.isLoggable(Level.FINER)) logger.finer("This is my trace"); if (logger.isLoggable(Level.FINEST)) logger.finest("This is my trace"); // log methods are not generally used due to lack of class and method names // - enable use of WAS-specific levels // - enable use of message substitution parameters // - cannot specify class and method names if (logger.isLoggable(Level.FINE)) logger.log(Level.FINE, "This is my trace", "parameter 1"); if (logger.isLoggable(Level.FINER)) logger.log(Level.FINER, "This is my trace", "parameter 1"); if (logger.isLoggable(Level.FINEST)) logger.log(Level.FINEST, "This is my trace", "parameter 1"); // logp methods are the recommended way to log // - enable use of WAS-specific levels // - enable use of message substitution parameters // - enable use of class and method names if (logger.isLoggable(Level.FINE)) logger.logp(Level.FINE, className, methodName, "This is my trace", "parameter 1"); if (logger.isLoggable(Level.FINER)) logger.logp(Level.FINER, className, methodName, "This is my trace", "parameter 1"); if (logger.isLoggable(Level.FINEST)) logger.logp(Level.FINEST, className, methodName, "This is my trace", "parameter 1"); // logrb methods are not applicable for trace logging because no localization is involved

 

Related tasks

Set the logger hierarchy
Create log resource bundles and message files

 

Related

Example: Create custom log handlers with java.util.logging
Example: Create custom filters with java.util.logging
Example: Create custom formatters with java.util.logging
Example: Add custom handlers, filters, and formatters