Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Play Framework中发送服务器错误电子邮件_Java_Playframework_Smtp - Fatal编程技术网

Java 在Play Framework中发送服务器错误电子邮件

Java 在Play Framework中发送服务器错误电子邮件,java,playframework,smtp,Java,Playframework,Smtp,我开发了一个web服务,希望在出现服务器错误时(例如,除零、内存不足异常等)收到通知。我想知道在自定义ErrorHandler中为每个请求处理和发送此错误是否是一种好的做法 package controllers; import play.*; import play.api.OptionalSourceMapper; import play.api.UsefulException; import play.api.routing.Router; import play.http.Defaul

我开发了一个web服务,希望在出现服务器错误时(例如,除零、内存不足异常等)收到通知。我想知道在自定义
ErrorHandler
中为每个请求处理和发送此错误是否是一种好的做法

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())
        );
    }
}
包控制器;
输入播放*;
导入play.api.OptionalSourceMapper;
导入play.api.UsefulException;
导入play.api.routing.Router;
导入play.http.DefaultHttpErrorHandler;
导入play.mvc.Http.*;
导入play.mvc.*;
导入javax.inject.*;
导入java.util.concurrent.CompletableFuture;
导入java.util.concurrent.CompletionStage;
@独生子女
公共类ErrorHandler扩展了DefaultHttpErrorHandler{
@注入
公共错误处理程序(配置、环境、可选源映射器源映射器、提供程序路由){
超级(配置、环境、源映射器、路由);
}
//发生服务器错误时在prod模式下调用。
ProdServerError上受保护的CompletionStage(请求标头请求,UsefulException异常){
返回CompletableFuture.completedFuture(Results.internalServerError(“发生了服务器错误(prod):”+exception.getMessage())
//发送电子邮件
);
}
受保护的CompletionStage onDevServerError(RequestHeader请求,UsefulException异常){
返回CompletableFuture.completedFuture(
Results.internalServerError(“发生了服务器错误(开发):”+exception.getMessage())
);
}
}
这对于非致命错误可能很有用。但如果出现致命错误,这将不起作用。最好使用日志记录和其他流程异常监视解决方案


起初我也这么想。我只需要使用logback并编写一个smtp追加器,该追加器将在特定的日志级别消息(在本例中为错误消息)上触发。我在这里看到的问题是,我无法区分客户端和服务器错误(例如,如果json无效,将记录错误,但对于这一错误,我不想发送电子邮件)。如果播放会记录致命错误,我可以这样做,但如果我没有错,这是不受支持的?在日志中使用一些特定的标记来区分日志语句,这是否意味着对于每个控制器,我必须检查未捕获的异常,然后记录它们?另一个选项是设置一个默认的未捕获异常处理程序,但我没有找到任何引用将其放在何处。在第一篇文章中,您提到onProdServerError不会处理致命错误。正确吗?有一个公共句柄,并根据异常类型使用不同的标记。当发生致命错误时,应用程序停止工作,所以即使是记录器也会停止。类似于内存不足例外,您还可以使用logback筛选器来区分错误: