在上面的章节中我们已经了解了怎样搭建一个sping boot 应用,并实现了相应的增删改查和页面展示,下面说明日志配置的错误处理,处理程序发生异常的情况并配置日志方便快速定位错误程序。
Spring Boot使用Commons Logging进行所有内部日志记录,并且底层日志实现接口开放。 提供了Java Util Logging,Log4J2和Logback的默认配置。 在每种情况下,记录器都已预先配置为使用控制台输出,同时还提供可选文件输出。
默认日志格式
2021-02-03 22:53:10.784 INFO 35800 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
-
日期和时间: 毫秒精度
-
日志级别: ERROR
, WARN
, INFO
, DEBUG
, or TRACE
.
-
进程id.
-
A ---
分隔符
-
线程呢名称: 使用方括号括起来
-
日志名称: 剪短的类名称
-
日志消息
默认颜色配置
我们只需要需要在配置文件增加 spring.output.ansi.enabled=always 就能实现彩色输出
如果我们需要自定义日志输出格式,则我们需要定义一个logback.xml
<configuration>
<!--<include resource="org/springframework/boot/logging/logback/base.xml"/>-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %cyan(%logger){36}.%M - %msg%n
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
这样日志就按我们设定的格式输出了
日志输出到文件
需要增加一个appender,同时引用到需要输出日志的地方
<property name="LOGS_HOME" value="./logs/" />
<appender name="LOGGER-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_HOME}springboot.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOGS_HOME}springboot.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOGGER-FILE"/>
</root>
404页面处理
默认情况加spirng boot 的错误页面是下面这样的。我们使用一个很友好的页面来处理
直接在templates下面建立error目录并且创建404.html就可以替换原有的404错误提示。 这里我们使用另一种方法。
自定义错误页面在error 目录下
使用 ErrorPageRegistrar
注册错误页面
public class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error"));
registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/error"));
registry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error"));
}
}
错误请求匹配
@Controller
public class MyErrorController extends AbstractErrorController {
public MyErrorController(ErrorAttributes errorAttributes) {
super(errorAttributes);
}
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if(statusCode == HttpStatus.NOT_FOUND.value()) {
return "/error/404";
}
else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
return "/error/500";
}
}
return "/error/default";
}
@Override
public String getErrorPath() {
return null;
}
}
分享到: