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")