2012-03-07 18 views
22

मेरे जावा स्टैक निशान में बहुत सी प्रविष्टियां हैं जिनकी मुझे परवाह नहीं है, प्रॉक्सियों और वसंत प्रतिबिंब विधियों और इस तरह की चीजों के माध्यम से विधि आमंत्रण दिखा रहा है। यह वास्तव में मेरे कोड से स्टैक ट्रेस का हिस्सा चुनना बहुत मुश्किल हो सकता है। रेल पर रूबी में "स्टैक ट्रेस क्लीनर" शामिल है जहां आप मुद्रित स्टैक निशान से निकलने के लिए स्टैक ट्रेस पैटर्न की एक सूची निर्दिष्ट कर सकते हैं - जावा के लिए सार्वभौमिक रूप से ऐसा करने का सबसे अच्छा तरीका क्या है?जावा स्टैक निशान से शोर की सफाई

यह सबसे अच्छा होगा अगर यह हर जगह काम करता है, जिसमें ग्रहण जुनीट धावक भी शामिल है।

+0

आह हाँ, "नरक से स्टैक ट्रेस" रेती Horstmann के अनुसार: https://plus.google.com/+CayHorstmann/posts/YAwGCVpLXgH –

उत्तर

9

एक प्राथमिकता स्टैक ट्रेस फिल्टर पैटर्न (जावा>JUnit या वरीयताओं में stacktrace के लिए खोज पर नज़र) है। आप पैकेज (वाइल्डकार्ड के साथ भी), कक्षाओं या विधियों को अनदेखा कर सकते हैं। प्रत्यक्ष टेस्ट कॉल के लिए काम करता है (के माध्यम से टेस्ट) चलाएं, कमांडलाइन के लिए ant या maven जैसे रन नहीं है।

+0

इसके लिए धन्यवाद! यह निश्चित रूप से मेरी जुनीट प्लगइन समस्या हल करता है। – bhollis

14

अनुकूलन योग्य stack trace folding, विशेष रूप से उपयोगी dynamic languages के साथ उपयोगी अनुमति देता है।

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

और एक Analyzing external stack traces उपकरण।

मैं लॉगिंग फ्रेमवर्क (जैसे या ) स्तर पर काम कर सामान्य उपकरण/फिल्टर कल्पना कर सकते हैं। मुझे नहीं लगता कि इसके लिए कोई सामान्य समर्थन है, लेकिन मुझे लगता है कि इसे लागू करना एक अच्छा विचार है। मैं एक नज़र रखूंगा, शायद यह इतना काम नहीं है।

अपडेट: मैंने filtering irrelevant stack trace lines in logs के लिए लागू किया, LBCLASSIC-325 का भी पालन करें।

+0

दुर्भाग्य से, IntelliJ प्लगइन अब और संगत नहीं है। (कम से कम 03/17 उबंटू बिल्ड के साथ) – Blauhirn

1

आप के लिए नहीं वास्तव में क्या देख रहे हैं (और, मेरी जानकारी के अनुसार, आपकी समस्या के लिए कोई सार्वभौमिक समाधान, कम से कम मैं साफ और जावा stacktraces से जानकारी निकालने के लिए एक प्रसिद्ध उपकरण की कभी नहीं सुना है) ।

वैसे भी, this post from July, 05, 2011 at Faux' Blog प्रारंभिक चरणों में जावा एजेंट का वर्णन करता है जिसका उद्देश्य स्टैक निशान को समृद्ध (और फ़िल्टर नहीं करना) है। यह एक mavenized परियोजना के साथ एक गिट भंडार के लिए एक लिंक प्रदान करता है। हो सकता है कि आप यहां से जा सकें, अपना कोड ट्विक करें और अपना खुद का समाधान रोल करें (कौन जानता है, शायद ओपन सोर्स प्रोजेक्ट भी शुरू कर सकता है)।

+0

मैंने इसे देखा है, लेकिन उम्मीद कर रहा था कि मुझे अपना खुद लिखना पड़ेगा। हालांकि जाने के रास्ते की तरह लगता है। – bhollis

2

log4j के लिए:

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

या log4j.properties साथ:

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; 
     } 
    } 
} 

कोड के साथ इसे सक्षम करने के

log4j.throwableRenderer=package1.FilteringThrowableRenderer 
6

मैं वास्तव में एक पुस्तकालय लिखा (https://github.com/michaelgantman/Mgnt/releases/tag/1.01) जिसमें कई उपयोगिताएं हैं। उनमें से एक सामान्य उद्देश्य stacktrace फ़िल्टर है जिसे मैंने बड़े पैमाने पर उपयोग किया और इसे बहुत उपयोगी पाया। कक्षा को टेक्स्ट उपयोग कहा जाता है और इसमें कई ओवरराइड हस्ताक्षर के साथ विधि getStacktrace() है। यह एक थ्रोबल इंस्टेंस लेता है और संकुल के पैकेज उपसर्ग को सेट करने की अनुमति देता है जो प्रासंगिक हैं।मान लीजिए कि आपकी कंपनी की कोड हमेशा संकुल कि के साथ शुरू में रहता दें "com.plain। *" तो तुम इस तरह के एक उपसर्ग सेट और इस

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

यह बहुत ही चालाकी से सभी का पता लगाने की बेकार भागों छोड़ने को फ़िल्टर कर देगा कर आपको बहुत संक्षिप्त स्टैकट्रस के साथ। इसके अलावा, मैं यह बहुत करने के लिए convinient उपसर्ग प्री-सेट और फिर बस convinience विधि

TextUtils.getStacktrace(e); 

का उपयोग यह भी ऐसा ही होगा मिल गया। उपसर्ग इसके अलावा पूर्व निर्धारित करने के लिए बस का उपयोग विधि

setRelevantPackage("com.plain."); 

आप अपने स्प्रिंग विन्यास के लिए निम्न खंड जोड़ सकते हैं और उसके बाद तो समझ लें कि यदि आप वसंत वातावरण का उपयोग करें:

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

पुस्तकालय के साथ आता है अच्छी तरह से लिखा (मुझे आशा है) जावाडोक जो सब कुछ विस्तार से बताता है। लेकिन यहाँ एक छोटे से चिढ़ाने है:

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() 
बजाय

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 

बस एक सामान्यीकृत ग्रेप स्वरूपण ग्रहण के लिए उपयोगिता: यदि आप एक निम्नलिखित स्टैकट्रेस मिल जाएगा कंसोल, तो कोई अतिरिक्त निर्भरता नहीं है। मैं अपने सभी अप्रासंगिक शोर को ग्रे टेक्स्ट में प्रारूपित करता हूं।

संबंधित मुद्दे