Uploaded image for project: 'WildFly Core'
  1. WildFly Core
  2. WFCORE-1494

Investigate consequences of changes in JDK9 on JBoss Logging

XMLWordPrintable

    • Icon: Task Task
    • Resolution: Done
    • Icon: Major Major
    • 3.0.0.Alpha1
    • 2.1.0.Final
    • Logging
    • None

      When running:

      $[wildfly-core/logging]>mvn test -Dtest=**/Log4jAppenderTestCase

      on JDK9 the test is failing.

      levelTest(org.jboss.as.logging.logmanager.Log4jAppenderTestCase)  Time elapsed: 0.006 sec  <<< ERROR!
      java.lang.IllegalStateException: The LogManager was not properly installed (you must set the "java.util.logging.manager" system property to "org.jboss.logmanager.LogManager")
      	at org.jboss.logmanager.Logger.getLogger(Logger.java:57)
      	at org.jboss.as.logging.logmanager.Log4jAppenderTestCase.<init>(Log4jAppenderTestCase.java:49)
      
      formatTest(org.jboss.as.logging.logmanager.Log4jAppenderTestCase)  Time elapsed: 0.001 sec  <<< ERROR!
      java.lang.IllegalStateException: The LogManager was not properly installed (you must set the "java.util.logging.manager" system property to "org.jboss.logmanager.LogManager")
      	at org.jboss.logmanager.Logger.getLogger(Logger.java:57)
      	at org.jboss.as.logging.logmanager.Log4jAppenderTestCase.<init>(Log4jAppenderTestCase.java:49)
      

      After short debugging I identified the difference between JDK8 and JKD9 that is causing the test to fail. In JDK8 the relevant piece of code was:

      // java.util.logging.Logger
      
         private static Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
              LogManager manager = LogManager.getLogManager();
              SecurityManager sm = System.getSecurityManager();
              if (sm != null && !SystemLoggerHelper.disableCallerCheck) {
                  if (caller.getClassLoader() == null) {
                      return manager.demandSystemLogger(name, resourceBundleName);
                  }
              }
              return manager.demandLogger(name, resourceBundleName, caller);
              // ends up calling new Logger(name, resourceBundleName, caller)
              // iff the logger doesn't exist already
          }
      

      in JDK9 the Security Manager check part disappeared:

      // java.util.logging.Logger
      
         private static Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
              LogManager manager = LogManager.getLogManager();
              if (!SystemLoggerHelper.disableCallerCheck) {
                  if (caller.getClassLoader() == null) {
                      return manager.demandSystemLogger(name, resourceBundleName, caller);
                  }
              }
              return manager.demandLogger(name, resourceBundleName, caller);
              // ends up calling new Logger(name, resourceBundleName, caller)
              // iff the logger doesn't exist already
          }
      

      This change causes the platform java.util.logging.Logger is returned instead of expected one
      org.jboss.logmanager.Logger.

      It is possible to workaround this problem by setting sun.util.logging.disableCallerCheck JVM property, like:

      $[wildfly-core/logging]>mvn test -Dtest=**/Log4jAppenderTestCase -Dsun.util.logging.disableCallerCheck=true

      Please investigate, whether this is regression that should be addressed by Oracle and if there are not other potential problems affecting proper logging functionality on JDK9.

              jperkins-rhn James Perkins
              ropalka Richard Opalka
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: