Использование UncaughtExceptionHandler в приложении Struts

У меня есть веб-приложение на основе Struts 2 MVC. Мне пришлось настроить правильное ведение журнала в приложении, которое я уже сделал, и оно работает нормально.

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

Я прочитал о Thread.UncaughtExceptionHandler, а также просмотрел этот ответ, но по-прежнему не может приступить к выполнению этого требования.

Может ли кто-нибудь предложить мне, как начать с этим? Какие классы сделать? Что настроить? и т.д. и т.д. Также нужно сказать, что в моем приложении нет многопоточности.

Благодарю вас!

Ниже мой log4j.properties

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${catalina.home}/logs/backlogApp.log
log4j.appender.file.MaxFileSize=1000KB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-4p %m%n
log4j.appender.DatePattern='.'yyyy-MM-dd

# Root logger option
log4j.rootLogger=WARN, file
log4j.logger.com.nagarro=WARN

# OFF Hibernate and Spring
log4j.logger.org.hibernate=OFF
log4j.logger.org.springframework=OFF

# OFF all JDBC parameters
log4j.logger.org.hibernate.type=OFF

Кроме того, глобальный обработчик исключений в struts.xml

<global-results>
        <result name="error">/jsp/errorpage.jsp</result>
        <result name="sessionexpired">/jsp/login.jsp</result>
    </global-results>

    <global-exception-mappings>
        <exception-mapping exception="java.lang.Exception"
            result="error" />
        <exception-mapping exception="javax.persistence.PersistenceException"
            result="error" />
    </global-exception-mappings>

person roger_that    schedule 17.07.2013    source источник


Ответы (1)


В основном это должно происходить автоматически; как вы настраиваете ведение журнала?

Существующий перехватчик «исключения» может сделать это, хотя он предназначен больше как способ реализовать «перейти на эту страницу, если возникнет исключение».

Вы могли бы использовать ту же идею и написать тонкий перехватчик вокруг вызова действия, который только регистрирует соответствующую информацию об исключении и переходит к исходному имени результата действия, но это кажется немного шатким, поскольку RTE должен почти конечно прервать нормальный поток.

IMO, если вы завершаете функциональность, которая может вызвать RTE, тогда:

  • Эта функциональность уже должна быть в сервисе, и...
  • ... эта служба должна перехватывать исключения и заключать их в исключение для конкретного приложения, и...
  • ... тогда вы можете использовать существующий перехватчик "исключение".
person Dave Newton    schedule 17.07.2013
comment
Нет, речь идет не о перенаправлении на страницу с ошибкой, если возникло какое-то исключение, что я уже сделал, используя сопоставление глобального обработчика исключений в struts.xml. Что мне нужно, предположим, я выполняю действие, которое вызывает стороннюю службу, но эта служба не работает (скажем, веб-служба), тогда моя консоль eclipse показывает исключение wsdl not found , но когда я склонен видеть в каталоге tomcat/logs, я не могу его найти. Теперь, в будущем, если это произойдет на производстве, как я буду отслеживать основную причину? Это моя конечная проблема. - person roger_that; 17.07.2013
comment
Пожалуйста, смотрите сделанные правки. Я добавил конфигурацию ведения журнала. Я не думаю, что это вызывает проблему, зарегистрированные исключения правильно попадают в файл. - person roger_that; 17.07.2013
comment
@VaibhavShukla Тогда в чем проблема? - person Dave Newton; 17.07.2013
comment
Как отслеживать, если какой-либо системный сбой? Где такое искать? В идеале, если с приложением происходит что-то плохое, мы проверяем наши журналы либо файл журнала приложения, либо каталину tomcat, но в моем случае, как я объяснил вам в комментарии выше, я не могу это отследить. Для этой ошибки нет журналов, нет файла каталины для tomcat. Я ошеломлен. - person roger_that; 17.07.2013
comment
@VaibhavShukla Тогда ваше ведение журнала настроено неправильно. Если вы не установите logEnabled=true для перехватчика исключений, я не думаю, что он будет регистрировать исключения, которые он обрабатывает. Вам также необходимо установить соответствующий уровень журнала. struts.apache.org/release/2.2.x/docs/ исключение-interceptor.html - person Dave Newton; 17.07.2013