4

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

对于依赖注入,我使用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?

4

1 回答 1

5

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

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);
      }
...

完整的 Slf4jServletConfigWrapper.java 代码

在您的 Servlet 中重写 init() 方法以使用 ServletConfig 包装器

public void init(final ServletConfig config) throws ServletException {
  super.init(new Slf4jServletConfigWrapper(log, config));
}
于 2012-07-04T18:35:20.193 回答