《回顾》
上一篇,详细介绍集成Mybatis、Druid及使用Druid监控功能,对应用进行基本的监控。不知道你是否亲自试过。
本篇,将介绍一款接口管理及在线测试神器,Swagger-UI。另外,会讲解到自定日志。意思就是,你可以把SQL单独打印到一个日志文件里,把接口信息打印到一个日志文件里,页面信息打印到一个日志文件里。
先上个图,看下Swagger效果
一、集成Swagger2
1、Maven依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2、新建配置类
此类用于配置Swagger信息。也就说,和SpringBoot集成,全靠它了。
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Bean
public Docket api(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("v1")
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhou.springbootz05"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("Spring Boot中使用Swagger2构建RESTful APIs")
.description("spring boot , swagger2")
.contact(new Contact("zhoudong", "http://blog.csdn.net/zdshare", "11230595@qq.com"))
.version("1.0")
.build();
}
}
3、使用方法
配置上面的类以后,包名下,所有的Controller都会自动被扫描到Swagger-UI中。
即使不做任何配置,也可以简单的当作在线测试工具使用。但是,建议还是做一些最基本的配置,起到文档管理的作用。
参照下面代码
@ApiOperation(value = "获取用户", notes = "获取用户", httpMethod = "GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户ID", required = true),
@ApiImplicitParam(name = "userCode", value = "用户Code")
})
@GetMapping("/load_user")
public Map loadUser(@RequestParam String userId, @RequestParam(required = false) String userCode){
log.info("【load_user】获取到参数:userName:{},userCode:{}",userId,userCode);
if(StringUtils.isEmpty(userCode)) userCode = "";
return Map.of("userCode",userCode,"userId",userId,"time", System.currentTimeMillis());
}
注释介绍:
@ApiOperation:用在方法上,起到说明方法的作用
-
value:URL路径介绍
-
notes:方法说明
-
httpMethod:请求方式,GET、POST、PUT、DELETE、OPTIONS、OPTIONS
@ApiImplicitParams:用在方法上包含一组参数说明;
@ApiImplicitParam:用在 @ApiImplicitParams 注解中,指定一个请求参数的各个方面
-
paramType:参数放在哪个地方
-
name:参数代表的含义
-
value:参数名称
-
dataType: 参数类型,有String/int,无用
-
required : 是否必要
-
defaultValue:参数的默认值
更多参数,请参考官方文档,这些参数,可以满足日常开发中99%的需求。
4、使用Swagger-UI测试接口
启动应用,访问:
http://localhost:8080/swagger-ui.html
以红框里面的接口为例
接口有2个参数,userId必填、userCode非必填。查看Swagger-UI显示情况。
点击蓝色框中的“Try it out”
输入必填项, 点击蓝色框中的“Excute”
返回结果,和上面代码逻辑里面的一致。
有了它,你还用担心几十、几百个项目接口管理问题吗?
Swagger-UI 将会运用于未来每一个演示项目中。
二、多文件日志
生产环境中,如果把应用所有的日志,都输出到一个文件里面,对于问题排查,很不友好。
所以,通常我们会根据业务及技术模块等多个维度来区分日志文件。
简单举例:
-
页面的输出到*-web.log
-
接口的输出到*-api.log
-
异常信息输出到*-error.log
-
数据库相关的输出到*-dal.log
...
2.1 创建配置文件
resources/logback.xml
内容如下:(代码量较多,建议回复:springbootz 下载代码导入IDE查看)
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
<!-- 日志存放目录 -->
<property name="logRoot" value="/opt/logs/springbootz05" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%highlight(%date{yyyy-MM-dd HH:mm:ss.SSS}) %gray([%thread]) %boldYellow([%-5level]) %boldCyan([%replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''}]) %msg%n"/>
<!-- 控制台打印日志的相关配置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志格式 -->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- WEB模块INFO文件日志 -->
<appender name="WEB" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logRoot}/web.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] [%thread] - %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${logRoot}/web.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- WEB模块ERROR文件日志 -->
<appender name="WEB-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logRoot}/web-error.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] [%thread] - %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logRoot}/web-error.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- DAL模块SQL输出文件日志 -->
<appender name="DAL-SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logRoot}/dal-sql.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%class:%line] [%thread] - %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logRoot}/dal-sql.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 打印应用日志 -->
<logger name="com.zhou.springbootz05" additivity="false">
<level value="info" />
<appender-ref ref="STDOUT" />
<appender-ref ref="WEB" />
<appender-ref ref="WEB-ERROR" />
</logger>
<!-- 打印sql -->
<logger name="com.zhou.springbootz05.mapper" additivity="false">
<level value="debug" />
<appender-ref ref="STDOUT" />
<appender-ref ref="DAL-SQL" />
<appender-ref ref="WEB-ERROR" />
</logger>
<!-- 控制台输出 -->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="WEB-ERROR" />
</root>
</configuration>
注意:配置完该文件后,application.properties 文件中,不在需要日志相关配置。
配置完毕后,启动应用,前往日志目录下查看日志文件
通过Swagger-UI 对含有数据库操作的接口,进行一次访问。(测试 应用日志和SQL日志是否被打印到对应的文件中)
查看日志文件内容:
如此区分,如果去查询10天或者20天之前的日志,是不是就更清晰了呢?
博客内所有文章,每周从公众号同步一次。
文章源码均可从公众号获取。
如果您可以关注下,那就好了。