SpringBoot整合+logback日志配置 学习

本次演示的代码结构如下,基于maven整合SpringBoot、Spring、Mybaits的SSM框架。同时测试logback日志框架的使用及配置。

1.创建maven工程,修改pom.xml文件

 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  2. <modelVersion>4.0.0</modelVersion>

  3. <groupId>yan.li</groupId>

  4. <artifactId>spring-boot-demo</artifactId>

  5. <version>0.0.1-SNAPSHOT</version>

  6.  
  7. <parent>

  8. <groupId>org.springframework.boot</groupId>

  9. <artifactId>spring-boot-starter-parent</artifactId>

  10. <version>1.5.8.RELEASE</version>

  11. <relativePath /> <!-- lookup parent from repository -->

  12. </parent>

  13.  
  14. <properties>

  15. <!-- 使用UTF-8编码 -->

  16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  17. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  18. <!-- 使用jdk1.8版本 -->

  19. <java.version>1.8</java.version>

  20. </properties>

  21.  
  22. <dependencies>

  23. <dependency>

  24. <groupId>org.springframework.boot</groupId>

  25. <artifactId>spring-boot-starter-cache</artifactId>

  26. </dependency>

  27. <!--整合mybatis所需的jar -->

  28. <dependency>

  29. <groupId>org.mybatis.spring.boot</groupId>

  30. <artifactId>mybatis-spring-boot-starter</artifactId>

  31. <version>1.3.1</version>

  32. </dependency>

  33. <dependency>

  34. <groupId>org.springframework.boot</groupId>

  35. <artifactId>spring-boot-starter-web</artifactId>

  36. </dependency>

  37. <!--热启动:每自修改后, 程序自动启动spring Application上下文。 -->

  38. <dependency>

  39. <groupId>org.springframework.boot</groupId>

  40. <artifactId>spring-boot-devtools</artifactId>

  41. <optional>true</optional>

  42. </dependency>

  43. <!-- 阿里json -->

  44. <dependency>

  45. <groupId>com.alibaba</groupId>

  46. <artifactId>fastjson</artifactId>

  47. <version>1.2.9</version>

  48. </dependency>

  49. <dependency>

  50. <groupId>mysql</groupId>

  51. <artifactId>mysql-connector-java</artifactId>

  52. <scope>runtime</scope>

  53. </dependency>

  54. <dependency>

  55. <groupId>org.springframework.boot</groupId>

  56. <artifactId>spring-boot-starter-test</artifactId>

  57. <scope>test</scope>

  58. </dependency>

  59. </dependencies>

  60.  
  61. <build>

  62. <plugins>

  63. <plugin>

  64. <groupId>org.springframework.boot</groupId>

  65. <artifactId>spring-boot-maven-plugin</artifactId>

  66. <configuration>

  67. <fork>true</fork>

  68. </configuration>

  69. </plugin>

  70. </plugins>

  71. </build>

  72.  
  73. </project>

2.创建com.liyan.model包,同时创建两个PO类

(1)User.java类

 
  1. package com.liyan.model;

  2.  
  3. import java.io.Serializable;

  4.  
  5. /**

  6. * 员工实体类

  7. * <p>Title: User</p>

  8. * @author Liyan

  9. * @date 2018年1月11日 上午10:45:20

  10. */

  11. public class User implements Serializable{

  12.  
  13. private static final long serialVersionUID = 1L;

  14.  
  15. /** 自增主键 */

  16. private Integer id;

  17.  
  18. /** 员工工号 */

  19. private String userId;

  20.  
  21. /** 员工姓名 */

  22. private String userName;

  23.  
  24. public Integer getId() {

  25. return id;

  26. }

  27.  
  28. public void setId(Integer id) {

  29. this.id = id;

  30. }

  31.  
  32. public String getUserId() {

  33. return userId;

  34. }

  35.  
  36. public void setUserId(String userId) {

  37. this.userId = userId;

  38. }

  39.  
  40. public String getUserName() {

  41. return userName;

  42. }

  43.  
  44. public void setUserName(String userName) {

  45. this.userName = userName;

  46. }

  47.  
  48. }

