寫在前面 上一小節中我們從0到1 使用Vite搭建了一個Vue3項目,並集成了Element Plus 實現了一個簡單的增刪改查頁面。 這一篇中我們將使用IDEA快速搭建一個SpringBoot3.x的項目。 一、創建項目 1、File->new->project 2、選擇“Spring Initi ...
寫在前面
上一小節中我們從0到1 使用Vite搭建了一個Vue3項目,並集成了Element Plus 實現了一個簡單的增刪改查頁面。
這一篇中我們將使用IDEA快速搭建一個SpringBoot3.x的項目。
一、創建項目
1、File->new->project
2、選擇“Spring Initializr”,點擊next;
3、選擇spring boot版本及添加相關依賴
這一步我們需要選擇springboot版本,及Dependencies信息,當然了Dependencies 不是必須選擇的。可以在項目建好之後需要什麼添加什麼。
簡要說明:我們這裡選擇了四個Dependencies
- Lombok : 需要我們先安裝Lombok插件,可以簡化實體類書寫
- String Web:添加項目的web支持
- MySQL Driver:我們用到MySQL資料庫,所以添加MySQL相關驅動
- MyBatis Framework:我們用到MyBatis這一ORM框架操作資料庫
4、創建好的項目結構
5、配置Maven
在這裡配置本地Maven本地路徑、Maven倉庫。在本地Maven的settings.xml中會配置maven的鏡像資源等信息
6、 下載相關依賴
在這裡我們下載之前配置好的依賴,一般項目創建後會預設下載
二、配置多環境
在實際開發中,我們一般都會有好幾套運行環境。比如①開發環境 ②測試環境 ③ 生產環境等等
我們不可能每次都去修改一個配置文件,這就顯得很麻煩。下麵我們主要說一說怎麼配置多環境
① 修改application.properties 配置文件
idea創建的springboot項目,預設的配置文件是application.properties。我們這裡將application.properties修改成application.yml。
為什麼這麼修改呢?因為yml文件配置起來比較方便,可以省略好多冗餘內容,當然了你不改也是沒啥問題的。
修改後的applicatio.yml文件如下,通過active:屬性來切換環境
spring:
application:
name: springbootdemo
profiles:
active: dev
②添加開發環境配置
新建application-dev.yml 文件,在這裡我們就可以配置開發環境下的埠,資料庫連接等信息,具體內容如下
server.port
屬性,指定應用程式在伺服器上監聽的埠號。這裡設置為8080spring.datasource
屬性,配置應用程式與資料庫的連接driver-class-name
指定資料庫驅動程式的類名url
指定資料庫的連接地址,這裡是本地MySQL資料庫的地址和埠號以及資料庫名稱username
和password
分別指定連接資料庫所需的用戶名和密碼
spring.mybatis.mapper-locations
屬性,指定MyBatis映射器XML文件的位置。這裡配置為 classpath:mapper/*.xml ,表示映射器文件位於classpath下的mapper目錄中
server:
port: 8080 # 配置埠為8080
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
mybatis:
mapper-locations: classpath:mapper/*.xml
③ 添加生產環境配置
新建application-prod.yml文件,這裡配置的是生產環境。具體內容如下,配置一樣的,只是各種換成了生產的
server:
port: 8989
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://www.xiezhrspace.cn:3308/mybatisdemo?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
mybatis:
mapper-locations: classpath:mapper/*.xml
以上配置好之後,我們就可以啟動springboot項目
瀏覽器輸入:http://localhost:8080 後出現如下內容,說明項目啟動成功
三、連接資料庫查詢數據
通過之前的步驟,我們的springboot項目已經可以正常運行起來了,接下來我們就從資料庫中獲取數據並通過json格式返回前臺
3.1 新建資料庫mybatisdemo並且創建sys_user表
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用戶名',
`nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶昵稱',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶密碼',
`sex` enum('1','2') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶性別',
`birthday` date NULL DEFAULT NULL COMMENT '用戶生日',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶郵箱',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶電話',
`addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶地址',
`stop_flag` enum('1','0') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶啟用標誌',
`create_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '用戶創建時間',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '用戶更新時間',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `sys_user` VALUES (1, 'xiezhr', '程式員小凡', '12345678', '1', '1999-09-19', '[email protected]', '13288888888', '雲南省昆明市', '0', '2023-09-04 21:08:32', NULL);
INSERT INTO `sys_user` VALUES (2, 'xiaoqi', '程式員曉柒', '123456', '1', '2020-10-04', '[email protected]', '13288888888', '雲南文山', '0', '2023-09-04 21:09:42', NULL);
INSERT INTO `sys_user` VALUES (3, 'xiaodeng', '財務小鄧', '123456', '2', '2019-09-04', '[email protected]', '13588888888', '雲南文山', '0', '2023-09-04 21:10:43', NULL);
3.2 創建實體類
創建與表結構一致的實體類SysUser
@Data 是Lombok依賴的註解,使用它我們就不用寫get、set方法了
@Data
public class SysUser implements Serializable {
private static final long serialVersionUID = 526934774547561999L;
/**
* 主鍵id
*/
private Integer id;
/**
* 用戶名
*/
private String username;
/**
* 用戶昵稱
*/
private String nickname;
/**
* 用戶密碼
*/
private String password;
/**
* 用戶性別
*/
private String sex;
/**
* 用戶生日
*/
private Date birthday;
/**
* 用戶郵箱
*/
private String email;
/**
* 用戶電話
*/
private String phone;
/**
* 用戶地址
*/
private String addr;
/**
* 用戶啟用標誌
*/
private String stopFlag;
/**
* 用戶創建時間
*/
private Date createTime;
/**
* 用戶更新時間
*/
private Date updateTime;
}
3.2 創建Mapper介面
數據訪問對象,是MVC架構中負責與資料庫進行交互的組件。它封裝了資料庫的訪問操作,提供給Service層調用。Dao層通常包含一系列方法,用於對資料庫進行增刪改查操作,以及與資料庫的連接、事務管理等。
@Mapper 表示這個介面是一個MyBatis的Mapper介面,用於定義資料庫操作的方法
@Mapper
public interface SysUserMapper {
List<SysUser> querySyserList();
}
3.3 添加mybatis.xml文件
MyBatis的映射文件(mapper),用於操作資料庫中的sys_user表。其中定義了一個resultMap用於映射查詢結果到SysUser對象,還定義了一個select語句用於查詢sys_user表中的所有用戶信息。 id="querySyserList" 必須與mapper介面中方法名一致
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiezhr.mapper.SysUserMapper">
<resultMap type="com.xiezhr.model.entity.SysUser" id="SysUserMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="username" column="username" jdbcType="VARCHAR"/>
<result property="nickname" column="nickname" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="sex" column="sex" jdbcType="VARCHAR"/>
<result property="birthday" column="birthday" jdbcType="TIMESTAMP"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="phone" column="phone" jdbcType="VARCHAR"/>
<result property="addr" column="addr" jdbcType="VARCHAR"/>
<result property="stopFlag" column="stop_flag" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
<!--查詢所有用戶信息-->
<select id="querySyserList" resultMap="SysUserMap">
select * from sys_user
</select>
</mapper>
3.4 新建service 介面及實現類
Service是MVC架構中負責處理業務邏輯的組件。它封裝了業務邏輯的實現細節,提供給Controller調用。Service層通常包含一系列方法,用於處理各種業務需求,如數據處理、事務管理、業務規則校驗等。
SysUserService
public interface SysUserService {
List<SysUser> querySyserList();
}
SysUserServiceImpl
- @Service :標識這個類是服務層(Service)的組件,用於實現業務邏輯的封裝和管理。以便Spring容器能夠掃描並將其實例化為一個Bean,並將其納入到Spring的管理中。通過@Service註解,可以方便地進行依賴註入、事務管理等操作
- @Resource :標識一個類或對象需要被註入到另一個類中,用於實現依賴註入
@Service
public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper userMapper;
@Override
public List<SysUser> querySyserList() {
return userMapper.querySyserList();
}
}
3.5 創建Controller
Controller是MVC架構中負責接收用戶請求並處理的組件。它接收來自用戶的請求,並根據請求的內容調用相應的Service方法進行業務處理,然後返回結果給用戶。Controller通常負責路由請求、參數驗證、調用Service等操作
SysUserController
- @RestController:用於標識一個類是RESTful風格的控制器,結合了@Controller和@ResponseBody註解的功能,用於處理HTTP請求並返回RESTful風格的響應
- @RequestMapping:用於映射HTTP請求到控制器的處理方法,指定請求的URL路徑和請求方法
- @Autowired:用於自動裝配依賴對象
@RestController
@RequestMapping("/sysUser")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public List<SysUser> querySysUser(){
return sysUserService.querySyserList();
}
}
到此我們三大組件的代碼都寫完了,接下來我們來看看我們寫好的介面
瀏覽器地址欄輸入:http://localhost:8080/sysUser/querySysUser
四、封裝統一結果返回
為了保證所有介面返回的數據格式一致,減少重覆代碼編寫。我們將對返回結果進行統一處理。
具體返回結果格式如下
{
"code": 200, // 狀態碼,表示請求的處理結果
"message": "請求成功", // 狀態消息,對請求結果的簡要描述
"data": { // 數據對象,用於存儲具體的返回數據
"key1": "value1",
"key2": "value2"
}
}
code
:表示請求的處理結果,一般採用HTTP狀態碼或自定義的業務狀態碼message
:對請求結果的簡要描述,通常是一個字元串data
:用於存儲具體的返回數據,可以是一個對象、數組或其他類型的數據
4.1 定義 IResultCode
的介面
它位於
com.xiezhr.common.result
包中,可以由不同的類來實現,實現一致且統一的結果碼和消息的處理和返回
package com.xiezhr.common.result;
public interface IResultCode {
String getCode();
String getMsg();
}
getCode()
: 這個方法返回一個String
類型的結果碼getMsg()
: 這個方法返回一個String
類型的結果消息
4.2 定義了一個枚舉類 ResultCode
定義了一個枚舉類
ResultCode
,它實現了IResultCode
介面,並包含了一些常見的響應碼和對應的消息。
@AllArgsConstructor
@NoArgsConstructor
public enum ResultCode implements IResultCode, Serializable {
SUCCESS("200","成功"),
NOT_FOUND("404","未找到"),
INTERNAL_SERVER_ERROR("500","伺服器內部錯誤"),
;
private String code;
private String msg;
@Override
public String getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
}
定義系統中常見的響應碼和對應的消息,用於表示不同的業務場景或操作的執行結果
每個枚舉常量都包含一個 code
和一個 msg
,分別表示響應碼和消息內容
枚舉常量包括了一些常見的響應碼,如 SUCCESS
表示成功, INTERNAL_SERVER_ERROR
伺服器內部錯誤, NOT_FOUND
表示未找到
4.3 定義統一響應結構體
定義了一個名為
Result
的類,用於表示統一的響應結構體
@Data
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
private String code;
private String msg;
private T data;
public static<T> Result<T> success() {
return success(null);
}
public static<T> Result<T> success(T data) {
Result result = new Result<>();
result.setCode(ResultCode.SUCCESS.getCode());
result.setMsg(ResultCode.SUCCESS.getMsg());
result.setData(data);
return result;
}
public static <T> Result<T> error(String msg) {
Result<T> result = new Result<>();
result.setCode(ResultCode.ERROR.getCode());
result.setMsg(ResultCode.ERROR.getMsg());
return result;
}
}
到此,統一響應返回我們已經封裝好了,我們來改造一下Controller中的代碼看看效果
SysUserController
未改之前
@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public List<SysUser> querySysUser(){
return sysUserService.querySyserList();
}
SysUserController
修改之後
@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public Result querySysUser(){
return Result.success(sysUserService.querySyserList());
}
前端返回結果
五、定義值對象VO
從上面的返回結果,我們會發現將密碼等敏感信息返回到了前端,這是非常不可取的
這時,我們就需要根據前端的需求,靈活地選擇需要展示的數據欄位
如果你還傻傻分不清PO BO VO DTO POJO DAO DO 這些概念,可以看看知乎的這篇文章,個人覺得還是說的比較清楚的了
https://www.zhihu.com/question/39651928/answer/2490565983
5.1 定義VO
定義一個需要返回前端的VO
@Data
public class UserInfoVO {
/**
* 用戶名
*/
private String username;
/**
* 用戶昵稱
*/
private String nickname;
/**
* 用戶性別
*/
private String sex;
/**
* 用戶生日
*/
private Date birthday;
/**
* 用戶郵箱
*/
private String email;
/**
* 用戶電話
*/
private String phone;
/**
* 用戶地址
*/
private String addr;
}
5.2 service 改造
interface SysUserService
改造前
public interface SysUserService {
List<SysUser> querySyserList();
}
interface SysUserService
改造後
public interface SysUserService {
List<UserInfoVO> querySyserList();
}
SysUserServiceImpl
改造前
@Service
public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper userMapper;
@Override
public List<SysUser> querySyserList() {
return userMapper.querySyserList();
}
}
SysUserServiceImpl
改造後
@Service
public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper userMapper;
@Override
public List<UserInfoVO> querySyserList() {
List<UserInfoVO> userInfoVOList = new ArrayList<UserInfoVO>();
List<SysUser> sysUserList= userMapper.querySyserList();
for (SysUser sysUser : sysUserList) {
UserInfoVO userInfoVO = new UserInfoVO();
BeanUtils.copyProperties(sysUser,userInfoVO);
userInfoVOList.add(userInfoVO);
}
return userInfoVOList;
}
}
service 返回由原來的SysUser -->變成UserInfoVO
5.3 介面測試
瀏覽器地址欄輸入:http://localhost:8080/sysUser/querySysUser
這時返回前端的json數據中已經沒有密碼了
六、日期時間處理
認真看文章的小伙伴可能已經發現了,前面返回的json數據中,日期是 "birthday": "1999-09-18T16:00:00.000+00:00" 這樣的
這樣的日期可讀性非常差,有沒有什麼方法可以格式化下日期呢?
其實呢,日期格式化非常簡單,我們只需要在之前定義好的UserInfoVO
的日期屬性上加上一個註解即可
import com.fasterxml.jackson.annotation.JsonFormat;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
我們來測試一下
通過格式化的日期就是我們習慣的日期格式了
七、統一異常處理
日常開發中,我們處理異常一般都會用到
try-catch
、throw
和throws
的方式拋出異常。這種方式不僅僅程式員處理麻煩,對用戶來說也不太友好
我們都希望不用寫過多的重覆代碼處理異常,又能提升用戶體驗。
這時候全局異常處理就顯得很便捷很重要了
小伙伴們如果對異常還不熟悉的可以看看這篇文章
https://blog.csdn.net/rong09_13/article/details/128090748
Springboot對於異常的處理也做了不錯的支持,它提供兩個註解供我們使用
- @ControllerAdvice註解 :用來開啟全局的異常捕獲,
- @ExceptionHandler註解:說明捕獲哪些異常,對那些異常進行處理
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(value =Exception.class)
public String exceptionHandler(Exception e){
System.out.println("發生了一個異常"+e);
return e.getMessage();
}
}
7.1 添加自定義異常與其他異常返回結果
我們在Result 類中添加如下兩個方法來處理自定義異常和其他異常返回結果
//自定義異常返回的結果
public static <T> Result<T> bussinessErr(BusinessException e) {
Result<T> result = new Result<>();
result.setCode(e.getErrorCode());
result.setMsg(e.getErrorMsg());
result.setData(null);
return result;
}
//其他異常處理方法返回的結果
public static <T> Result<T> otherErr(ResultCode resultCode) {
Result<T> result = new Result<>();
result.setCode(resultCode.getCode());
result.setMsg(resultCode.getMsg());
result.setData(null);
return result;
}
7.2 自定義異常
新建com.xiezhr.exception包,並自定義異常類
public class BusinessException extends RuntimeException{
private String errorCode;
private String errorMsg;
public BusinessException() {
}
public BusinessException(String errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
7.3 全局異常處理
我們自定義一個全局異常處理類,來處理各種異常,包括自己定義的異常和內部異常 。
這樣可以簡化不少代碼,不用自己對每個異常都使用try,catch的方式來實現
我們在com.xiezhr.exception
包下麵添加全局異常處理類GlobalExceptionHandler
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 處理自定義異常
*
*/
@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public<T> Result<T> bizExceptionHandler(BusinessException e) {
return Result.bussinessErr(e);
}
/**
* 處理其他異常
*
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result exceptionHandler(Exception e) {
return Result.otherErr(ResultCode.INTERNAL_SERVER_ERROR);
}
}
7.4 測試異常處理
我們在SysUserController 中添加如下代碼來測試下異常,看看能不能捕獲到
@RequestMapping("/getBusinessException")
public Result DeException(){
throw new BusinessException("400","我出錯了");
}
@RequestMapping("/getException")
public Result Exception(){
Result result = new Result();
int a=1/0;
return result;
}
八、添加系統日誌
日誌記錄應用程式的運行狀態,通過日誌開發者可以更好的瞭解應用程式的運行情況
當系統出現bug時,也能通過日誌快速定位問題和解決問題
8.1 常用日誌框架
① 常用日誌框架
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…
② 日誌框架之間的關係
日誌框架的設計類似於JDBC-資料庫驅動的設計,提供了統一的介面抽象層,然後再由各個資料庫廠商去實現它,
從而實現連接不同資料庫(Oracle、MySQL、PostgreSQL、MongoD...)
日誌門面(日誌抽象層) | 日誌實現 |
---|---|
JCL SLF4j jboss-logging |
Log4j JUL(java.util.logging) Log4j2 Logback |
我們需要需要選擇一個日誌門面 和日誌實現
springboot 預設選用SLF4j 和Logback
8.2 日誌常用配置
① 日誌輸出分析
- 日期時間:精確到毫秒
- 日誌級別:TRACE|DEBUG|INFO|WARN|ERR
- 進程ID:60236
- 分隔符:預設以---進行分割
- 線程名:由中括弧括起來,如[ main]
- Logger名: 一般使用類名
- 日誌內容
② 日誌級別
日誌級別由低到高如下
TRACE < DEBUG< INFO< WARN < ERROR
如果設置為 WARN
,則低於 WARN
的信息都不會輸出
Spring Boot
中預設配置ERROR
、WARN
和INFO
級別的日誌輸出到控制台
怎麼調整日誌級別呢?
- 在application.properties或application.yml配置文件中 調整
logging.level.root=DEBUG
- 在運行Spring Boot應用程式時,通過命令行參數來設置日誌級別
java -jar your-application.jar --logging.level.root=DEBUG
③ 日誌寫到文件中
需在application.properties或application.yml配置文件中設置
logging.file
或logging.path
屬性
logging.file
,設置文件,可以是絕對路徑,也可以是相對路徑。如:logging.file=my.log
logging.path
,設置目錄,會在該目錄下創建spring.log
文件,並寫入日誌內容,如:logging.path=/var/log
如果只配置 logging.file
,會在項目的當前路徑下生成一個 xxx.log
日誌文件。
如果只配置 logging.path
,在 /var/log
文件夾生成一個日誌文件為 spring.log
註:二者不能同時使用,如若同時使用,則只有logging.file
生效
預設情況下,日誌文件的大小達到10MB
時會切分一次,產生新的日誌文件,預設級別為:ERROR、WARN、INFO
8.3 日誌基本使用
①第一種方法
我們參照官網:https://www.slf4j.org/manual.html 的例子即可
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
②第二種方法
第一種方法中,每次使用都要創建了一個名為
logger
的Logger對象,使用起來有點繁瑣。這裡我們引入註解方式實現
使用註解@Slf4j 需要安裝lombok
插件
可以用{}
占位符來拼接字元串,而不需要使用+
來連接字元串。
@SpringBootTest
@Slf4j
class SpringbootdemoApplicationTests {
@Test
void testLog() {
String name = "xiezhr";
int age = 20;
log.info("name:{},age:{}", name, age);
}
}
日誌輸出如下:
2023-09-16T12:27:57.014+08:00 INFO 53792 --- [ main] c.x.s.SpringbootdemoApplicationTests : name:xiezhr,age:20
8.4 日誌高級配置
前面幾節說的都是springboot基本日誌配置,如果這些都不能滿足我們的需求,我們就需要添加logback-spring.xml
官方推薦的配置文件進行配置
logback-spring.xml
中 配置了兩個
大家可以參考下麵配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低於WARN的信息都不會輸出 -->
<configuration>
<!-- SpringBoot預設logback的配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<property name="LOG_HOME" value="/logs/${APP_NAME}"/>
<!--1. 輸出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- <withJansi>true</withJansi>-->
<!--此日誌appender是為開發使用,只配置最低級別,控制台輸出的日誌級別是大於或等於此級別的日誌信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 2. 輸出到文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 當前記錄的日誌文檔完整路徑 -->
<file>${LOG_HOME}/log.log</file>
<!--日誌文檔輸出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -%5level ---[%15.15thread] %-40.40logger{39} : %msg%n%n</pattern>
<charset>UTF-8</charset> <!-- 此處設置字元集 -->
</encoder>
<!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日誌文檔保留天數-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 臨界值過濾器,輸出大於INFO級別日誌 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 開發環境輸出至控制台 -->
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</springProfile>
<!-- 生產環境輸出至文件 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
看到這,大家如果對日誌還不太清楚的可以看看下麵雷神講的視頻,
https://www.bilibili.com/video/BV1sb411H7Po
最終完整項目結構如下
九、小結
本篇文章我們手把手創建了一個SpringBoot項目,並整合Mybatis實現了將資料庫中數據通過json返回前端。
對返回json結果進行統一封裝,異常的統一處理,日期時間的處理、開發/生產環境配置以及系統日誌配置。
以上都是基於日常工作開發中的實際案例,希望對你有所幫助。
本期內容到此九結束了,希望對你有所幫助。我們下期再見~ (●'◡'●)
本文來自博客園,作者:xiezhr,轉載請註明原文鏈接:https://www.cnblogs.com/xiezhr/p/17708711.html