Java SpringMVC中的日志记录
我目前正在使用SpringMVC开发一个web应用程序,并且在应用程序的每个控制器中使用@ExceptionHandler注释 所以基本上我得到了这样一种方法:Java SpringMVC中的日志记录,java,spring,logging,exception-handling,Java,Spring,Logging,Exception Handling,我目前正在使用SpringMVC开发一个web应用程序,并且在应用程序的每个控制器中使用@ExceptionHandler注释 所以基本上我得到了这样一种方法: @ExceptionHandler(RuntimeException.class) public String handleException(RuntimeException ex) { injectedService.notifyAndLogException(ex.getMessage()); return ("e
@ExceptionHandler(RuntimeException.class)
public String handleException(RuntimeException ex) {
injectedService.notifyAndLogException(ex.getMessage());
return ("error_page");
}
我的想法是登录并向注入服务中的应用程序管理员发送电子邮件。
现在,我试着阅读一些关于在spring应用程序中登录的文档,我所看到的所有事情都是在每个控制器中设置一个静态记录器
像这样:
private final Logger log = LoggerFactory.getLogger(Controller.class);
@ExceptionHandler(RuntimeException.class)
public String handleException(RuntimeException ex) {
log.info("Logging error");
injectedService.notifyException(ex.getMessage());
return ("error_page");
}
我想知道在每个控制器中使用记录器而不是仅在一个点(服务)中使用记录器的意义是什么
我想知道在每个控制器中使用记录器而不是只在一个点上使用记录器的意义是什么
如果对整个应用程序使用单个记录器,则每个日志消息都将被记录为来自同一组件。通过对每个类或组件使用记录器,您的日志文件将包含有关哪个组件记录消息的信息
例如,当您执行以下操作时:
Logger log = LoggerFactory.getLogger(Controller.class);
这将创建一个名为控制器
类的记录器,该记录器通常会显示在日志文件中,例如
2012-03-07:12:59:00 com.x.y.Controller Hello!
2012-03-07:12:59:00 com.x.y.控制器你好!
这只是一个惯例,但我建议你遵循这个惯例
我想知道在每个控制器中使用记录器而不是只在一个点上使用记录器的意义是什么
如果对整个应用程序使用单个记录器,则每个日志消息都将被记录为来自同一组件。通过对每个类或组件使用记录器,您的日志文件将包含有关哪个组件记录消息的信息
例如,当您执行以下操作时:
Logger log = LoggerFactory.getLogger(Controller.class);
这将创建一个名为控制器
类的记录器,该记录器通常会显示在日志文件中,例如
2012-03-07:12:59:00 com.x.y.Controller Hello!
2012-03-07:12:59:00 com.x.y.控制器你好!
这只是一个约定,但我建议您遵循这一约定。您的控制器可以扩展一个抽象类,该类声明一个这样的记录器
protected Logger logger = LoggerFactory.getLogger( getClass() );
此记录器可在所有控制器中使用,它将以控制器类名作为日志消息的前缀。您的控制器可以扩展一个抽象类,该抽象类声明类似的记录器
protected Logger logger = LoggerFactory.getLogger( getClass() );
此记录器可在所有控制器中使用,它将在日志消息前面加上控制器类名。当您在生产中或无法连接调试器时,每个类文件中的记录器使您能够获得“调试”或“信息”级别 由于您可以通过包甚至类文件名来限制记录的内容,所以您可以锁定点以查找错误,或者查看在不同负载情况下发生的情况(并发问题、使用的资源)。如果使用一个通用记录器,则可能会淹没日志文件 使用接收异常的类中的记录器,您可以获取未传递到异常处理程序中的at类变量 我也建议你不要这样做
injectedService.notifyAndLogException(ex.getMessage());
但是将异常传递到您的通知中。虽然堆栈跟踪可能非常冗长,但消息通常不是很有用(没有堆栈跟踪的NullPointerException?)。在notify服务中,您可以将subject设置为ex.getMessage(),并且主体具有整个堆栈跟踪。在生产或无法连接调试器时,每个类文件中的记录器使您能够获得“调试”或“信息”级别 由于您可以通过包甚至类文件名来限制记录的内容,所以您可以锁定点以查找错误,或者查看在不同负载情况下发生的情况(并发问题、使用的资源)。如果使用一个通用记录器,则可能会淹没日志文件 使用接收异常的类中的记录器,您可以获取未传递到异常处理程序中的at类变量 我也建议你不要这样做
injectedService.notifyAndLogException(ex.getMessage());
但是将异常传递到您的通知中。虽然堆栈跟踪可能非常冗长,但消息通常不是很有用(没有堆栈跟踪的NullPointerException?)。在notify服务中,您可以将subject设置为ex.getMessage(),而body具有整个堆栈跟踪。您可以,是的,但这种为方便而进行的继承是一种反模式的继承,我们强烈反对这种继承。您可以,是的,但这种为方便而进行的继承是一种反模式的继承,我们强烈反对这种继承。