如何将SpringBoot与PageHelper整合并优化日志处理?

摘要:pagehelper整合 引入依赖 <dependency> <groupId>com.github.pagehelper<gr
pagehelper整合 引入依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>2.1.0</version> <scope>compile</scope> </dependency> 编写代码 @GetMapping("/list/{pageNo}") public PageInfo<Vip> findAll(@PathVariable int pageNo) { // 设置当前页码和每页显示的条数 PageHelper.startPage(pageNo, 10); // 查询数据 List<Vip> allVip = vipService.findAllVip(); // 将数据封装到pageinfo对象中 PageInfo<Vip> pageInfo = new PageInfo<>(allVip); return pageInfo; } web层响应结果的封装 对于前后端分离的系统来说,后端会返回json数据,一般会封装一个R对象来解决统一响应格式问题。 package com.ali.springboot3ssm.result; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Builder // 建造模式 public class R<T> { // 响应状态码 private int code; // 消息描述:成功或失败 private String msg; // 响应对象:任意类型对象 private T data; public static <T> R<T> OK(T data) { return R.<T>builder().code(200).msg("成功").data(data).build(); } // 成功的方法 public static <T> R<T> OK() { return R.<T>builder().code(200).msg("成功").build(); } // 失败的方法 public static <T> R<T> FAIL(int code,String msg) { return R.<T>builder().code(code).msg(msg).build(); } public static <T> R<T> FAIL() { return R.<T>builder().code(400).msg("失败").build(); } } controller中使用 @GetMapping("/list/{pageNo}") public R< PageInfo<Vip>> findAll(@PathVariable int pageNo) { // 设置当前页码和每页显示的条数,设置后会自动为查询语句加limit PageHelper.startPage(pageNo, 10); // 查询数据 List<Vip> allVip = vipService.findAllVip(); // 将数据封装到pageinfo对象中 PageInfo<Vip> pageInfo = new PageInfo<>(allVip); return R.OK(pageInfo); } 改进R对象 添加一个枚举类型 package com.ali.springboot3ssm.enums; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @NoArgsConstructor @AllArgsConstructor public enum CodeEnum { // 枚举的大括号一开始的位置必须有枚举值 // 枚举值下面如果没有代码,枚举值列表最后的“;”可以省略 // 枚举值下面如果有代码,枚举值列表最后的“;” 不可以省略 OK(200, "OK"), FAIL(400, "失败"), BAD_REQUEST(400, "失败"), NOT_FOUND(400, "失败"), INTERNAL_ERROR(400, "失败"), MODIFICATION_ERROR(400, "失败"), DELETION_ERROR(400, "失败"), CREATE_ERROR(400, "失败"); @Getter @Setter private int code; @Getter @Setter private String msg; } 重写R类 @Data @NoArgsConstructor @AllArgsConstructor @Builder // 建造模式 public class R<T> { // 响应状态码 private int code; // 消息描述:成功或失败 private String msg; // 响应对象:任意类型对象 private T data; public static <T> R<T> OK(T data) { return R.<T>builder().code(CodeEnum.OK.getCode()).msg(CodeEnum.OK.getMsg()).data(data).build(); } // 成功的方法 public static <T> R<T> OK() { return R.<T>builder().code(CodeEnum.OK.getCode()).msg(CodeEnum.OK.getMsg()).build(); } // 失败的方法 public static <T> R<T> FAIL(CodeEnum codeEnum) { return R.<T>builder().code(codeEnum.getCode()).msg(codeEnum.getMsg()).build(); } public static <T> R<T> FAIL() { return R.<T>builder().code(CodeEnum.FAIL.getCode()).msg(CodeEnum.FAIL.getMsg()).build(); } } 事务管理 spring boot自动配置了事务管理器。只需要使用@Transactional注解标注需要事务控制的方法即可。 就这么简单。 怎么打war包 修改pom文件 <!-- 打包方式修改为war--> <packaging>war</packaging> <!-- 排除tomcat--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加tomcat依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- provided:表示这个依赖不会被打到war包中,只是编译时使用--> <scope>provided</scope> </dependency> 启动类继承SpringBootServletInitializer类并重写configure方法 @MapperScan(basePackages = "com.ali.springboot3ssm.repository") @SpringBootApplication public class Springboot3SsmApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Springboot3SsmApplication.class); } public static void main(String[] args) { SpringApplication.run(Springboot3SsmApplication.class, args); } } 日志处理 抽象的日志框架 什么时抽象的日志框架?编译阶段可以使用抽象的日志框架,能正常编译。但运行阶段必须提供具体的日志框架,目的是:具体的日志框架可灵活切换。 抽象框架有SLF4J 、 Commons Logging。这2个都可以绑定具体的日志框架,如Log4j、Log4j2、Logback、JUL 具体的日志框架 Log4j(已过时)、Log4j2(推荐)、Logback(推荐)、JUL(Java util Logging,功能有限,适合小型应用) spring boot默认集成log back 日志级别 日志级别由低到高: trace:级别最低。记录最详细信息,通常在调试时使用 debug:记录程序运行时的详细信息,比如变量的值,进入或退出某个方法等,主要用于开发时调试 info:记录一般信息,如系统启动、服务初始化完成等,表示程序运行正常。 warn:警告信息 error:错误信息 生成环境中 通常把日志级别设为info或更高级别 开发或测试环境中,设为debug或trace spring boot默认日志级别是info @Slf4j // 这是lombok的一个注解,作用是为我们维护一个日志对象log @SpringBootApplication public class Springboot3SsmApplication { public static void main(String[] args) { SpringApplication.run(Springboot3SsmApplication.class, args); // 直接使用log log.info("日志信息"); } } 调整日志级别 # 调整日志级别 logging.level.root=debug 日志的粗细粒度 # 调整根日志级别(全局的,整个项目都是这个级别) logging.level.root=debug # 为特定包设置日志级别 logging.level.com.ali.springboot3ssm.controller=debug # 为特定类设置日志级别 logging.level.com.ali.springboot3ssm.service.UserService=trace # 在控制台中打印sql (这个包是Mapper类所在的包) logging.level.com.ali.springboot3ssm.repository=debug 日志输出到文件 有2种方式,这2种方式不能共存,如果同时存在,只有logging.file.name生效 # 将日志文件输出到当前项目根目录下的log目录中。文件名默认spring.log 并且文件名不可修改 # 路径可随便改。可以是硬盘上的任意有权限路径 logging.file.path=./log/ # 日志文件输出到当前项目根目录下my.log文件。路径不可修改 logging.file.name=my.log 滚动日志 防止日志无线增长,将日志文件分割成多个文件,避免单个文件过大难以处理 # 此策略仅适合logback # 日志文件达到多大时进行归档,打成一个压缩包 logging.logback.rollingpolicy.max-file-size=10MB # 归档日志文件总共达到多大时删除 logging.logback.rollingpolicy.total-size-cap=50GB # 归档日志文件最多保留几天 logging.logback.rollingpolicy.max-history=60 #启动项目时是否清理归档日志文件 logging.logback.rollingpolicy.clean-history-on-start=false # 归档日志文件名格式 logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz 日志框架切换 先排除log back 再引入新依赖 <!-- 排除默认日志依赖--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入log4j依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>