Author: rmannibucau Date: Sun Sep 8 09:22:22 2013 New Revision: 1520847 URL: http://svn.apache.org/r1520847 Log: OPENEJB-2037 better handling of logging for EJBContainer
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java?rev=1520847&r1=1520846&r2=1520847&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java Sun Sep 8 09:22:22 2013 @@ -92,22 +92,19 @@ import static org.apache.openejb.cdi.Sco * @version $Rev$ $Date$ */ public class OpenEjbContainer extends EJBContainer { - static { - Core.warmup(); - // if tomee embedded was ran we'll lost log otherwise final String logManger = System.getProperty("java.util.logging.manager"); if (logManger != null) { try { Thread.currentThread().getContextClassLoader().loadClass(logManger); - } catch (Exception ignored) { + } catch (final Exception ignored) { final Field field; try { field = LogManager.class.getDeclaredField("manager"); field.setAccessible(true); field.set(null, new JuliLogStreamFactory.OpenEJBLogManager()); - } catch (Exception ignore) { + } catch (final Exception ignore) { // ignore } } @@ -115,9 +112,9 @@ public class OpenEjbContainer extends EJ } public static final String OPENEJB_EMBEDDED_REMOTABLE = "openejb.embedded.remotable"; - static Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, OpenEjbContainer.class); private static OpenEjbContainer instance; + private static Logger logger = null; // initialized lazily to get the logging config from properties private ServiceManagerProxy serviceManager; private Options options; @@ -141,8 +138,8 @@ public class OpenEjbContainer extends EJ session = new MockHttpSession(); try { startContexts(webBeanContext.getContextsService(), servletContext, session); - } catch (Exception e) { - logger.warning("can't start all CDI contexts", e); + } catch (final Exception e) { + logger().warning("can't start all CDI contexts", e); } } @@ -163,7 +160,7 @@ public class OpenEjbContainer extends EJ try { assembler.destroyApplication(info); } catch (UndeployException e) { - logger.error(e.getMessage(), e); + logger().error(e.getMessage(), e); } } } @@ -171,10 +168,10 @@ public class OpenEjbContainer extends EJ try { stopContexts(webBeanContext.getContextsService(), servletContext, session); } catch (Exception e) { - logger.warning("can't stop all CDI contexts", e); + logger().warning("can't stop all CDI contexts", e); } - logger.info("Destroying OpenEJB container"); + logger().info("Destroying OpenEJB container"); OpenEJB.destroy(); instance = null; } @@ -223,7 +220,7 @@ public class OpenEjbContainer extends EJ try { OWBInjector.inject(webBeanContext.getBeanManagerImpl(), object, null); } catch (Throwable t) { - logger.warning("an error occured while injecting the class '" + object.getClass().getName() + "': " + t.getMessage()); + logger().warning("an error occured while injecting the class '" + object.getClass().getName() + "': " + t.getMessage()); } finally { if (context != null) { ThreadContext.exit(oldContext); @@ -276,10 +273,17 @@ public class OpenEjbContainer extends EJ serviceManager = new ServiceManagerProxy(); serviceManager.start(); } catch (ServiceManagerProxy.AlreadyStartedException e) { - logger.debug("Network services already started. Ignoring option " + OPENEJB_EMBEDDED_REMOTABLE); + logger().debug("Network services already started. Ignoring option " + OPENEJB_EMBEDDED_REMOTABLE); } } + private static Logger logger() { // don't trigger init too eagerly to be sure to be configured + if (logger == null) { + logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, OpenEjbContainer.class); + } + return logger; + } + public static class NoInjectionMetaDataException extends IllegalStateException { public NoInjectionMetaDataException(final String s) { @@ -309,7 +313,7 @@ public class OpenEjbContainer extends EJ if (isOtherProvider(map)) return null; if (instance != null || OpenEJB.isInitialized()) { - logger.info("EJBContainer already initialized. Call ejbContainer.close() to allow reinitialization"); + logger().info("EJBContainer already initialized. Call ejbContainer.close() to allow reinitialization"); return instance; } @@ -340,6 +344,8 @@ public class OpenEjbContainer extends EJ OpenEJB.init(properties); + Core.warmup(); // don't do it too eagerly to avoid to not have properties + DeploymentLoader.reloadAltDD(); // otherwise hard to use multiple altdd with several start/stop in the same JVM final ConfigurationFactory configurationFactory = new ConfigurationFactory(); @@ -389,14 +395,14 @@ public class OpenEjbContainer extends EJ } catch (ValidationFailedException e) { - logger.warning("configureApplication.loadFailed", appModule.getModuleId(), e.getMessage()); // DO not include the stacktrace in the message + logger().warning("configureApplication.loadFailed", appModule.getModuleId(), e.getMessage()); // DO not include the stacktrace in the message throw new InvalidApplicationException(e); } catch (OpenEJBException e) { // DO NOT REMOVE THE EXCEPTION FROM THIS LOG MESSAGE // removing this message causes NO messages to be printed when embedded - logger.warning("configureApplication.loadFailed", e, appModule.getModuleId(), e.getMessage()); + logger().warning("configureApplication.loadFailed", e, appModule.getModuleId(), e.getMessage()); throw new ConfigureApplicationException(e); } @@ -635,7 +641,7 @@ public class OpenEjbContainer extends EJ private static boolean isOtherProvider(Map<?, ?> properties) { final Object provider = properties.get(EJBContainer.PROVIDER); return provider != null && !provider.equals(OpenEjbContainer.class) && !provider.equals(OpenEjbContainer.class.getName()) - && !"openejb".equals(provider); + && !"openejb".equals(provider); } private boolean match(String s, File file) { Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java?rev=1520847&r1=1520846&r2=1520847&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/util/JuliLogStreamFactory.java Sun Sep 8 09:22:22 2013 @@ -23,9 +23,10 @@ import org.apache.openejb.log.SingleLine import org.apache.openejb.util.reflection.Reflections; import java.io.OutputStreamWriter; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.util.logging.ConsoleHandler; -import java.util.logging.LogManager; +import java.util.logging.*; +import java.util.logging.Logger; /** * default conf = jre conf @@ -35,6 +36,7 @@ public class JuliLogStreamFactory implem public static final String OPENEJB_LOG_COLOR_PROP = "openejb.log.color"; private static String consoleHandlerClazz; + private static boolean useOpenEJBHandler = false; public LogStream createLogStream(LogCategory logCategory) { return new JuliLogStream(logCategory); @@ -56,11 +58,12 @@ public class JuliLogStreamFactory implem try { // check it will not fail later (case when a framework change the JVM classloading) ClassLoader.getSystemClassLoader().loadClass(consoleHandlerClazz); - } catch (ClassNotFoundException e) { + } catch (final ClassNotFoundException e) { consoleHandlerClazz = ConsoleHandler.class.getName(); } if (options.get("openejb.jul.forceReload", false)) { + useOpenEJBHandler = options.get("openejb.jul.forceReload.use-openejb-handler", true); try { final Field logManager = LogManager.class.getDeclaredField("manager"); final boolean acc = logManager.isAccessible(); @@ -72,7 +75,11 @@ public class JuliLogStreamFactory implem logManager.setAccessible(acc); } value.forceReset(); - } catch (Exception e) { + + setRootLogger(value); + + value.readConfiguration(); // re-read the config to ensure we have a parent logger + } catch (final Exception e) { // no-op } } @@ -90,6 +97,29 @@ public class JuliLogStreamFactory implem System.setProperty("openwebbeans.logging.factory", "org.apache.webbeans.logger.JULLoggerFactory"); } + private static void setRootLogger(final OpenEJBLogManager value) { + try { // if we don't do it - which is done in static part of the LogManager - we couldn't log user info when force-reload is to true + final Class<?> rootLoggerClass = ClassLoader.getSystemClassLoader().loadClass("java.util.logging.LogManager$RootLogger"); + final Constructor<?> cons = rootLoggerClass.getDeclaredConstructor(LogManager.class); + final boolean acc = cons.isAccessible(); + if (!acc) { + cons.setAccessible(true); + } + final Logger rootLogger = Logger.class.cast(cons.newInstance(value)); + try { + Reflections.set(value, "rootLogger", rootLogger); + } finally { + cons.setAccessible(acc); + } + value.addLogger(rootLogger); + Reflections.invokeByReflection(Reflections.get(value, "systemContext"), "addLocalLogger", new Class<?>[] { Logger.class }, new Object[] { rootLogger }); + Reflections.invokeByReflection(java.util.logging.Logger.global, "setLogManager", new Class<?>[] { LogManager.class }, new Object[] { value }); + value.addLogger(java.util.logging.Logger.global); + } catch (final Throwable e) { + // no-op + } + } + public static boolean isNotIDE() { return !System.getProperty("java.class.path").contains("idea_rt"); // TODO: eclipse, netbeans } @@ -152,7 +182,8 @@ public class JuliLogStreamFactory implem } private static boolean isOverridableLogger(String name) { - return name.toLowerCase().contains("openejb") + return useOpenEJBHandler + || name.toLowerCase().contains("openejb") || name.toLowerCase().contains("transaction") || name.toLowerCase().contains("cxf") || name.toLowerCase().contains("timer")