Wie fange ich Fehler global ab, protokolliere sie und zeige dem Benutzer eine Fehlerseite in der J2EE-App

Ich habe dieses Thema auf Google ein wenig durchsucht und einige bewährte Methoden gesehen. Aber ich brauche einen konkreten Rat. Ich arbeite an einer J2EE-App mit Servlets / Struts2 / Call to DAOs von JSPs. Die App ist also ziemlich durcheinander. Die meisten Daten werden über gespeicherte Prozeduren abgerufen, die von iBatis ORM / Spring aufgerufen werden. Manchmal, wenn ein Fehler auf der SP-Seite auftritt, wird dem Benutzer eine hässliche Meldung angezeigt, z.

javax.servlet.ServletException: org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in debtowed.xml.  
--- The error occurred while applying a parameter map.  
--- Check the debtowed.getFormerTenantData.  
--- Check the statement (update procedure failed).  
--- Cause: java.sql.SQLException: ORA-06550: line 1, column 11:
PLS-00905: object package.GET_FORMER_ADDRESS is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Caused by: java.sql.SQLException: ORA-06550: line 1, column 11:
PLS-00905: object package.GET_FORMER_ADDRESS is invalid
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Zu diesem Zeitpunkt werden die oben genannten Informationen im Browser angezeigt und in server.log protokolliert.
Ich möchte jedoch Folgendes tun:

Aktueller Benutzer mit benutzerdefinierter Fehlerseiteprotokolliere die Fehler in myapp.log anstatt in server.log (wir tun dies an einigen anderen Stellen, da wir log4j verwenden)

Bitte sagen Sie mir, wie das am besten geht. Sollte ich etwas in web.xml hinzufügen? wie ein Zuhörer? Wird das die einzige Änderung sein oder muss ich vorhandenen Code ändern?

Der Code führt keine Fehlerprüfung durch. Es ruft nur die SP wie unten

getSqlMapClientTemplate().queryForList("sp.getfmrAddy", paramMap);

Antworten auf die Frage(2)

Ihre Antwort auf die Frage