【发布时间】:2011-01-08 09:18:15
【问题描述】:
我正在尝试将 Jetty 6.1 嵌入到另一个程序中。 Jetty 正在转储 INFO 日志信息,我需要将其关闭。有没有一种简单的方法来以编程方式禁用日志记录?
【问题讨论】:
-
您找到解决方案了吗?更新你的帖子怎么样!??
我正在尝试将 Jetty 6.1 嵌入到另一个程序中。 Jetty 正在转储 INFO 日志信息,我需要将其关闭。有没有一种简单的方法来以编程方式禁用日志记录?
【问题讨论】:
Jeff Chern 答案的更简洁版本:
org.eclipse.jetty.util.log.Log.setLog(new NoLogging())
.
import org.eclipse.jetty.util.log.Logger;
public class NoLogging implements Logger {
@Override public String getName() { return "no"; }
@Override public void warn(String msg, Object... args) { }
@Override public void warn(Throwable thrown) { }
@Override public void warn(String msg, Throwable thrown) { }
@Override public void info(String msg, Object... args) { }
@Override public void info(Throwable thrown) { }
@Override public void info(String msg, Throwable thrown) { }
@Override public boolean isDebugEnabled() { return false; }
@Override public void setDebugEnabled(boolean enabled) { }
@Override public void debug(String msg, Object... args) { }
@Override public void debug(Throwable thrown) { }
@Override public void debug(String msg, Throwable thrown) { }
@Override public Logger getLogger(String name) { return this; }
@Override public void ignore(Throwable ignored) { }
}
【讨论】:
org.eclipse.jetty 包空间直到 Jetty 7.0 才存在
2018-12-26 17:20:31.752:INFO::main: Logging initialized @943ms to org.eclipse.jetty.util.log.StdErrLog
org.eclipse.jetty.util.log.announce=false来克服这个问题。
System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog");
System.setProperty("org.eclipse.jetty.LEVEL", "OFF");
这对我有用,但请确保在启动服务器之前调用它。
【讨论】:
在 Jetty Embedded 中,您可以尝试:org.mortbay.log.Log.setLog(null);在调用服务器之前。
【讨论】:
我已经成功创建了一个虚拟记录器,它丢弃了它曾经要求记录的所有内容,然后将其传递给Log.setLog(...)。
例如
private static class DummyLogger implements Logger {
@Override
public String getName() {
return "DummyLogger";
}
@Override
public void warn(String msg, Object... args) {}
@Override
public void warn(Throwable thrown) {}
@Override
public void warn(String msg, Throwable thrown) {}
@Override
public void info(String msg, Object... args) {}
@Override
public void info(Throwable thrown) {}
@Override
public void info(String msg, Throwable thrown) {}
@Override
public boolean isDebugEnabled() {return false; }
@Override
public void setDebugEnabled(boolean enabled) {}
@Override
public void debug(String msg, Object... args) {}
@Override
public void debug(Throwable thrown) {}
@Override
public void debug(String msg, Throwable thrown) {}
@Override
public Logger getLogger(String name) {return this; }
@Override
public void ignore(Throwable ignored) {}
}
作为参考,我使用了这些包:
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
而不是mortbay,但它们的行为可能相同(或至少相似)。
【讨论】:
在启动服务器之前将StdErrLog 级别设置为WARN:
Properties p = new Properties();
p.setProperty("org.eclipse.jetty.LEVEL", "WARN");
org.eclipse.jetty.util.log.StdErrLog.setProperties(p);
【讨论】:
NONE 选项。 expecting only [ALL, DEBUG, INFO, WARN]
OFF 选项:${name|hierarchy}.LEVEL=(ALL|DEBUG|INFO|WARN|OFF),来源:download.eclipse.org/jetty/9.3.6.v20151106/apidocs/org/eclipse/…
使用这个
org.eclipse.jetty.util.log.Log.setLog(new jettyNoLog());
Logger.getLogger(jettyNoLog.class.getName()).setLevel(Level.OFF);
org.eclipse.jetty.util.log.Log.getProperties().setProperty("org.eclipse.jetty.LEVEL", "OFF");
org.eclipse.jetty.util.log.Log.getProperties().setProperty("org.eclipse.jetty.util.log.announce", "false");
org.eclipse.jetty.util.log.Log.getRootLogger().setDebugEnabled(false);
【讨论】:
announce 设置特别好。
看看Vinay提到的debugging page:
Jetty 使用 SLF4J 日志基础架构来桥接到 JSP2.0 的 commons-logging。这意味着 commons-log 消息被发送到 SLF4J 接口。
我们发布了 Simple log 实现,它只会将 INFO 级别及以上的消息输出到 stderr。
但是,您可以通过删除 lib/jsp-2.0/slf4j-simple-1.0-rc5.jar 并复制您选择的 SLF4J 实现,将 Simple 日志替换为任何其他 SLF4J 日志实现。核心 Jetty 代码对 SLF4J 有软依赖,这意味着如果在启动时在类路径中找到 SLF4J impl,Jetty 会将所有日志消息定向到它。
或者,您可以完全删除 SLF4J jar 并使用 commons-logging,方法是将 commons-logging jar 和符合 commons-logging 的日志 impl(例如 log4j)复制到 lib/ 目录。但是,如果您这样做,请注意,由于核心 Jetty 代码不使用 commons-logging,它会将消息记录到 stderr。继续阅读以了解如何让 stderr 日志机制打印 DEBUG 级别的消息。
所以问题在于放置正确的 jar 文件。例如,您可以放置一个 log4j 兼容接口并正确配置您的 log4j 配置文件以完全静音 jetty 的日志记录语句或更详细。
【讨论】:
添加配置
log4j.category.org.eclipse.jetty=error
在文件 src/main/resources/log4j.properties
【讨论】:
在启动服务器之前,调用:
org.eclipse.jetty.util.log.StdErrLog logger = new org.eclipse.jetty.util.log.StdErrLog();
logger.setLevel(org.eclipse.jetty.util.log.StdErrLog.LEVEL_OFF);
org.eclipse.jetty.util.log.Log.setLog(logger);
这与in the answer by arcuri82基本相同,只是没有剩余的单条日志行,使用的是哪个记录器。
【讨论】: