2011-12-31 6 views
1

私はデータベースlog4jアペンダーをPlayに書いています。Playからデータベースロガーを作成する - エラーを処理する方法?

そのappend()メソッドでは、モデルエンティティLog4jLineの新しいインスタンスがJPA経由でsaves()に作成されます。

これは、デバッグ/情報ログで正常に動作します。ただし、例外は記録されません。 フレームワークコードからのこのアペンダへの呼び出しがありますが、JPAセッションがこの時点で有効ではないため、動作していない可能性があります。

このユースケースをサポートするためにコードをどのように変更すればよいですか?

public class DBAppender extends AppenderSkeleton { 
    @Override 
    protected void append(LoggingEvent loggingEvent) { 
     Log4jLine logLine = new Log4jLine(...); 
     logLine.save(); 
    } 
} 
+0

私はそれを修正する方法がわかりませんが、コントローラーメソッドの1つから例外をスローすると、Play FrameworkはトランザクションをsetRollbackOnlyとしてマークするので、起こっています。 – Todd

+0

@Todd - 別のトランザクションでログを書き込む必要があります。 – ripper234

答えて

2

上記の会話では、私はこれをどのように行うのか不思議で、これを動作させることができました。基本的に、新しいEntityManagerを作成し、それを自分で完全に管理する必要があります。 Play組み込み関数(.save()、.merge()など)を呼び出すと、Playが設定するEntityManagerが使用されます。ただし、標準のJPA呼び出しに戻すと機能します。

// Mapped in routes file as GET /exception   
public static void exceptionTest() { 
    RuntimeException e = new RuntimeException("This is a test"); 
    logException(e); 
    renderText("You are here"); 

} 

private static void logException(RuntimeException e) { 
    EntityManager em = JPA.newEntityManager(); 
    Notification n = new Notification(); 
    n.setMessage(e.getMessage()); 

    em.getTransaction().begin(); 
    em.persist(n); 
    em.getTransaction().commit(); 
    throw e; 
} 

これは、ポイントを証明するための単なる迅速で汚れた実験です。明らかに、私が扱っていないlogException()の例外と失敗のケースを処理する必要があります。わかりやすさのために、通知は私のプロジェクトの基本的なオブジェクトです。私はこれをすぐに使用することができました。

希望に役立ちます!

関連する問題