4

RemoteServiceServlet使用時に my (GWT)のログ出力がログファイルまたは標準出力に表示されないgetServletContext().log("anything");

依存性注入にはGoogle Guiceを使用します。私自身のログ出力にはslf4j-jdk14を使用します。Tomcat 6 と Jetty (GWT devmode) でこれを試しました。

明確にするために、私のサーブレット:

@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 をラップして、独自に提供されたロガー (この場合は 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);
      }
...

完全な Slf4jServletConfigWrapper.java コード

サーブレットで init() メソッドをオーバーライドして ServletConfig ラッパーを使用します

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