GWT中的SLF4J和LogBack配置(Eclipse和Jetty)

时间:2011-11-26 11:23:05

标签: java log4j jetty slf4j logback

我已经创建了一个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的东西)

问题是:

  1. 出了什么问题?

  2. 如何让sfl4j(logback)读取外部配置XML文件?

  3. 如何让sfl4j(logback)读取任何配置XML文件?
  4. 帮助表示赞赏

    编辑:尝试使用log4j适配器和slf4j,它也不起作用。

    EDIT2:我恢复了之前无效的纯log4j。但是,我在主系统JRE中的Eclipse中的“Installed JRE”中直接添加了log4j.jar,现在纯log4j正常工作。在我看来,OpenJDK和Sun的JDK之间存在很大差异,这导致了问题。我会在几天内尝试修复这个slf4j问题。也许在一些奇怪的地方也需要一些罐子。

    EDIT3:slf4j现在可以使用log4j,但我必须手动配置它。无论我把log4j.xml放在哪里,都不会读它。看起来像Sun的JDK的类加载器问题。我很快就会尝试使用Logback。这可能是类似的问题。

4 个答案:

答案 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。一旦它被删除,工作正常。