2)ResponseResult.java类

 
  1. package com.liyan.model;

  2.  
  3. /**

  4. * 返回值实体类

  5. * <p>Title: ResponseResult</p>

  6. * @author Liyan

  7. * @date 2018年1月11日 下午5:23:41

  8. */

  9. public class ResponseResult {

  10.  
  11. private Integer code;

  12.  
  13. private String msg;

  14.  
  15. private Object data;

  16.  
  17. public Integer getCode() {

  18. return code;

  19. }

  20.  
  21. public void setCode(Integer code) {

  22. this.code = code;

  23. }

  24.  
  25. public String getMsg() {

  26. return msg;

  27. }

  28.  
  29. public void setMsg(String msg) {

  30. this.msg = msg;

  31. }

  32.  
  33. public Object getData() {

  34. return data;

  35. }

  36.  
  37. public void setData(Object data) {

  38. this.data = data;

  39. }

  40.  
  41. public ResponseResult(Integer code, String msg, Object data) {

  42. super();

  43. this.code = code;

  44. this.msg = msg;

  45. this.data = data;

  46. }

  47.  
  48. }

3.在com.liyan.mapper包下创建UserMapper.java接口

 
  1. package com.liyan.mapper;

  2. import org.apache.ibatis.annotations.ResultType;

  3. import org.apache.ibatis.annotations.Select;

  4. import org.springframework.stereotype.Repository;

  5.  
  6. import com.liyan.model.User;

  7. //这里可以使用@Mapper注解,但是每个mapper都加注解比较麻烦,所以统一配置@MapperScan在扫描路径在application类中

  8. //@Mapper //声明是一个Mapper,与springbootApplication中的@MapperScan二选一写上即可

  9. @Repository

  10. public interface UserMapper {

  11. @Select("SELECT id, user_id userId, user_name userName FROM user_tab WHERE user_id = #{userId}")

  12. @ResultType(User.class)

  13. User selectUser(String userId);

  14. }

4.在com.liyan.service包下创建UserService.java接口

 
  1. package com.liyan.service;

  2.  
  3. import com.liyan.model.User;

  4.  
  5. public interface UserService {

  6.  
  7. /**

  8. * 根据员工工号,查询员工

  9. * <p>Title: selectUser</p>

  10. * @author Liyan

  11. * @date 2018年1月11日 上午10:50:34

  12. * @param userId 员工工号

  13. * @return List<User>

  14. */

  15. public User selectUser(String userId);

  16. }

5.在com.liyan.service.impl包下创建UserServiceImpl.java类

 
  1. package com.liyan.service.impl;

  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.stereotype.Service;

  5. import com.liyan.mapper.UserMapper;

  6. import com.liyan.model.User;

  7. import com.liyan.service.UserService;

  8.  
  9. @Service

  10. public class UserServiceImpl implements UserService {

  11.  
  12. @Autowired

  13. private UserMapper userMapper;

  14.  
  15. @Override

  16. public User selectUser(String userId) {

  17. return userMapper.selectUser(userId);

  18. }

  19. }

6.在com.liyan.exception包下创建三个自定义异常相关的类

(1)ExceptionEnum.java类

 
  1. package com.liyan.exception;

  2. /**

  3. * 异常枚举类

  4. * <p>Title: ExceptionEnum</p>

  5. * @author Liyan

  6. * @date 2018年1月11日 下午3:54:48

  7. */

  8. public enum ExceptionEnum {

  9.  
  10. ERROR_NOFOUND("无法找到相应的数据");

  11.  
  12. private String value;

  13.  
  14. public String getValue() {

  15. return value;

  16. }

  17.  
  18. ExceptionEnum(String value){

  19. this.value = value;

  20. }

  21.  
  22. public String toString() {

  23. return value;

  24. }

  25. }

(2)NoFoundExcepiton.java类

 
  1. package com.liyan.exception;

  2. /**

  3. * 自定义No Found异常

  4. * <p>Title: NoFoundExcepiton</p>

  5. * @author Liyan

  6. * @date 2018年1月11日 下午3:36:13

  7. */

  8. public class NoFoundExcepiton extends Exception {

  9.  
  10. private static final long serialVersionUID = -5955607821816077172L;

  11.  
  12. public NoFoundExcepiton(String errorInfo) {

  13. super(errorInfo);

  14. }

  15. }

