SpringBoot2.1(5)集成Swagger-UI、使用自定义日志

《回顾》

上一篇,详细介绍集成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天之前的日志,是不是就更清晰了呢?

 

博客内所有文章,每周从公众号同步一次。

文章源码均可从公众号获取。

如果您可以关注下,那就好了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值