2014-02-09 53 views
3

我想使用GWT Remote Logging。这是我做过什么:GWT远程日志记录不能记录Throwable Stacktrace?

在我的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

'InvocationException:'然后呢?你的模块的名称是什么(根据你的web.xml应该是'web')?你的服务器日志中的任何输出? –

+0

@ColinAlworth我更新了我的问题记录作品的字符串,但不是Throwable,正如我指出的那样。任何想法? – confile

回答

1

将SerializableThrowable从client.impl库转换为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/

注意,在上面的网址,在提示4,笔者将他的计划了相同于你的。但他提醒在最后一段....

"[Log exceptions on the server] seems straight-forward, right? Be careful! First, not all exceptions are serializable or follow the rules of serializable (ugh!). For example, GWT’s JavascriptException inherits Serializable, but doesn’t implement a public no-arg constructor, so when you try to send this over the wire via your RPC, a run-time Serialization exception is thrown. And since this exception would be thrown inside your exception handler, it would effectively swallowed. Second, the stack trace within an exception is transient, and so [it] is lost from client to server (so if you need it on the server side, send it as a separate parameter). Which leads me to the next tip…"

在一段他说你有确切的原始问题 - 不是所有的例外是序列化所以序列化可能会引发异常(这可能也解释了为什么当您试图从AsyncCallback类的onFailure方法中输出抛出的错误消息时,throwable对象为null。然后继续阅读提示编号5和6.

这些链接可能也是有用的......

Best Practices for GWT services exceptions logging

http://cleancodematters.com/2011/05/29/improved-exceptionhandling-with-gwts-requestfactory/

+0

我试过你的解决方案,但失败了。我在我的问题中发布了错误。任何其他想法? – confile

+0

@ confile是否有一个名为thowable的Throwable对象,在您的评论指出时定义?听起来像是空的,当它被添加为LogRecord的第二个参数时,它引起一个空指针异常。 – Nate

+0

我发布了我正在使用的代码。 Throwable不为null。 – confile

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" />