(3)GlobalExceptionHandler.java全局异常类

 
  1. package com.liyan.exception;

  2.  
  3. import javax.servlet.http.HttpServletRequest;

  4. import javax.servlet.http.HttpServletResponse;

  5. import org.slf4j.Logger;

  6. import org.slf4j.LoggerFactory;

  7. import org.springframework.web.bind.MissingServletRequestParameterException;

  8. import org.springframework.web.bind.annotation.CrossOrigin;

  9. import org.springframework.web.bind.annotation.ExceptionHandler;

  10. import org.springframework.web.bind.annotation.RestControllerAdvice;

  11. import com.liyan.model.ResponseResult;

  12.  
  13. @CrossOrigin

  14. @RestControllerAdvice

  15. public class GlobalExceptionHandler {

  16.  
  17. private static Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);

  18.  
  19. @ExceptionHandler

  20. public ResponseResult processException(Exception ex, HttpServletRequest request, HttpServletResponse response){

  21. ex.printStackTrace();

  22.  
  23. if(ex instanceof MissingServletRequestParameterException){

  24. return new ResponseResult(400, ex.getMessage(), null);

  25. }

  26. if(ex instanceof NoFoundExcepiton){

  27.  
  28. LOGGER.error("======="+ex.getMessage()+"=======");

  29. return new ResponseResult(401, "无法找到相应数据!", null);

  30.  
  31. }

  32.  
  33. return new ResponseResult(500, ex.getMessage(), null);

  34.  
  35. }

  36. }

7.在com.liyan.controller包下创建

(1)创建UserController.java类

 
  1. package com.liyan.controller;

  2.  
  3. import javax.servlet.http.HttpServletResponse;

  4. import org.slf4j.Logger;

  5. import org.slf4j.LoggerFactory;

  6. import org.springframework.beans.factory.annotation.Autowired;

  7. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

  8. import org.springframework.context.annotation.ComponentScan;

  9. import org.springframework.web.bind.annotation.PathVariable;

  10. import org.springframework.web.bind.annotation.RequestMapping;

  11. import org.springframework.web.bind.annotation.RequestMethod;

  12. import org.springframework.web.bind.annotation.RestController;

  13. import com.liyan.exception.ExceptionEnum;

  14. import com.liyan.exception.NoFoundExcepiton;

  15. import com.liyan.model.User;

  16. import com.liyan.service.UserService;

  17.  
  18. @RestController

  19. @EnableAutoConfiguration

  20. @ComponentScan(basePackages={"com.liyan.model"})//添加的注解

  21. public class UserController {

  22.  
  23. @Autowired

  24. private UserService userService;

  25.  
  26. /**

  27. * 引入日志,注意都是"org.slf4j"包下

  28. */

  29. private final static Logger logger = LoggerFactory.getLogger(UserController.class);

  30.  
  31. /**

  32. * 根据员工工号,查询员工

  33. * <p>Title: selectUser</p>

  34. * @author Liyan

  35. * @date 2018年1月11日 上午11:37:46

  36. * @param userId 员工工号

  37. * @param httpServletResponse

  38. * @return User

  39. * @throws Exception

  40. */

  41. @RequestMapping(value = "selectUser/{userId}",method = RequestMethod.GET)

  42. public User selectUser(@PathVariable String userId, HttpServletResponse httpServletResponse) throws Exception {

  43. User user = userService.selectUser(userId);

  44. logger.info("访问selectUser/{userId}接口,参数userId = " + "userId");

  45. if (user == null) {

  46. logger.error("根据员工工号,查询员工异常:e=" + ExceptionEnum.ERROR_NOFOUND.getValue());

  47. throw new NoFoundExcepiton(ExceptionEnum.ERROR_NOFOUND.getValue());

  48. }

  49. return user;

  50. }

  51.  
  52. }

(2)创建UserController.java启动类

 
  1. package com.liyan.controller;

  2.  
  3. import org.mybatis.spring.annotation.MapperScan;

  4. import org.springframework.boot.SpringApplication;

  5. import org.springframework.boot.autoconfigure.SpringBootApplication;

  6. import org.springframework.transaction.annotation.EnableTransactionManagement;

  7.  
  8. /**

  9. * 启动类

  10. * <p>Title: SpringbootApplication</p>

  11. * @author Liyan

  12. * @date 2018年1月11日 上午11:36:48

  13. */

  14. @SpringBootApplication(scanBasePackages = {"com.liyan"})

  15. @MapperScan("com.liyan.mapper")

  16. @EnableTransactionManagement//开启事务管理

  17. public class SpringbootApplication {

  18. public static void main(String[] args) {

  19. SpringApplication.run(SpringbootApplication.class, args);

  20. }

  21. }

