嵌入式码头 war 为 logback 部署日志

embedded jetty war deploy logs for logback

我在我的应用程序中使用了一个嵌入式码头,我已经配置了一个 war 部署文件夹,如下所示。

        // === jetty-deploy.xml ===

        DeploymentManager deployer = new DeploymentManager();
        deployer.setContexts(contexts);
        deployer.setContextAttribute(
                "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
                ".*/servlet-api-[^/]*\.jar$");

        WebAppProvider webapp_provider = new WebAppProvider();
        webapp_provider.setMonitoredDirName("jetty_base/webapps");
        //webapp_provider.setDefaultsDescriptor("jetty_base/webapps/webdefault.xml");
        webapp_provider.setScanInterval(1);
        webapp_provider.setExtractWars(true);
        webapp_provider.setConfigurationManager(new PropertiesConfigurationManager());

        deployer.addAppProvider(webapp_provider);
        server.addBean(deployer);


        org.eclipse.jetty.util.log.Log.setLog(new org.eclipse.jetty.util.log.StdErrLog());
        //Log.setLog(new Slf4jLog());

当我使用标准码头分发 (jetty-distribution-9.3.6.v20151106) 部署我的 war 文件时,我可以在我的 *.stderrout.log 文件中获取日志。

但我面临的问题是当我使用上述嵌入式码头时无法获取日志。 我为 Log.setLog

尝试了 StdErrLog 和 Slf4jLog

在我的 war 文件中有带有 logback 的日志。以下行是从标准分发的日志文件中提取的

 INFO in ch.qos.logback.classic.LoggerContext[default]

*.stderrlog.log 文件的创建是 jetty-distribution 行为方式的产物,它不适合 ,不要试图实现最终目标。

至于配置日志记录,这需要尽早进行,非常早,尽可能早地进行。如果你能在 Jetty 中实例化任何东西之前实现它,那将是理想的。

尝试一些选项(只尝试以下选项中的一个,而不是它们的组合):

1) 让 Jetty 日志记录自动配置

默认情况下,slf4j-api.jar 在您的 class 路径中的存在将导致码头自动配置 slf4j(在您的情况下将使用 logback 作为其实现)

不要在任何地方调用 Log.setLog(),让码头做它的事情。

2) 早点指定Log.setLog()

尝试简单地将此静态块放入您的主 class.

static {
    org.eclipse.jetty.util.log.Log.setLog(new Slf4jLog());
}

不要在其他任何地方调用 Log.setLog()

3) 添加一个 jetty-logging.properties 到你的 classpath

在您的 class 路径中的某处创建一个 jetty-logging.properties 文件(您的 jar 文件的根目录是个好地方),添加以下行:

org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog