【问题标题】:GWT: Send client-side errors/stack traces to server?GWT:将客户端错误/堆栈跟踪发送到服务器?
【发布时间】:2012-03-06 20:40:46
【问题描述】:

这一定是以前被问过的,但我在搜索中没有任何问题。我正在寻找一种方法来捕获所有客户端混淆错误/堆栈跟踪并将它们发送到服务器进行调试。我确实在使用 window.onerror 的 javascript 中看到了一些关于此的内容,但我正在寻找一种使用 GWT 执行此操作的方法,然后显示非混淆堆栈跟踪。

有人知道怎么做吗?谢谢!

编辑: 经过几个小时的工作后,我已经通过以下方式将日志从 GWT 传输到服务器:

    GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
        @Override 
        public void onUncaughtException(Throwable e) {
            log.log(Level.SEVERE, e.getMessage(), e);
        }
    });

现在使用的是 gwt 附带的默认 Logger。这是相关的 .gwt.xml :

<inherits name="com.google.gwt.logging.Logging" />
<set-property name="gwt.logging.logLevel" value="WARNING" />
<set-property name="gwt.logging.enabled" value="TRUE" />
<set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
<set-property name="gwt.logging.consoleHandler" value="DISABLED" />
<set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />  
<set-property name="gwt.logging.systemHandler" value="ENABLED" />
<set-property name="gwt.logging.popupHandler" value="DISABLED" />
<set-property name="gwt.logging.firebugHandler" value="DISABLED" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers" value="true"/>
<set-configuration-property name="compiler.emulatedStack.recordFileNames" value="true"/>

我在网上到处搜索,我什至发现这是来自 gwt-log 的东西,这似乎是在它被实现到 GWT SDK 之前:http://code.google.com/p/gwt-log/wiki/GettingStarted#Override_the_default_URL_which_the_RemoteLogger_connects_to

我按照上述链接中的说明更新了软件包名称以及其他内容。我现在使用以下参数进行编译:-deploy war/WEB-INF/deploy/

这是我的 web.xml 的相关部分:

<!-- Servlets -->
<servlet>
    <servlet-name>RemoteLoggerServlet</servlet-name>
    <servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl</servlet-class>
    <init-param>
        <param-name>symbolMaps</param-name>
        <param-value>WEB-INF/deploy/**MYAPPNAMEHERE**/symbolMaps/</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>RemoteLoggerServlet</servlet-name>
    <url-pattern>/**MYAPPNAMEHERE**/remote_logging</url-pattern>
</servlet-mapping>

最终结果是我得到了错误,它们只是没有被去混淆。我做错了什么?

【问题讨论】:

    标签: gwt error-handling


    【解决方案1】:

    initParam 用于RequestFactoryServlet。使用RemoteLoggingServiceImpl 你应该调用它的setSymbolMapsDirectory 方法;通常通过子类化 servlet 并从构造函数或init 方法调用方法。

    【讨论】:

    • 等等,我可以使用 RequestFactoryServlet 对我的日志进行去混淆处理吗?
    • @spierce7:您不需要 gwt.xml 中的 init 参数。只需将 &lt;set-property name="compiler.stackMode" value="emulated" /&gt; 添加到您的 gwt.xml。如果您使用默认位置,也不需要 -deploy,就像您正在做的那样
    • @HilbrandBouwkamp 嘿,感谢您的评论。我的 gwt.xml 中没有初始化参数。什么是 set-property-name="compiler.stackMode" 替换?我不确定我是否理解。我当然还需要正确实施 RemoteLoggingServlet?编辑:所以 compiler.stackMode 属性替换了 recordLineNumbers 和 recordFileNames?
    • 对不起,我的意思是你不需要 web.xml 中的 init 参数。 set-property name(名称前没有短划线)启用了映射文件的生成,RemoteLoggingServiceImpl 使用这些文件将客户端混淆代码反混淆为原始 Java 代码。
    【解决方案2】:

    GWT 内置了对日志记录的支持,如detailed in the documentation。还支持sending log messages from the client to the server

    如果您想捕获所有异常,您可能必须编写特定于浏览器的代码。例如,Mozilla 有一个window.onerror 事件,但是,我认为这不是标准的。

    【讨论】:

    • 在进行更多搜索之后,似乎有一种方法可以使用 GWT.setUncaughtExceptionHandler 来完成,但是我如何将错误返回到服务器(AppEngine),未经混淆并显示在日志?
    • 查看上面我的答案中的链接...将 gwt.logging.simpleRemoteHandler 添加到您的日志记录配置中。
    • 没错,但结果远不止于此。我必须实现一个给我们的远程日志 servlet 来接收远程日志,并配置一堆在那个链接中甚至没有提到的选项,这样我的应用程序的左上角就不会弹出一个日志框.我不知道为什么文档如此不完整。无论如何,除了去混淆之外,我已经完成了一切工作。感谢您迄今为止的帮助!
    • 同意,这比文档中提供的要多得多。 GWT 作为一个整体有很好的记录,但远程日志记录的详细信息低于 IMO
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多