2012-03-07 34 views
22

Dấu vết ngăn xếp Java của tôi có rất nhiều mục mà tôi không quan tâm, hiển thị lời gọi phương thức đi qua các proxy và phương thức phản chiếu Spring và các công cụ tương tự. Nó có thể làm cho nó khá khó khăn để chọn ra một phần của dấu vết ngăn xếp đó là thực sự từ mã của tôi. Ruby on Rails bao gồm một "ngăn xếp dấu vết sạch", nơi bạn có thể chỉ định một danh sách các mẫu dấu vết ngăn xếp để bỏ qua các dấu vết ngăn xếp in - cách tốt nhất để làm điều gì đó như thế, phổ biến, cho Java là gì?Làm sạch tiếng ồn ra khỏi dấu vết ngăn xếp Java

Sẽ là tốt nhất nếu điều này làm việc ở mọi nơi, kể cả trong trình chạy jUnit của Eclipse.

+0

Có, "theo dõi ngăn xếp từ địa ngục" theo Cay Horstmann: https://plus.google.com/+CayHorstmann/posts/YAwGCVpLXgH –

Trả lời

9

có một sở thích stack mẫu dấu vết lọc (xem java>junit hoặc tìm kiếm stacktrace trong các ưu đãi). Bạn có thể bỏ qua các gói (cũng với các ký tự đại diện), các lớp hoặc các phương thức. Không hoạt động cho các cuộc gọi Kiểm tra trực tiếp (qua số Chạy dưới dạng Thử nghiệm), không cho lệnh chạy như ant hoặc maven.

+0

Cảm ơn vì điều này! Điều này chắc chắn giải quyết vấn đề jUnit plugin của tôi. – bhollis

14

cho phép tùy chỉnh stack trace folding, đặc biệt hữu ích với dynamic languages.

IntelliJ http://blogs.jetbrains.com/idea/wp-content/uploads/2010/07/screen-shot-2010-07-12-at-100921-pm.png

và một công cụ Analyzing external stack traces.

Tôi có thể tưởng tượng công cụ/bộ lọc chung hoạt động trên khung ghi nhật ký (như hoặc ). Tôi không nghĩ rằng có bất kỳ hỗ trợ chung cho điều đó, nhưng tôi nghĩ rằng đó là một ý tưởng tuyệt vời để thực hiện điều này. Tôi sẽ có một cái nhìn, có lẽ nó không phải là nhiều công việc.

CẬP NHẬT: Tôi đã triển khai filtering irrelevant stack trace lines in logs cho , cũng theo dõi LBCLASSIC-325.

+0

không may, plugin intelliJ không tương thích nữa. (ít nhất là với 03/17 ubuntu build) – Blauhirn

1

Không chính xác những gì bạn đang tìm kiếm (và, theo hiểu biết của tôi, không có giải pháp phổ quát cho vấn đề của bạn, ít nhất tôi chưa bao giờ nghe nói về một công cụ nổi tiếng để làm sạch và trích xuất thông tin từ các ngăn xếp Java) .

Dù sao, this post from July, 05, 2011 at Faux' Blog mô tả tác nhân Java trong giai đoạn đầu có mục đích là làm phong phú (và không lọc) ngăn xếp dấu vết. Nó evens cung cấp một liên kết đến một kho git với một dự án mavenized. Có lẽ bạn có thể đi từ đây, tinh chỉnh mã của mình và cuộn giải pháp của riêng bạn (ai biết được, thậm chí có thể bắt đầu một dự án mã nguồn mở).

+0

Tôi đã nhìn thấy điều đó, nhưng hy vọng tôi sẽ không phải tự viết. Có vẻ như cách đi. – bhollis

2

Đối log4j:

package package1; 

public class FilteringThrowableRenderer implements ThrowableRenderer { 
    private static final String PACKAGES_SEPARATOR = "\\s*,\\s*"; 

    private final static String TRACE_PREFIX = "\tat "; 

    private static final String FILTERED_WARNING = " [Stacktrace is filtered]"; 

    ThrowableRenderer defaultRenderer = new EnhancedThrowableRenderer(); 

    List<String> skippedLinePrefixes; 

    public FilteringThrowableRenderer() { 
     String skippedPackagesString = "java,org"; // TODO: move it to config 
     String[] skippedPackages = 
      skippedPackagesString.trim().split(PACKAGES_SEPARATOR); 
     skippedLinePrefixes = new ArrayList<String>(skippedPackages.length); 
     for (String packageName : skippedPackages) { 
      skippedLinePrefixes.add(TRACE_PREFIX + packageName); 
     } 
    } 

