Cleaning noise out of Java stack traces

后端 未结 6 1512
感情败类
感情败类 2020-12-15 17:15

My Java stack traces have a lot of entries that I don\'t care about, showing method invocation going through proxies and Spring reflection methods and stuff like that. It ca

6条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-15 17:38

    For 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 skippedLinePrefixes;
    
        public FilteringThrowableRenderer() {
            String skippedPackagesString = "java,org"; // TODO: move it to config
            String[] skippedPackages =
                skippedPackagesString.trim().split(PACKAGES_SEPARATOR);
            skippedLinePrefixes = new ArrayList(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 result = new ArrayList(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;
            }
        }
    }
    

    to enable it with code:

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

    or with log4j.properties:

    log4j.throwableRenderer=package1.FilteringThrowableRenderer
    

提交回复
热议问题