我已经创建了一个app init函数,我在Java和GWT应用程序中都使用它。我有外部logback.xml 文件,我正在设置“ logback.configurationFile ”系统属性的路径。在纯Java项目中,所有项目都按预期工作,但在GWT项目中没有。
我已经实现了 ServletContextListener ,并且在方法 contextInitialized 中我正在设置System属性。 Logback不会读取它,但会回退到基本(控制台中的红色字母)。
所以,我尝试按照logback configuration
的说明进行操作 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
重新配置Logback,但抛出
java.lang.ClassCastException: org.slf4j.impl.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
我还尝试将logback.xml放在文件夹中:src,war,war / WEB_INF,但它没有读取它。
我正在切换到slf4j,因为之前的log4j开始抛出许多“未找到类”的异常(带有commons-logging的东西)
问题是:
出了什么问题?
或
如何让sfl4j(logback)读取外部配置XML文件?
或
帮助表示赞赏
编辑:尝试使用log4j适配器和slf4j,它也不起作用。
EDIT2:我恢复了之前无效的纯log4j。但是,我在主系统JRE中的Eclipse中的“Installed JRE”中直接添加了log4j.jar,现在纯log4j正常工作。在我看来,OpenJDK和Sun的JDK之间存在很大差异,这导致了问题。我会在几天内尝试修复这个slf4j问题。也许在一些奇怪的地方也需要一些罐子。
EDIT3:slf4j现在可以使用log4j,但我必须手动配置它。无论我把log4j.xml放在哪里,都不会读它。看起来像Sun的JDK的类加载器问题。我很快就会尝试使用Logback。这可能是类似的问题。
答案 0 :(得分:3)
我的gwt,eclipse,jetty项目中有logback工作。效果很好。有点开箱即用。我正在使用maven。我做的是: 添加slf4j-api和logback作为依赖项。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.0</version>
</dependency>
在我的代码中,我使用以下方式获取记录器:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
protected Logger log = LoggerFactory.getLogger(this.getClass());
logback.xml位于我的src / main / resources文件夹中。这样,它将在编译后放在target / myproject / WEB-INF / classes中。
希望这会对你有所帮助。
答案 1 :(得分:1)
有许多可能的配置有jetty,slf4j和logback。 这实际上取决于你想要完成的事情。
1)让webapp本身进行自己的日志记录以进行logback。
2)在服务器级别拥有一个全局日志,记录服务器事件和webapp事件以进行回溯。
3)在服务器级别进行全局日志记录配置,为服务器创建日志文件,为每个Web应用程序创建单独的日志文件。
要完成#1,您只需将slf4j和logback文件放在webapp的WEB-INF / lib目录中并部署webapp即可。 (确保将配置文件放在webapps WEB-INF / classes或WEB-INF /目录中)
要完成#2和#3,你需要让jetty知道slf4j和logback应该暴露给所有的webapps,并且所有的webapps,无论是否有自己的(潜在的)slf4j和logback jar,它们都是始终使用服务器中的jar文件。 这是通过默认Web操纵WebAppContext的systemClasses和serverClasses列表来完成的 允许Slf4j通过Jetty上的webapp类加载器屏障,但不是logback。
这可以在上下文/ * .xml可部署中静态定义,也可以通过DeploymentManager绑定动态定义。有关如何完成此操作的详细信息,请参阅jetty.codehaus.org上的jetty-webapp-logging模块(我会链接你这样做,但是codehaus正在进行服务器迁移ATM) 所以,我在这里写了相关文件 - https://gist.github.com/1409147
package org.mortbay.jetty.webapp.logging;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppLifeCycle;
import org.eclipse.jetty.deploy.graph.Node;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;
public class CentralizedWebAppLoggingBinding implements AppLifeCycle.Binding
{
@Override
public String[] getBindingTargets()
{
return new String[]
{ "deploying" };
}
@Override
public void processBinding(Node node, App app) throws Exception
{
ContextHandler handler = app.getContextHandler();
if (handler == null)
{
throw new NullPointerException("No Handler created for App: " + app);
}
if (handler instanceof WebAppContext)
{
WebAppContext webapp = (WebAppContext)handler;
webapp.addSystemClass("org.apache.log4j.");
webapp.addSystemClass("org.slf4j.");
webapp.addSystemClass("org.apache.commons.logging.");
}
}
}
要完成#3,您需要设置slf4j MDC处理程序并在logback中筛选日志记录,该日志记录使用MDC信息将相应的日志记录事件路由到您选择的日志文件。 我在http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/发表了关于此的博客,并提供了基本回溯,筛选回溯的示例项目,甚至如何在https://github.com/jetty-project/jetty-and-logback-example
使用logback-access模块进行NCSA访问日志记录答案 2 :(得分:0)
Logback在类路径中查找其配置文件,而不是在文件系统中查找。
要访问文件系统中的配置文件,请按http://logback.qos.ch/manual/joran.html#fileInclusion中所述使用文件包含。请注意,文件名可以引用环境变量,如果它更容易指向文件的文件系统位置。
答案 3 :(得分:0)
我也遇到了同样的问题,在pom / class路径中找到了slf4j-simple.jar。一旦它被删除,工作正常。