2016-09-28 18 views
1

我開發了一個Web服務,當發生某些服務器錯誤時(例如,除以零,內存不足異常等),我希望通知它。我想知道在自定義ErrorHandler內處理和發送每個請求的錯誤是否是一種很好的做法?在Play Framework中發送關於服務器錯誤的電子郵件

package controllers; 

import play.*; 
import play.api.OptionalSourceMapper; 
import play.api.UsefulException; 
import play.api.routing.Router; 
import play.http.DefaultHttpErrorHandler; 
import play.mvc.Http.*; 
import play.mvc.*; 

import javax.inject.*; 
import java.util.concurrent.CompletableFuture; 
import java.util.concurrent.CompletionStage; 

@Singleton 
public class ErrorHandler extends DefaultHttpErrorHandler { 

    @Inject 
    public ErrorHandler(Configuration configuration, Environment environment, OptionalSourceMapper sourceMapper, Provider<Router> routes) { 
     super(configuration, environment, sourceMapper, routes); 
    } 

    // Invoked in prod mode when a server error occurs. 
    protected CompletionStage<Result> onProdServerError(RequestHeader request, UsefulException exception) { 
     return CompletableFuture.completedFuture(Results.internalServerError("A server error occurred (prod): " + exception.getMessage()) 
       // Send email 
     ); 
    } 

    protected CompletionStage<Result> onDevServerError(RequestHeader request, UsefulException exception) { 
     return CompletableFuture.completedFuture(
       Results.internalServerError("A server error occurred (dev): " + exception.getMessage()) 
     ); 
    } 
} 

回答

1

這可以是用於非致命錯誤是有用的。但是如果發生致命錯誤,這將不起作用。最好使用Logging和其他流程異常監控解決方案。

+0

起初我在想同樣的事情。我只會使用logback並寫一個smtp appender,它會在特定的日誌級別的消息(在這種情況下是錯誤消息)觸發。我在這裏看到的問題是,我無法在客戶端和服務器之間的錯誤(例如,如果無效的JSON會記錄錯誤,但對於這個我不想發送電子郵件)。我可以這樣做,如果Play會記錄致命錯誤,但如果我沒有錯誤,不支持? – martez

+0

在logg中使用一些特定標記來區分日誌語句 – pamu

+0

這是否意味着對於每個控制器,我必須檢查未捕獲的異常,然後記錄它們?另一個選擇是設置一個默認的未捕獲異常處理程序,但是我沒有找到任何引用將其放置的地方。在你提到的第一篇文章中,致命錯誤將不會由onProdServerError來處理。那是對的嗎? – martez