Glassfish регистрирует нулевой регистратор - как тогда установить уровень журнала?

Я кодирую на GlassFish Server Open Source Edition 3.1.2.2 (сборка 5) с Netbeans7.3. Я использую java.util.Logging и изменил формат ведения журнала консоли - никаких изменений в журналах Glassfish. Когда я устанавливаю корневой уровень Logger на Level.ALL, а затем точно настраиваю уровень на основе пакета или класса, я застреваю в большом объеме сообщений, которые отправляются различными методами getJNDIName из com.sun.enterprise.container. common.impl.ComponentEnvManagerImpl.

Проблема в том, что они, похоже, отправляются на нулевой регистратор, к которому, очевидно, я не могу получить доступ, чтобы установить его на более тихий уровень.

Я попытался получить доступ к Logger, используя ненулевую строку, «null», но это тоже не сработает :)

Это мой customFormatter:

public class CustomFormatter extends Formatter {

@Override
public String format(LogRecord record) {
    StringBuilder sb = new StringBuilder();
    sb.append(record.getLevel());
    sb.append(":");
    sb.append(record.getLoggerName());
    sb.append("\t[");
    sb.append(record.getSourceMethodName());
    sb.append(" @ ");
    sb.append(record.getSourceClassName());
    sb.append("] ");        
    sb.append(new Date(record.getMillis()).toString());        
    sb.append("\n\t\t ");
    sb.append(formatMessage(record));
    sb.append("\n");
    return sb.toString();
}

Я настраиваю его таким образом, внутри @Startup @Singleton EJB:

protected static void configureLogger() {
    try {
        Logger.getLogger(StartUpSingleton.class.getName()).log(Level.INFO, "Preparing to configure Logger");
        Handler hh[] = Logger.getLogger("").getHandlers();

        Logger.getLogger(StartUpSingleton.class.getCanonicalName()).log(Level.INFO, "There are {0} available handlers", hh.length);
        for (Handler hf : hh) {
            Logger.getLogger(StartUpSingleton.class.getName()).log(Level.INFO, "Handler found : {0}", hf.toString());
            if (java.util.logging.ConsoleHandler.class.isInstance(hf)) {
                hf.setFormatter(new CustomFormatter());
                CustomLogLevel.configure(hf);
            }

        }


        Logger.getLogger(StartUpSingleton.class.getName()).log(Level.INFO, "Done with  configure Logger");

    } catch (SecurityException ex) {
        Logger.getLogger(StartUpSingleton.class.getName()).log(Level.SEVERE, null, ex);
    }


}
}

Используя следующий объект конфигурации, где я устанавливаю все уровни детализации, которые хочу:

class CustomLogLevel {

static void configure(Handler hf) {

    hf.setLevel(Level.ALL);
    Logger.getLogger("").setLevel(Level.ALL);
    // Logger.getLogger(null).setLevel(Level.INFO) is impossible !
    Logger.getLogger("null").setLevel(Level.INFO); // I tried ... ;-)
    Logger.getLogger("com.sun").setLevel(Level.INFO);
    Logger.getLogger("org").setLevel(Level.INFO);
    Logger.getLogger("grizzly").setLevel(Level.INFO);
    Logger.getLogger("global").setLevel(Level.INFO);
    Logger.getLogger("sun").setLevel(Level.INFO);
    Logger.getLogger("LogStrings").setLevel(Level.INFO);

    Logger.getLogger("com.myprivate.package").setLevel(Level.ALL);
    // ...



}

}

И это журнал, который я получаю на консоли, переполненный событиями FINE или FINER/FINEST, которые не связаны с моими (однако я хочу иметь возможность видеть свои собственные события любого уровня и, таким образом, установка глобального уровня для информации не работай на меня...)

FINEST:null [getJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getCurrentJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getCurrentJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getCurrentJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getCurrentJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getCurrentJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getCurrentJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getCurrentJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
     ComponentEnvManagerImpl: getCurrentJndiNameEnvironment 123ProductV1_/123ProductV1 is class com.sun.enterprise.deployment.WebBundleDescriptor
FINEST:null [getJndiNameEnvironment @ com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl] Mon Apr 29 17:11:36 CEST 2013
... / ... 

Любые предложения о том, как нейтрализовать наводнение журнала (без конфигурации xml)?

Ксавье


person xavier268    schedule 29.04.2013    source источник


Ответы (1)


Решено. Очевидно, это не ошибка (это AnonymousLogger?), поскольку различные другие пакеты создают сообщения журнала с пустым именем. Я решил обойти проблему, используя средство форматирования, чтобы отфильтровать их:

@Override
public String format(LogRecord record) {
    if(record.getLoggerName() == null) {
          return ;
          }
    StringBuilder sb = new StringBuilder();
    sb.append(record.getLevel());
    sb.append(":");
    .../...

Он работает отлично, позволяя мне настроить представление консоли без изменения каких-либо конфигураций сервера или файлов ...

person xavier268    schedule 03.05.2013