2013-04-29 113 views
1

我正在使用Netbeans7.3編寫GlassFish Server Open Source Edition 3.1.2.2(內部版本5)。 我使用java.util.Logging並更改了控制檯的日誌記錄格式 - 不更改爲glassfish日誌。當我將根Logger級別設置爲Level.ALL,然後在包或類的基礎上對級別進行微調時,我遇到了來自com.sun.enterprise.container的各種getJNDIName方法發送的大量消息。 common.impl.ComponentEnvManagerImpl。Glassfish記錄到一個空記錄器 - 如何設置日誌級別呢?

問題是,它們似乎被髮送到空記錄器,顯然我無法訪問它將其設置爲較安靜的水平。

我試圖用一個非空字符串,「空」來訪問記錄儀,但不會做任何:)

這是我的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配置)的任何建議?

澤維爾

回答

0

解決 - 這顯然不是一個bug(這些是AnonymousLogger?),因爲其他包與空名稱創建日誌消息。我決定用格式化要解決這個問題,以這些過濾掉:

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

它工作得很好,讓有我的定製控制檯視圖,而無需修改任何服務器或文件配置...