我使用Netbeans7.3在GlassFish Server开源版3.1.2.2(版本5)上编码。 我使用java.util.Logging并更改了控制台的Logging格式 - 没有更改glassfish日志。当我将根Logger级别设置为Level.ALL,然后在包或类的基础上微调级别时,我会遇到来自com.sun.enterprise.container的各种getJNDIName方法发送的大量消息。 common.impl.ComponentEnvManagerImpl。
问题是它们似乎被发送到空Logger,显然我无法访问它以将其设置为更安静的级别。
我尝试使用非空字符串“null”访问Logger,但这不会做任何事情:)
这是我的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 :(得分:0)
已解决 - 这显然不是一个错误(这些是AnonymousLogger吗?),因为其他各种包正在创建具有空名称的Log消息。我决定使用格式化程序来解决这个问题:
@Override
public String format(LogRecord record) {
if(record.getLoggerName() == null) {
return ;
}
StringBuilder sb = new StringBuilder();
sb.append(record.getLevel());
sb.append(":");
.../...
它运行良好,允许我自定义控制台视图,而无需修改任何服务器或文件配置......