diff --git a/.gitignore b/.gitignore
index b9dafcf47b9..58eafaf68d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -85,7 +85,6 @@ configure-stamp
*_flymake.js
engine/storage/integration-test/test-output
tools/apidoc/log/
-log/
plugins/network-elements/juniper-contrail/logs/
scripts/vm/hypervisor/xenserver/vhd-util
*.orig
diff --git a/utils/src/main/java/com/cloud/utils/log/CglibThrowableRenderer.java b/utils/src/main/java/com/cloud/utils/log/CglibThrowableRenderer.java
new file mode 100644
index 00000000000..b102dc44a2c
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/log/CglibThrowableRenderer.java
@@ -0,0 +1,84 @@
+//
+// 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 com.cloud.utils.log;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+import org.apache.log4j.spi.ThrowableRenderer;
+
+/**
+ * This renderer removes all the Cglib generated methods from the call
+ *
+ * Unfortunately, I had to copy out the EnhancedThrowableRenderer from
+ * the apach libraries because EnhancedThrowableRenderer is a final class.
+ * simply override doRender. Not sure what the developers are thinking there
+ * making it final.
+ *
+ *
+ * into log4j.xml.
+ *
+ */
+public class CglibThrowableRenderer implements ThrowableRenderer {
+ /**
+ * Construct new instance.
+ */
+ public CglibThrowableRenderer() {
+ super();
+ }
+
+ @Override
+ public String[] doRender(final Throwable th) {
+ try {
+ ArrayList lines = new ArrayList();
+ Throwable throwable = th;
+ lines.add(throwable.toString());
+ int start = 0;
+ do {
+ StackTraceElement[] elements = throwable.getStackTrace();
+ for (int i = 0; i < elements.length - start; i++) {
+ StackTraceElement element = elements[i];
+ String filename = element.getFileName();
+ String method = element.getMethodName();
+ if ((filename != null && filename.equals("")) || (method != null && method.equals("invokeSuper"))) {
+ continue;
+ }
+ lines.add("\tat " + element.toString());
+ }
+ if (start != 0) {
+ lines.add("\t... " + start + " more");
+ }
+ throwable = throwable.getCause();
+ if (throwable != null) {
+ lines.add("Caused by: " + throwable.toString());
+ start = elements.length - 1;
+ }
+ } while (throwable != null);
+ return lines.toArray(new String[lines.size()]);
+ } catch (Exception ex) {
+ PrintWriter pw = new PrintWriter(System.err);
+ ex.printStackTrace(pw);
+ pw = new PrintWriter(System.out);
+ ex.printStackTrace(pw);
+ ex.printStackTrace();
+ return null;
+ }
+ }
+}