You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sc...@apache.org on 2007/10/25 22:56:04 UTC

svn commit: r588353 - in /webservices/axis2/trunk/java/modules: jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java jaxws/src/org/apache/axis2/jaxws/utility/FailureLogger.java metadata/src/org/apache/axis2/jaxws/i18n/resource.properties

Author: scheu
Date: Thu Oct 25 13:56:03 2007
New Revision: 588353

URL: http://svn.apache.org/viewvc?rev=588353&view=rev
Log:
Added code to JavaDispatcher to log the first N (100) unique exceptions from the 
invoked web service code.  The new class, FailureLogger, intercepts and logs the errors.

Added:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/utility/FailureLogger.java
Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java
    webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/i18n/resource.properties

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java?rev=588353&r1=588352&r2=588353&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/server/dispatcher/JavaDispatcher.java Thu Oct 25 13:56:03 2007
@@ -23,10 +23,12 @@
 import org.apache.axis2.jaxws.server.EndpointCallback;
 import org.apache.axis2.jaxws.server.EndpointInvocationContext;
 import org.apache.axis2.jaxws.utility.ClassUtils;
+import org.apache.axis2.jaxws.utility.FailureLogger;
 import org.apache.axis2.transport.TransportUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.concurrent.Callable;
 /**
@@ -60,15 +62,29 @@
         return serviceImplClass;
     }
     
-    protected Object invokeTargetOperation(Method method, Object[] params) throws Exception {
+    protected Object invokeTargetOperation(Method method, Object[] params) throws Throwable {
         Object output = null;
         try {
             output = method.invoke(serviceInstance, params);
-        } catch (Exception t) {
+        } catch (Throwable t) {
+            Throwable rootT = null;
+            if (t instanceof InvocationTargetException) {
+                rootT = ((InvocationTargetException) t).getTargetException();
+            }
+            
+            // Minimal Logging to aid servicability.
+            // Only the error and the stack is logged.
+            FailureLogger.logError((rootT != null) ? rootT : t, 
+                                   false);  
+            
+            // Full logging if debug is enabled.
             if (log.isDebugEnabled()) {
                 log.debug("Exception invoking a method of " + serviceImplClass.toString()
                         + " of instance " + serviceInstance.toString());
                 log.debug("Exception type thrown: " + t.getClass().getName());
+                if (rootT != null) {
+                    log.debug("Root Exception type thrown: " + rootT.getClass().getName());
+                }
                 log.debug("Method = " + method.toGenericString());
                 for (int i = 0; i < params.length; i++) {
                     String value =

Added: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/utility/FailureLogger.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/utility/FailureLogger.java?rev=588353&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/utility/FailureLogger.java (added)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/utility/FailureLogger.java Thu Oct 25 13:56:03 2007
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axis2.jaxws.utility;
+
+import org.apache.axis2.jaxws.i18n.Messages;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.Hashtable;
+
+/**
+ * Logs an error to a specified limit.
+ */
+public class FailureLogger {
+    private static final Log log = LogFactory.getLog(FailureLogger.class);
+    private static Integer MAX = 100; // Maximum number of logs per key
+    
+    private static Hashtable<String, Integer> errorCount = new Hashtable<String, Integer>();
+    
+    /**
+     * Logs an error up to a MAX limit.
+     * @param t
+     * @param logFully (if true then the exception is logged, otherwise only the class and stack is logged)
+     */
+    public static void logError(Throwable t, boolean logFully) {
+        
+        // Construct a key that will be used to limit the logging.
+        String name = t.getClass().getName();
+        String stack = stackToString(t);
+        String key = name + "   " + stack;
+        
+        // Get the error count for this message
+        Integer count = errorCount.get(key);
+        if (count == null) {
+            count = 0;
+        }
+        count ++;
+        if (count <= MAX) {
+            errorCount.put(key, count);
+            String text = null;
+            if (logFully) {
+                text = Messages.getMessage("failureLogger", name, t.toString());
+               
+            } else {
+                text = Messages.getMessage("failureLogger", name, stack);
+            }
+            log.error(t);
+        }
+        
+    }
+    
+    /**
+     * Get a string containing the stack of the specified exception
+     *
+     * @param e
+     * @return
+     */
+    private static String stackToString(Throwable e) {
+        java.io.StringWriter sw = new java.io.StringWriter();
+        java.io.BufferedWriter bw = new java.io.BufferedWriter(sw);
+        java.io.PrintWriter pw = new java.io.PrintWriter(bw);
+        e.printStackTrace(pw);
+        pw.close();
+        String text = sw.getBuffer().toString();
+        // Jump past the throwable
+        text = text.substring(text.indexOf("at"));
+        return text;
+    }
+}

Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/i18n/resource.properties
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/i18n/resource.properties?rev=588353&r1=588352&r2=588353&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/i18n/resource.properties (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/i18n/resource.properties Thu Oct 25 13:56:03 2007
@@ -183,3 +183,4 @@
 onewayAsync=The async listener property was set.  A one way invocation cannot be performed using an async response channel.
 soapBindingUseEncoded=The SEI {0} contains method {1} with an unsupported SOAPBinding annotation value. SOAPBinding.Use field cannot be set to ENCODED.
 soapBindingStyle=The SEI {0} contains method {1} with annotation SOAPBinding.Style set to RPC.
+failureLogger=A {0} throwable was caught.  The detail message is: {1}



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org