    @Override 
    public String[] doRender(Throwable throwable) { 
     String[] initialTrace = defaultRenderer.doRender(throwable); 
     if (!skippedLinePrefixes.isEmpty()) { 
      List<String> result = new ArrayList<String>(initialTrace.length); 

      boolean filtered = false; 
      trace: for (String element : initialTrace) { 
       for (String skippedLinePrefix : skippedLinePrefixes) { 
        if (element.startsWith(skippedLinePrefix)) { 
         filtered = true; 
         continue trace; 
        } 
       } 
       result.add(element); 
      } 
      if (filtered && result.size() > 0) { 
       result.set(0, result.get(0) + FILTERED_WARNING); 
      } 
      return result.toArray(new String[result.size()]); 
     } else { 
      return initialTrace; 
     } 
    } 
} 

để kích hoạt nó với mã:

ThrowableRendererSupport loggerRepository = 
    (ThrowableRendererSupport) LogManager.getLoggerRepository(); 
loggerRepository.setThrowableRenderer(new FilteringThrowableRenderer()); 

hoặc với log4j.properties:

log4j.throwableRenderer=package1.FilteringThrowableRenderer 
6

Tôi thực sự đã viết một thư viện (https://github.com/michaelgantman/Mgnt/releases/tag/1.01) có chứa một số tiện ích. Một trong số đó là bộ lọc ngăn xếp phổ biến mà tôi đã sử dụng rộng rãi và thấy nó rất hữu ích. Lớp này được gọi là TextUtils và nó có phương thức getStacktrace() với một số chữ ký bị ghi đè. Phải mất một trường hợp Throwable và cho phép để thiết lập một tiền tố gói của các gói có liên quan.Hãy nói rằng mã của công ty của bạn luôn luôn nằm trong gói đó bắt đầu với "com.plain. *" Vì vậy, bạn thiết lập một tiền tố đó và làm điều này

logger.info(TextUtils.getStacktrace(e, true, "com.plain.")); 

này sẽ lọc ra rất thông minh tất cả các phần vô dụng của các dấu vết để lại bạn với stacktrace rất súc tích. Ngoài ra tôi thấy nó rất thuận để đặt trước tiền tố và sau đó chỉ cần sử dụng phương pháp convinience

TextUtils.getStacktrace(e); 

Nó sẽ làm như vậy. Để cài sẵn tiền tố chỉ cần sử dụng phương pháp

setRelevantPackage("com.plain."); 

Ngoài ra nếu bạn sử dụng môi trường mùa xuân bạn có thể thêm các phân đoạn sau để cấu hình mùa xuân của bạn và sau đó bạn tất cả các thiết lập:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetClass" value="com.mgnt.utils.TextUtils"/> 
    <property name="targetMethod" value="setRelevantPackage"/> 
    <property name="arguments" value="com.plain."/> 
</bean> 

Thư viện đi kèm với cũng bằng văn bản (Tôi hy vọng) Javadoc giải thích mọi thứ một cách chi tiết. Nhưng đây là một lời trêu ghẹo nhỏ: bạn sẽ nhận được một stacktrace sau:

at com.plain.BookService.listBooks() 
at com.plain.BookService$$FastClassByCGLIB$$e7645040.invoke() 
at net.sf.cglib.proxy.MethodProxy.invoke() 
... 
at com.plain.LoggingAspect.logging() 
at sun.reflect.NativeMethodAccessorImpl.invoke0() 
... 
at com.plain.BookService$$EnhancerByCGLIB$$7cb147e4.listBooks() 
at com.plain.web.BookController.listBooks() 

thay vì

at com.plain.BookService.listBooks() 
at com.plain.BookService$$FastClassByCGLIB$$e7645040.invoke() 
at net.sf.cglib.proxy.MethodProxy.invoke() 
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed() 
at com.plain.LoggingAspect.logging() 
at sun.reflect.NativeMethodAccessorImpl.invoke0() 
at sun.reflect.NativeMethodAccessorImpl.invoke() 
at sun.reflect.DelegatingMethodAccessorImpl.invoke() 
at java.lang.reflect.Method.invoke() 
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs() 
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod() 
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.interceptor.AbstractTraceInterceptor.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke() 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed() 
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept() 
at com.plain.BookService$$EnhancerByCGLIB$$7cb147e4.listBooks() 
at com.plain.web.BookController.listBooks() 
0

https://marketplace.eclipse.org/content/grep-console 

tiện ích Chỉ cần một grep tổng quát định dạng khá đẹp của Plugin này cho Eclipse giao diện điều khiển, do đó không có phụ thuộc bổ sung. Tôi định dạng tất cả tiếng ồn không liên quan của tôi thành văn bản màu xám.

Các vấn đề liên quan