私は興味深い目的に直面しました。この目的は、ウィケットおよび休止状態のフレームワークで記述された既存の Web アプリケーションの例外処理を対象としています。サーバーにデプロイされた Web アプリがあり、それが実行時例外を生成する場合があるとします。問題は、取得および保存する方法です。すべてのクラス (約 80 のモデルと 150 のビュー) を変更せずにスタック トレースを db にします。
私がすべてを明確にしたことを願っています。
前もって感謝します。
私は興味深い目的に直面しました。この目的は、ウィケットおよび休止状態のフレームワークで記述された既存の Web アプリケーションの例外処理を対象としています。サーバーにデプロイされた Web アプリがあり、それが実行時例外を生成する場合があるとします。問題は、取得および保存する方法です。すべてのクラス (約 80 のモデルと 150 のビュー) を変更せずにスタック トレースを db にします。
私がすべてを明確にしたことを願っています。
前もって感謝します。
を使用しIRequestCycleListener
て、例外をログに記録/処理できます。
public class MyExceptionReporter extends AbstractRequestCycleListener {
@Override
public IRequestHandler onException(RequestCycle cycle, Exception ex) {
// log exception here
return null;
// if you want to also show an error page:
// return new RenderPageRequestHandler(new PageProvider(new ExceptionPage(ex)));
}
}
次に、次の場所に登録しWebApplication#init
ます。
getRequestCycleListeners().add(new MyExceptionReporter());
アプリケーション内のすべての に対して追加のロギング動作を提供するために、そのオーバーライドApplication.newRequestCycle()
のカスタム サブクラスをオーバーライドして返します。キャッチされなかったものは、Wicket によって次のようにラップされることに注意してください(リクエスト サイクルとリクエスト サイクル プロセッサの例外処理セクションで説明されているように):WebRequestCycle
RequestCycle.logRuntimeException()
RuntimeException
Exception
WicketRuntimeException
そこで、スタックトレースとともに例外メッセージをデータベースに挿入する Service/DAO コンポーネントを使用します。dbms によっては、varchar 型の代わりに CLOB を使用したい場合があることに注意してください (たとえば、Oracle では、varchar 列は 4000 バイトを超える値を保持できません)。
これは(テストされていない)例です:
public class myApplication extends WebApplication {
...
@Override
public RequestCycle newRequestCycle(Request request, Response response) {
return new myRequestCycle(this, (WebRequest) request, (WebResponse) response);
}
}
public class myRequestCycle extends WebRequestCycle {
...
@Override
protected void logRuntimeException(RuntimeException rex) {
super.logRuntimeException(rex);
Writer w = new StringWriter();
t.printStackTrace(new PrintWriter(w));
String stackTrace = w.toString();
someService.logExceptionToDB(rex.getMessage(),stackTrace);
}
}
@Cristophの回答を参照してください
StackTraceElement[] を使用して完全なスタックトレースを提供するユーティリティを作成します。OutputStream の実装を使用して、それを CLOB オブジェクトにプッシュします。(BLOBは必要ないと思います)