我想使用GWT Remote Logging。这就是我所做的:
在我的web.xml文件中,我做了:
<servlet>
<servlet-name>remoteLogging</servlet-name>
<servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoteLogging</servlet-name>
<url-pattern>/web/remote_logging</url-pattern>
</servlet-mapping>
在我的gwt.xml文件中,我做了:
<module rename-to='web'>
...
<inherits name="com.google.gwt.logging.Logging" />
<set-property name="gwt.logging.logLevel" value="INFO" />
<set-property name="gwt.logging.enabled" value="TRUE" />
<set-property name="gwt.logging.popupHandler" value="DISABLED" />
<set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />
<set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
在我的GWT Java代码中的某处:
Logger logger = Logger.getLogger("NameOfYourLogger");
logger.log(Level.SEVERE, "this message should get logged");
但是,当我尝试像这样记录堆栈跟踪(Throwable)时:
// Throwable throwable
LogRecord lr = new LogRecord(Level.SEVERE, "test");
lr.setThrown(throwable);
logger.log(lr);
我收到错误:
16:24:26.887 [ERROR] [web] Sun Feb 09 16:24:26 CET 2014 WireActivityLogger
SEVERE: Remote logging failed:
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: java.lang.ClassCastException: com.google.gwt.core.client.impl.SerializableThrowable cannot be cast to com.google.gwt.core.shared.SerializableThrowable
at com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException_FieldSerializer.instantiate(IncompatibleRemoteServiceException_FieldSerializer.java:16)
at com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException_FieldSerializer.create(IncompatibleRemoteServiceException_FieldSerializer.java:25)
at com.google.gwt.user.client.rpc.impl.SerializerBase.instantiate(SerializerBase.java:115)
at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:396)
at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:216)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:258)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:412)
at sun.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:242)
at sun.reflect.GeneratedMethodAccessor101.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Thread.java:722)
如何远程记录堆栈跟踪?
编辑:我也试过
// Throwable throwable
LogRecord lr = new LogRecord(Level.SEVERE, throwable.toString());
logger.log(lr);
和
// Throwable throwable
LogRecord lr = new LogRecord(Level.SEVERE, throwable.getMessage());
logger.log(lr);
但我收到以下错误:
| Error 2014-02-19 02:21:04,017 [http-nio-8080-exec-7] ERROR [localhost].[/test] - Exception while dispatching incoming RPC call
Message: Service method 'public abstract java.lang.String com.google.gwt.logging.shared.RemoteLoggingService.logOnServer(java.util.logging.LogRecord)' threw an unexpected exception: java.lang.NullPointerException
Line | Method
->> 389 | encodeResponseForFailure in com.google.gwt.user.server.rpc.RPC
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 579 | invokeAndEncodeResponse in ''
| 265 | processCall . . . . . . in com.google.gwt.user.server.rpc.RemoteServiceServlet
| 305 | processPost in ''
| 62 | doPost . . . . . . . . . in com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet
| 46 | doFilterInternal in org.grails.jaxrs.web.JaxrsFilter
| 70 | doFilter . . . . . . . . in com.github.greengerong.PreRenderSEOFilter
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run in java.lang.Thread
Caused by NullPointerException: null
->> 262 | hash in java.util.Hashtable
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 459 | get in ''
| 489 | findLogger . . . . . . . in java.util.logging.LogManager$LoggerContext
| 910 | getLogger in java.util.logging.LogManager
| 400 | demandLogger . . . . . . in ''
| 317 | demandLogger in java.util.logging.Logger
| 361 | getLogger . . . . . . . in ''
| 62 | logOnServer in com.google.gwt.logging.server.RemoteLoggingServiceUtil
| 46 | logOnServer . . . . . . in com.google.gwt.logging.server.RemoteLoggingServiceImpl
| 561 | invokeAndEncodeResponse in com.google.gwt.user.server.rpc.RPC
| 265 | processCall . . . . . . in com.google.gwt.user.server.rpc.RemoteServiceServlet
| 305 | processPost in ''
| 62 | doPost . . . . . . . . . in com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet
| 46 | doFilterInternal in org.grails.jaxrs.web.JaxrsFilter
| 70 | doFilter . . . . . . . . in com.github.greengerong.PreRenderSEOFilter
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 615 | run . . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run in java.lang.Thread
编辑:
这是我使用的代码:
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
new AsyncCallback<GetResults<ItemDto>>() {
@Override
public void onFailure(Throwable e) {
Logger logger = Logger.getLogger("test");
logger.log(Level.SEVERE, "this message should get logged");
LogRecord lr = new LogRecord(Level.SEVERE, e.toString());
logger.log(lr);
}
...
}
答案 0 :(得分:1)
从client.impl库将serializableThrowable转换为core.shared库时,您将收到异常。您似乎只想将问题作为字符串写入日志。我从来没有使用过这门课程(只是阅读文档),你试过以下......
// Throwable throwable
LogRecord lr = new LogRecord(Level.SEVERE, throwable.toString());
logger.log(lr);
或
// Throwable throwable
LogRecord lr = new LogRecord(Level.SEVERE, throwable.getMessage());
logger.log(lr);
如果这不起作用,您可能会发现以下链接有用:
http://www.summa-tech.com/blog/2012/06/11/7-tips-for-exception-handling-in-gwt/
请注意,在上面的URL中,在提示4中,作者将其程序设置为与您的程序完全相同。但他在最后一段提醒说......
“[在服务器上记录异常]似乎是直截了当的,对吧?小心!首先,并非所有异常 是可序列化的或遵循可序列化的规则(呃!)。对于 例如,GWT的JavascriptException继承了Serializable,但没有 实现一个公共的无参数构造函数,所以当你尝试发送它时 通过RPC通过线程,运行时序列化异常是 抛出。并且因为此异常将被抛入您的异常中 处理程序,它会被有效地吞噬。二,堆栈跟踪 在异常中是瞬态的,因此[它]从客户端丢失到服务器 (因此,如果您在服务器端需要它,请将其作为单独发送 参数)。这引导我进入下一个提示......“
在段落中,他陈述了您遇到的确切原始问题 - 并非所有异常都是可序列化的,因此可能抛出序列化异常(这也可能解释为什么当您尝试从以下方法输出抛出的错误消息时throwable对象为null AsyncCallback类'onFailure方法)。然后继续阅读5号和6号提示。
这些链接也可能有用......
Best Practices for GWT services exceptions logging
http://cleancodematters.com/2011/05/29/improved-exceptionhandling-with-gwts-requestfactory/
答案 1 :(得分:1)
考虑记录异常堆栈跟踪:
<set-property name="compiler.stackMode"
value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers"
value="true"/>
<set-configuration-property name="compiler.emulatedStack.recordFileNames"
value="true"/>
stacktrace和异常处理如下:
答案 2 :(得分:1)
查看您收到的错误,您的GWT应用程序似乎正在发送com.google.gwt.core.client.impl.SerializableThrowable
的实例,但您的服务器正在等待com.google.gwt.core.shared.SerializableThrowable
的实例。
在我们的项目中,我们仍在使用GWT 2.5,我们在SDK中的类是第一个。
似乎GWT 2.6引入了第二个并且弃用了另一个。也许您的客户端和服务器不是完全相同的GWT版本?或者您的客户端代码以某种方式使用了错误的SerializableThrowable。
此外,这里有两个我注意到的属性,但你没有在GWT配置中提及:
<set-property name="compiler.stackMode" value="emulated" />
<set-configuration-property name="compiler.emulatedStack.recordLineNumbers" value="true" />