4

deobfuscate オプションを使用してリモート ロギング サービスを構成したいと考えています。シンボル マップはデフォルトで /WEB-INF/deploy/MODULNAME/symbolMaps フォルダーに生成され、GWT リモート ロガーの実装 (RemoteLoggingServiceImpl) は StackTraceDeobfuscator を使用しますが、これには symbolMaps dir が必要です。RemoteLoggingServiceImpl は、symbolMaps ディレクトリへの正しいパスを自動的に設定する必要があると思いますが、デバッグ モードで、setSymbolMapsDirectory メソッドが RemoteLoggingServiceImpl で呼び出されないことがわかりました。その問題を解決するために、「プロキシ」を使用してそのメソッドを手動で呼び出します。

public class ConfigurableRemoteLoggingServiceImpl extends RemoteLoggingServiceImpl {

@Override
public void init(final ServletConfig config) throws ServletException {
    super.init(config);

    final String symbolMapsDirectory = config.getInitParameter("symbolMapsDirectory");
    setSymbolMapsDirectory(symbolMapsDirectory);
}
}

そしてweb.xmlで

<servlet>
        <servlet-name>remoteLogging</servlet-name>
        <servlet-class>pl.dandelite.empik.sdl.manager.server.service.ConfigurableRemoteLoggingServiceImpl</servlet-class>

        <init-param>
          <param-name>symbolMapsDirectory</param-name>
          <param-value>C:/symbolMaps</param-value>
      </init-param>
</servlet>
<servlet-mapping>
        <servlet-name>remoteLogging</servlet-name>
        <url-pattern>/sdlconsole/remote_logging</url-pattern>
</servlet-mapping>

コンパイル中に -extra パラメータを使用してディレクトリを定義します

このソリューションは機能しますが、絶対パスをsymbolMapsディレクトリに設定した場合にのみ、少し非現実的です;)

今私の質問は次のとおりです: Tomcat で StackTraceDeobfuscator を使用して RemoteLoggingServiceImpl を構成する正しい方法は何ですか?

4

1 に答える 1

2

シンボルディレクトリをセットアップする方法は次のとおりです。

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);

    // Synchronized so that in a multi-module deployment, there are no conflicts.
    synchronized (RemoteLoggingServiceImpl.class) {
        // Initialize SLF$j bridge logging to redirect jul logs to slf4j. We remove any
        // default loggers to ensure logging doesn't happen to stdout or stderr.
        java.util.logging.Logger rootLogger = LogManager.getLogManager().getLogger("");
        Handler[] handlers = rootLogger.getHandlers();
        for (Handler handler : handlers) {
            rootLogger.removeHandler(handler);
        }
        SLF4JBridgeHandler.install();
    }

    String moduleName = config.getInitParameter("module.name");
    if (StringUtils.isBlank(moduleName)) {
        _logger.error("No module name defined. Please set the module.name servlet init "
                + "parameter to point to the GWT module and enable extra symbolMaps at "
                + "/extra/<module name>/symbolMaps in the servlet context to facilitate "
                + "deobfuscation of stack traces.");
    } else {
        String path = config.getServletContext().getRealPath(
                "/WEB-INF/deploy/" + moduleName + "/symbolMaps/");

        if (path != null) {
            setSymbolMapsDirectory(path);
        }
    } // end else.
}
于 2013-01-15T18:35:28.627 に答える