嵌入式码头 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 行为方式的产物,它不适合 embedded-jetty,不要试图实现最终目标。
至于配置日志记录,这需要尽早进行,非常早,尽可能早地进行。如果你能在 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
我在我的应用程序中使用了一个嵌入式码头,我已经配置了一个 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 行为方式的产物,它不适合 embedded-jetty,不要试图实现最终目标。
至于配置日志记录,这需要尽早进行,非常早,尽可能早地进行。如果你能在 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