8.配置文件相关

(1)application.properties

 
  1. #============ 数据库配置#======================================

  2. spring.datasource.url=jdbc:mysql://127.0.0.1:3306?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true

  3. #用户名和密码

  4. spring.datasource.username=记得换成自己的

  5. spring.datasource.password=记得换成自己的

  6. spring.datasource.driverClassName=com.mysql.jdbc.Driver

  7. spring.jpa.database=记得换成自己的

  8.  
  9. #============ tomcat配置#====================================

  10. server.port=80

  11.  
  12. #============ mybatis配置 ====================================

  13. #起别名。可省略写mybatis的xml中的resultType的全路径

  14. mybatis.type-aliases-package=com.liyan.model

  15. #Mybatis扫描(配置xml模式使用)

  16. mybatis.mapper-locations=classpath*:mapper/*.xml

  17.  
  18. #=========== 日志配置·简易(spring boot已经集成logback日志)=========

  19. #controller层日志 WARN级别输出

  20. #logging.level.com.liyan.controller=WARN

  21. #mapper层 sql日志 DEBUG级别输出

  22. #logging.level.com.liyan.mapper=DEBUG

  23. #logging.file=logs/spring-boot-logging.log

  24. #logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n

  25. #logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

  26. #打印运行时sql语句到控制台

  27. #spring.jpa.show-sql=true

  28.  
  29. #==================== 日志配合·标准 ============================

  30. logging.config=classpath:logback-boot.xml

(2)logback-boot.xml 日志配置文件(重点)

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <configuration>

  3. <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->

  4. <!-- appender是configuration的子节点,是负责写日志的组件。 -->

  5. <!-- ConsoleAppender:把日志输出到控制台 -->

  6. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  7. <encoder>

  8. <pattern>%d %p (%file:%line\)- %m%n</pattern>

  9. <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->

  10. <charset>UTF-8</charset>

  11. </encoder>

  12. </appender>

  13. <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->

  14. <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是demo.log -->

  15. <!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名-->

  16. <appender name="demolog" class="ch.qos.logback.core.rolling.RollingFileAppender">

  17. <File>log/demo.log</File>

  18. <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->

  19. <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->

  20. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

  21. <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->

  22. <!-- 文件名:log/demo.2017-12-05.0.log -->

  23. <fileNamePattern>log/demo.%d.%i.log</fileNamePattern>

  24. <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->

  25. <maxHistory>30</maxHistory>

  26. <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

  27. <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成1KB看效果 -->

  28. <maxFileSize>1KB</maxFileSize>

  29. </timeBasedFileNamingAndTriggeringPolicy>

  30. </rollingPolicy>

  31. <encoder>

  32. <!-- pattern节点,用来设置日志的输入格式 -->

  33. <pattern>

  34. %d %p (%file:%line\)- %m%n

  35. </pattern>

  36. <!-- 记录日志的编码:此处设置字符集 - -->

  37. <charset>UTF-8</charset>

  38. </encoder>

  39. </appender>

  40. <!-- 控制台输出日志级别 -->

  41. <root level="info">

  42. <appender-ref ref="STDOUT" />

  43. </root>

  44. <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->

  45. <!-- com.liyan为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->

  46. <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->

  47. <logger name="com.liyan" level="DEBUG">

  48. <appender-ref ref="demolog" />

  49. </logger>

  50. </configuration>

9.创建数据库表结构,建表语句如下,数据自己随便加吧

 
  1. CREATE TABLE `user_tab` (

  2. `id` INT(11) NOT NULL AUTO_INCREMENT,

  3. `user_id` VARCHAR(10) NOT NULL,

  4. `user_name` VARCHAR(20) NOT NULL,

  5. PRIMARY KEY (`id`),

  6. UNIQUE KEY `user_id` (`user_id`) USING BTREE

  7. ) ENGINE=INNODB DEFAULT CHARSET=utf8

10.启动

11.访问:http://localhost/selectUser/G353 (多刷新几次,看日志效果)如下:

demo.log一旦大于刚刚配置的1kb,立即会被分割成按日期命名的各个小日志

转载https://blog.csdn.net/qq296398300/article/details/79036447

猜你喜欢

转载自blog.csdn.net/qq_32722783/article/details/81779951