logback.xml新增SMTPAppender配置
<appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>smtp.mxhichina.com</smtpHost>
<smtpPort>465</smtpPort>
<SSL>true</SSL>
<to>to@test.com</to>
<from>ABC Finance Manager <from@test.com></from>
<username>from@test.com</username>
<password>from_password</password>
<subject>ERROR: %logger{20} - %m</subject>
<evaluator class="ch.qos.logback.classic.boolex.OnErrorEvaluator" />
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>1</bufferSize>
</cyclicBufferTracker>
</appender>
<root level="DEBUG">
<appender-ref ref="MAIL"/>
</root>
说明:
logback=classic
模块内的实现类username
不为空的话,需要与这个字段填入的邮箱地址一致。username
不为空,那么这个字段必定不为空,填入发送人邮箱密码。OnErrorEvaluator
。OnErrorEvaluator
是用于过滤非错误级别的日志,当且仅当日志为错误级别的时候才调用该appender。如配置中根记录器的级别设置成DEBUG,但是我只希望发送ERROR级别的日志,并且对所有记录器有效,这个时候evaluator字段就成了一个快捷的解决方案了。当然开发者也可以自己实现evaluator。以上配置即可实现错误级别日志通过from@test.com
发送邮件到to@test.com
。发送结果如下:
@Component
public class ExceptionResolver implements HandlerExceptionResolver {
private Logger logger = LoggerFactory.getLogger(ExceptionResolver.class);
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
logger.error(e.getMessage(), e);
return null;
}
}
@ControllerAdvice(annotations = {RestController.class,Controller.class})
public class ExceptionInterceptor {
private Logger logger = LoggerFactory.getLogger(ExceptionInterceptor.class);
@ExceptionHandler(value = {Exception.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView exception(Exception exception, WebRequest request) {
logger.error(exception.getMessage(), exception);
return new ModelAndView("error/errorPage");
}
}
说明:
针对上述问题1的解决方案是:我们可以配置Spring在没有对应的@RequestMapping时,不要自行处理,让他抛出一个NoHandlerFoundException的异常,从而让我们配置的@ControllerAdvice进行统一处理。
web.xml文件中配置修改如下:
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/config-servlet.xml</param-value>
</init-param>
<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
针对上述问题2的解决方法如下:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.exceptionHandling()
.accessDeniedPage("/error/accessDenied.html")
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
这个方法未亲测,仅记录未下次遇到时作为首选方案。
全部评论