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())
);
}
}
起初我在想同樣的事情。我只會使用logback並寫一個smtp appender,它會在特定的日誌級別的消息(在這種情況下是錯誤消息)觸發。我在這裏看到的問題是,我無法在客戶端和服務器之間的錯誤(例如,如果無效的JSON會記錄錯誤,但對於這個我不想發送電子郵件)。我可以這樣做,如果Play會記錄致命錯誤,但如果我沒有錯誤,不支持? – martez
在logg中使用一些特定標記來區分日誌語句 – pamu
這是否意味着對於每個控制器,我必須檢查未捕獲的異常,然後記錄它們?另一個選擇是設置一個默認的未捕獲異常處理程序,但是我沒有找到任何引用將其放置的地方。在你提到的第一篇文章中,致命錯誤將不會由onProdServerError來處理。那是對的嗎? – martez