Как остановить печать стека исключений на консоли?

Я написал сервлет, чтобы обрабатывать исключения, происходящие в моем веб-приложении, и отображал их в web.xml

 java.lang.Exception /exceptionHandler  

Вот что я сделал в методе service сервлетов обработки исключений:

 @Override protected void service(HttpServletRequest req, HttpServletResponse arg1) throws ServletException, IOException { Object attribute = req.getAttribute("javax.servlet.error.exception"); if(attribute instanceof SocketException){ // don't do anything }else{ super.service(req, arg1); } }. 

Проблема:

Вышеупомянутый подход не работает, и трассировка стека печатается на консоль. Это происходит, когда пользователь что-то запрашивает, а затем закрывает свой браузер.

Вопрос:

Как остановить печать stacktrace на консоли JBoss всякий раз, когда возникает SocketException ?

Причина для этого:

Я хочу, чтобы не видеть все SocketException журнала в конце дня, потому что я не могу ничего сделать с этой информацией.

Вот что я сделал так, чтобы работать.

Добавлен один фильтр и захват всего запроса и ответа. Заблокируйте исключение и проверьте тип.

 /** * Hijacks all the http request and response here. * Catch the SocketException and do not print * If other exceptions print to console * date : 9-18-2013 * * @author Suresh Atta * */ public class ExceptionHandler implements Filter { @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { try{ arg2.doFilter(arg0, arg1); }catch(SocketException e ){ // Please don't print this to log. } } } 

И в web.xml , отображение фильтра

  ExceptionHandler com.nextenders.server.ExceptionHandler   ExceptionHandler  REQUEST   /*  

Я не отмечаю это как ответ, так как я не уверен, что это стандартный способ или нет. Просто работайте.

Вместо добавления java.lang.Exception в ваш web.xml, почему бы вам просто не попробовать добавить исключение сокета в web.xml, как показано ниже?

  java.net.SocketException /exceptionHandler  

и просто ничего не делайте в своем сервлете. Или вместо этого добавьте пустой файл jsp, например

  java.net.SocketException /error.jsp  

Используйте Jboss Custom Logging Handler для решения этой проблемы.

Если вы не хотите регистрировать SocketException стека исключений SocketException просто пропустите его, когда вы входите в файл.

Шаги:

  • Пользовательский обработчик должен наследовать java.util.logging.Handler

Вот код:

 package com.custom.jboss.logging; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import java.util.logging.ErrorManager; import java.util.logging.Handler; import java.util.logging.LogRecord; public class SocketExceptionCustomLoggingHandler extends Handler { private String logFile; public BufferedWriter out = null; public SocketExceptionCustomLoggingHandler() { super(); logFile = ""; } @Override public void publish(LogRecord record) { if (!initialize()) { return; } if (isLoggable(record)) { process(record); } } private synchronized boolean initialize() { if (out == null && logFile != null && !logFile.equals("")) { FileWriter fstream = null; try { fstream = new FileWriter(logFile, true); out = new BufferedWriter(fstream); } catch (IOException e) { reportError(e.getMessage(), e, ErrorManager.OPEN_FAILURE); } logToFile("Log file initialized. Logging to: " + logFile); } return true; } private void process(LogRecord logRecord) { String log = getFormatter().format(logRecord); if (log.indexOf("java.net.SocketException") == -1) { logToFile(log); } } private void logToFile(String text) { try { if (out != null) { out.write((new Date()).toString() + "\t" + text + "\n"); out.flush(); } } catch (IOException e) { reportError(e.getMessage(), e, ErrorManager.WRITE_FAILURE); } } @Override public void flush() { try { if (out != null) { out.flush(); } } catch (IOException e) { reportError(e.getMessage(), e, ErrorManager.FLUSH_FAILURE); } } @Override public void close() { if (out != null) { try { out.close(); } catch (IOException e) { reportError(e.getMessage(), e, ErrorManager.CLOSE_FAILURE); } } } public void setLogFile(String logFile) { this.logFile = logFile; } } 
  • Затем файл упаковывается в банку и помещается в каталог модhive.

    т.е. Jboss-7.1.1/modules/com/custom/jboss/loggers/main вместе с файлом module.xml. Содержимое module.xml должно выглядеть так.

                
  • Затем измените файл standalone.xml, чтобы поддерживать ведение журнала в пользовательском регистраторе

      ...          ...        
  • Добавьте дополнительный обработчик в корневой журнал, если необходимо, например FILE, CONSOLE и т. Д.

  • Теперь все журналы будут регистрироваться в вашем пользовательском файле журнала через этот пользовательский обработчик, где мы пропустили SocketException
  • Мы можем сделать этот class более универсальными передающими свойствами из standalone.xml, например, для передачи пути файла журнала.

Пожалуйста, дайте мне знать, если есть какие-либо проблемы.

Вероятно, вам придется переопределить метод fillInStackTrade

 public static class CustomException extends Exception { @Override public Throwable fillInStackTrace() { return null; } 

}

Насколько я понимаю, исключения записываются на консоль, когда они не пойманы до достижения контейнера. Как таковой использование фильтра для обнаружения необработанных исключений имеет смысл.

По умолчанию Struts2 также имеет исключение «перехватчик» в качестве своего последнего перехватчика. См. DefaultStack . Нам нужно переопределить этот перехватчик, если нам нужна специальная обработка исключений.

Единственное, что я сделал бы дополнительно, – это регистрировать исключения (по крайней мере, файл errors-ignore.txt), а не полностью пропускать их.

Другая фанковая идея: вы можете создать обработчик исключений

 class SocketExceptionSwallower implements Thread.UncaughtExceptionHandler { public void uncaughtException(Thread t, Throwable e) { if (e instanceof SocketException) { // swallow } else { e.printStackTrace(); } } } 

и зарегистрирован

 Thread.setDefaultUncaughtExceptionHandler(new SocketExceptionSwallower()); 

или

 Thread.currentThread().setUncaughtExceptionHandler(new SocketExceptionSwallower()); 

Простой, не накладные расходы другого фильтра в цепочке, но он беспорядок с streamами и, вероятно, сломает что-то в среде Java EE)
Может быть полезно при тестировании / экспериментировании или если вы полностью контролируете streamи в своем собственном коде

Вы можете использовать Logger . Для этого вам нужна библиотека log4j и все желаемое поведение, а исключения записываются в файл журнала. Для этого вам нужно указать путь к файлу журнала