Use Custom logging Formatter/Handler in Eclipse RCP

In my latest Eclipse RCP project, we use java.util.logging and want to add a custom Formatter in logging properties.

It works on IBM JDK 6.0, but doesn't work on Sun JDK, or any IBM previous JDK releases.Compared the source code of LogManager and Handler classes in Sun JDK or IBM old JDK releases, I figured out that this is because in IBM JDK 6.0, when to new a Formatter (Hanlder etc) instance, it use context ClassLoader (the ClassLoader of the method that called the caller) to load Formatter class:
Thread.currentThread().getContextClassLoader() But in old releases, it just use system classloader to load formatter class: ClassLoader.getSystemClassLoader().loadClass(val)
Of course, it can't find our custom Formatter class in system classloader, so it throws ClassNotFoundException.
The simple (not elegant way) is that when the application starts, configure jdk logging in AbstractUIPlugin subclass:

public class Activator extends AbstractUIPlugin  
{  
  public static final String PLUGIN_ID = "org.codeexample.myrcp"; //$NON-NLS-1$  
  public Activator(){}  
  public void start(BundleContext context) throws Exception  
  {  
   LogConfigurer.configureLogging();  
   final Logger logger = Logger.getLogger(Activator.class.getName());  
   // test logger  
   logger.warning("hello logger: " + new Date());  
   logger.throwing(Activator.class.getName(), "start", new RuntimeException("thrown exception"));  
   super.start(context);  
  }  
  public void stop(BundleContext context) throws Exception  
  {  
   super.stop(context);  
  }  
 }  
public class LogConfigurer { 
     public static String DATE_FOMAT = "yyyy-MM-dd hh:mm:ss.SSS"; 
     public static String LOG_DIRECTORY = Platform.getLocation() 
               .toPortableString() + IConstants.FILE_SEPARATOR + "logs"; 
     public static String LOG_PREFIX = "main"; 
     public static boolean configured = false; 
     public synchronized static void configureLogging() { 
          if (!configured) { 
               configured = true; 
               try { 
                    LogManager.getLogManager().readConfiguration( 
                              LogConfigurer.class 
                                        .getResourceAsStream("logging.properties")); 
                    File file = new File(LOG_DIRECTORY); 
                    if (!file.exists()) { 
                         file.mkdir(); 
                    } 
                    FileHandler fileHandler = new FileHandler(LOG_DIRECTORY 
                              + IConstants.FILE_SEPARATOR + LOG_PREFIX + ".log", true); 
                    fileHandler.setFormatter(new MySimpleFormatter()); 
                    fileHandler.setEncoding("UTF-8"); 
                    fileHandler.setLevel(Level.FINER); 
                    ConsoleHandler consoleHandler = new ConsoleHandler(); 
                    consoleHandler.setFormatter(new MySimpleFormatter()); 
                    consoleHandler.setEncoding("UTF-8"); 
                    consoleHandler.setLevel(Level.ALL); 
                    Logger parentLogger = Logger 
                              .getLogger("com.ibm.storage.ess.cli.wrapper"); 
                    parentLogger.addHandler(fileHandler); 
                    parentLogger.addHandler(consoleHandler); 
                    parentLogger.setLevel(Level.ALL); 
               } catch (Exception e) { 
                    Activator.logException(e); 
               } 
          } 
     } 
} 
/** 
 * The code is similar as JDK SimpleFormatter, just made a little change to 
 * record all message(including exception stack) in one line. 
 */ 
public class MySimpleFormatter extends Formatter { 
     Date dat = new Date(); 
     private final static String format = "{0,date," + LogConfigurer.DATE_FOMAT 
               + "}"; 
     private MessageFormat formatter; 
     private Object args[] = new Object[1]; 
     public static final String LINE_SEPARATOR = System 
               .getProperty("line.separator"); 
     private String separator = " ------ "; 
     public synchronized String format(LogRecord record) { 
          StringBuffer sb = new StringBuffer(); 
          // Minimize memory allocations here. 
          dat.setTime(record.getMillis()); 
          args[0] = dat; 
          StringBuffer text = new StringBuffer(); 
          if (formatter == null) { 
               formatter = new MessageFormat(format); 
          } 
          formatter.format(args, text, null); 
          sb.append(text); 
          sb.append(" "); 
          if (record.getSourceClassName() != null) { 
               sb.append(record.getSourceClassName()); 
          } else { 
               sb.append(record.getLoggerName()); 
          } 
          if (record.getSourceMethodName() != null) { 
               sb.append(" "); 
               sb.append(record.getSourceMethodName()); 
          } 
          sb.append(separator); 
          String message = formatMessage(record); 
          sb.append(record.getLevel().getLocalizedName()); 
          sb.append(": "); 
          sb.append(message); 
          if (record.getThrown() != null) { 
               sb.append(separator); 
               try { 
                    StringWriter sw = new StringWriter(); 
                    PrintWriter pw = new PrintWriter(sw); 
                    record.getThrown().printStackTrace(pw); 
                    pw.close(); 
                    String str = sw.toString(); 
                    String[] strs = str.split(IConstants.LINE_SEPARATOR); 
                    for (int i = 0; i < strs.length; i++) { 
                         sb.append(strs[i]); 
                         if (i != strs.length - 1) { 
                              sb.append(separator); 
                         } 
                    } 
               } catch (Exception ex) { 
               } 
          } 
          sb.append("\n"); 
          return sb.toString(); 
     } 
} 
Post a Comment

Labels

Java (159) Lucene-Solr (112) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (38) Eclipse (33) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) Shell (7) ANT (6) Coding Skills (6) Database (6) Lesson Learned (6) Programmer Skills (6) Scala (6) Tips (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) System Design (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts