2013-01-04 33 views
4

我想用deobfuscate選項配置遠程日誌記錄服務。我知道符號映射默認是在/ WEB-INF/deploy/MODULNAME/symbolMaps文件夾中生成的,GWT遠程記錄器實現(RemoteLoggingServiceImpl)使用StackTraceDeobfuscator,它需要symbolMaps dir才能工作。我認爲RemoteLoggingServiceImpl應該自動將正確路徑設置爲symbolMaps目錄,但在調試模式下,我發現在RemoteLoggingServiceImpl上不會調用setSymbolMapsDirectory方法。要解決這個問題我使用 「代理」 手動調用該方法:如何在Tomcat下配置GWT stacktrace deobfuscator?

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 parametr

此解決方案定義目錄,但只有當我設置爲symbolMaps目錄的絕對路徑,什麼是有點不切實際;)

現在我的問題是:什麼是配置RemoteLoggingServiceImpl正道在Tomcat上使用StackTraceDeobfuscator?

+0

不知道我跟隨。你是說在調試期間不調用servlet init方法?通過調試,你的意思是開發模式?我有一個類似的init實現(見下面的答案)。 –

回答

1

下面是我設置的符號目錄:

@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. 
}