2011-04-08 55 views
4

当使用getServletContext().log("anything");时,我的RemoteServiceServlet(GWT)的日志输出未显示在Logfiles或Stdout中ServletContext.log()没有记录

对于依赖注入,我使用 Google Guice。对于我自己的日志输出,我使用 slf4j-jdk14。我在Tomcat 6以及Jetty(GWT devmode)中尝试过这个。

为了说清楚,我的Servlet:

@Singleton 
public class MyServiceServlet extends RemoteServiceServlet implements MyService { 

    private static final Logger log = LoggerFactory.getLogger(MyServiceServlet.class); 
    private final ADependency dep; 

    @Inject 
    public MyServiceServlet(ADependency dep) { 
     getServletContext().log("THIS IS NOT SHOWN IN MY LOGS"); 
     log.error("THIS IS SHOWN IN MY LOGS"); 
     this.dep = dep; 
    } 
} 

那么,我在哪里可以找到丢失的日志输出或在哪里可以配置ServletContext-Log?

+0

注意init()方法:它很容易重现此:刚刚创建“MVN设计原型的GWT应用程序:生成“,选择”241:remote - > gwt-maven-plugin“,用”throw new ...“替换greetServer(String)中的返回值,并用”mvn clean install gwt:run“启动应用程序。客户端显示错误,但服务器上没有日志输出。 – 2011-04-08 22:58:22

+0

好的......我只是用一个servlet创建了一个新的webapp,没有别的。我将它部署在tomcat中,并在localhost.2011-04-09.log中找到日志输出。 – 2011-04-09 00:25:56

+0

java.util.logging,slf4j,log4j,ServletContext.log(),commons.logging,...我只想看到单个文件中的所有错误! – 2011-04-09 00:42:46

回答

3

ServletContext.log方法的行为是特定于容器的。我用来使其一致的方法是包装通过init()传入的ServletConfig以创建一个使用我们自己提供的记录器(本例中为Slf4j)的包装ServletContext。

public class Slf4jServletConfigWrapper implements ServletConfig { 
    private final ServletConfig config; 
    private final Logger log; 

    public Slf4jServletConfigWrapper(Logger log, ServletConfig config) { 
    this.log = log; 
    this.config = config; 
    } 

    public ServletContext getServletContext() { 
    return new ServletContext() { 
     public void log(String message, Throwable throwable) { 
     log.info(message, throwable); 
     } 

     public void log(Exception exception, String msg) { 
     log.info(msg, exception); 
     } 

     public void log(String msg) { 
     log.info(msg); 
     } 
... 

Full Slf4jServletConfigWrapper.java code

在servlet覆盖使用的ServletConfig包装器

public void init(final ServletConfig config) throws ServletException { 
    super.init(new Slf4jServletConfigWrapper(log, config)); 
}