【问题标题】:Jetty: how to disable logging?码头:如何禁用日志记录?
【发布时间】:2011-01-08 09:18:15
【问题描述】:

我正在尝试将 Jetty 6.1 嵌入到另一个程序中。 Jetty 正在转储 INFO 日志信息,我需要将其关闭。有没有一种简单的方法来以编程方式禁用日志记录?

【问题讨论】:

  • 您找到解决方案了吗?更新你的帖子怎么样!??

标签: logging jetty


【解决方案1】:

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) { }
}

【讨论】:

  • 注意:这不适用于 Jetty 6.1(如问题所示)。 org.eclipse.jetty 包空间直到 Jetty 7.0 才存在
  • @arcuri82 下面的答案是实现您的最终目标的最合适的配置(无自定义代码)。
  • @JoakimErdfelt 这个解决方案对我来说比@arcuri82 的解决方案效果更好——这种方法仍然会留下一条恼人的消息:2018-12-26 17:20:31.752:INFO::main: Logging initialized @943ms to org.eclipse.jetty.util.log.StdErrLog
  • @EgorNepomnyaschih 你可以通过设置org.eclipse.jetty.util.log.announce=false来克服这个问题。
【解决方案2】:
System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog");
System.setProperty("org.eclipse.jetty.LEVEL", "OFF");

这对我有用,但请确保在启动服务器之前调用它。

【讨论】:

  • 尽管最初被要求使用 Jetty 6,但这是我找到的最干净的解决方案,仍然适用于 Jetty 9.4.x。
【解决方案3】:

在 Jetty Embedded 中,您可以尝试:org.mortbay.log.Log.setLog(null);在调用服务器之前。

【讨论】:

  • 提示:之前调用服务器很重要
【解决方案4】:

我已经成功创建了一个虚拟记录器,它丢弃了它曾经要求记录的所有内容,然后将其传递给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,但它们的行为可能相同(或至少相似)。

【讨论】:

    【解决方案5】:

    在启动服务器之前将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]
    • @ThomasAhle 这是真的,但我同意他们的选择。防止任何错误出现在日志中并不是一个好主意。
    • @ThomasAhle 似乎有一个OFF 选项:${name|hierarchy}.LEVEL=(ALL|DEBUG|INFO|WARN|OFF),来源:download.eclipse.org/jetty/9.3.6.v20151106/apidocs/org/eclipse/…
    【解决方案6】:

    使用这个

    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 设置特别好。
    【解决方案7】:

    看看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 的日志记录语句或更详细。

    【讨论】:

      【解决方案8】:

      添加配置

      log4j.category.org.eclipse.jetty=error
      

      在文件 src/main/resources/log4j.properties

      【讨论】:

        【解决方案9】:

        在启动服务器之前,调用:

        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基本相同,只是没有剩余的单条日志行,使用的是哪个记录器。

        【讨论】:

          猜你喜欢
          • 2011-01-05
          • 1970-01-01
          • 1970-01-01
          • 2018-12-24
          • 2020-01-17
          • 2016-07-04
          • 1970-01-01
          • 2014-07-30
          • 2021-06-27
          相关资源
          最近更新 更多