This was going to be a bug report but when I saw an existing bug report for an unreleased version that appears to be the same problem (line numbers in stacktrace a little different), I decided to submit it as an example of existing behavior in the field. NPE from UniformLogFormatter.getResourceBundle() using unprotected null from LogManager.getLogger() This report originates running Glassfish 3.0.1 on 32-bit Linux. The logging system gets a NullPointerException. From my non-expert perusal of the code, it appears that com.sun.enterprise.server.logging.UniformLogFormatter.getResourceBundle() is expecting LogManager.getLogger() to never return null, but it appears it can. I'm assuming that the instance of the log manager in the UniformLogFormatter class is itself never null. Because of the nature of the problem and the code not saying what logger it's trying to use, it's difficult for me to figure out what logger or resource bundle might be problematic. The relevant excerpt of server.log with a small amount of context: [#|2010-09-27T21:21:10.452+0000|INFO|glassfish3.0.1|org.glassfish.admingui|_ThreadID=38;_ThreadName=Thread-1;|admin console: initSessionAttributes()|#] [#|2010-09-27T21:21:18.306+0000|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=36;_ThreadName=Thread-1;|java.\ util.logging.ErrorManager: 5: Error in formatting Logrecord|#] [#|2010-09-27T21:21:18.307+0000|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=36;_ThreadName=Thread-1;|java.\ lang.NullPointerException at com.sun.enterprise.server.logging.UniformLogFormatter.getResourceBundle(UniformLogFormatter.java:319) at com.sun.enterprise.server.logging.UniformLogFormatter.uniformLogFormat(UniformLogFormatter.java:275) at com.sun.enterprise.server.logging.UniformLogFormatter.format(UniformLogFormatter.java:145) at java.util.logging.StreamHandler.publish(StreamHandler.java:179) at com.sun.enterprise.server.logging.GFFileHandler.log(GFFileHandler.java:511) at com.sun.enterprise.server.logging.GFFileHandler$3.run(GFFileHandler.java:255) |#] [#|2010-09-27T21:32:14.928+0000|WARNING|glassfish3.0.1|org.apache.catalina.connector.Request|_ThreadID=25;_ThreadName=Thread-1;|PWC4011: Unable to set request character encoding to UTF-8 from context , because request parameters have already been read, or ServletRequest.getReader() has already been called|#] My attempt to match the stack trace with the source: [#|2010-09-27T21:21:18.306+0000|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=36;_ThreadName=Thread-1;|java.util.logging.ErrorManager: 5: Error in formatting Logrecord|#] [#|2010-09-27T21:21:18.307+0000|SEVERE|glassfish3.0.1|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=36;_ThreadName=Thread-1;|java.lang.NullPointerException LogManager.java /** * Return the global LogManager object. */ public static LogManager getLogManager() { if (manager != null) { manager.readPrimordialConfiguration(); } return manager; } /** * Method to find a named logger. *

* Note that since untrusted code may create loggers with * arbitrary names this method should not be relied on to * find Loggers for security sensitive logging. *

* @param name name of the logger * @return matching logger or null if none is found */ public synchronized Logger getLogger(String name) { WeakReference ref = loggers.get(name); if (ref == null) { return null; } Logger logger = ref.get(); if (logger == null) { // Hashtable holds stale weak reference // to a logger which has been GC-ed. loggers.remove(name); } return logger; } UniformLogFormatter.java: private LogManager logManager; public UniformLogFormatter() { super( ); loggerResourceBundleTable = new HashMap( ); logManager = LogManager.getLogManager( ); } at com.sun.enterprise.server.logging.UniformLogFormatter.getResourceBundle(UniformLogFormatter.java:319) private synchronized ResourceBundle getResourceBundle( String loggerName ) { if( loggerName == null ) { return null; } ResourceBundle rb = (ResourceBundle) loggerResourceBundleTable.get( loggerName ); if( rb == null ) { 319: rb = logManager.getLogger( loggerName ).getResourceBundle( ); loggerResourceBundleTable.put( loggerName, rb ); } return rb; } at com.sun.enterprise.server.logging.UniformLogFormatter.uniformLogFormat(UniformLogFormatter.java:275) 275: ResourceBundle rb = getResourceBundle(record.getLoggerName( ) ); at com.sun.enterprise.server.logging.UniformLogFormatter.format(UniformLogFormatter.java:145) public String format( LogRecord record ) { 145: return uniformLogFormat( record ); } at java.util.logging.StreamHandler.publish(StreamHandler.java:179) } String msg; try { 179: msg = getFormatter().format(record); } catch (Exception ex) { // We don't want to throw an exception here, but we // report the exception to any registered ErrorManager. reportError(null, ex, ErrorManager.FORMAT_FAILURE); return; } at com.sun.enterprise.server.logging.GFFileHandler.log(GFFileHandler.java:511) try { record = pendingRecords.take(); 511: super.publish(record); if (record.getLevel().intValue()>=Level.WARNING.intValue()) { recentErrors.offer(record); } } catch (InterruptedException e) { return; } at com.sun.enterprise.server.logging.GFFileHandler$3.run(GFFileHandler.java:255) |#] // start the Queue consummer thread. pump = new Thread() { public void run() { try { while (!done.isSignalled()) { 255: log(); } } catch (RuntimeException e) { } } }; pump.start();