一.日志技术
1.1 什么是日志
日志文件就是帮助我们记录程序开发或者使用过程中的一些必要信息,帮助我们进行后期的维护和纠错。日志技术的优势在于:
-
可以将系统执行的信息,方便的记录到指定的位置(控制台、文件、数据库)
-
可以随时以开关的形式记录日志的记录和取消,无需侵入到源代码中去修改。
而我们经常用 System.out.println() 记录日志的缺点在于:
-
信息是展示在控制台。
-
不能方便的记录到其他位置(文件、数据库)。
-
想取消记录的信息需要修改代码才可以完成。
1.2 日志技术体系
日志接口:一些规范,提供给日志的实现框架设计的标准。
日志框架:牛人或者第三方公司已经做好的代码实现,后来者可以直接拿去使用。
因为有人对 Commons Logging 接口不满意,就搞了 slf4j。因为有人对 Log4j 的性能不满意,就搞了 Logback,Logback 是基于 slf4j 的日志规范实现的框架。
1.3 日志文件的基本使用
1.3.1 Spring Boot 中的日志
Spring Boot 项目在启动的时候默认就有如下图所示的日志输出。可见,Spring Boot 内置了日志框架,也就是包含了 org.slf4j 坐标,从而能完成日志在控制台的打印。:
1.3.2 在项目中自定义日志打印
第一步:获取日志对象
在程序中获取日志对象需要使用日志工厂 LoggerFactory,代码如下:
// 1. 得到日志对象
private final Logger logger = LoggerFactory.getLogger(UserController.class);
其中,getLogger 方法需要传入当前类,用于说明日志归属类,便于我们更加直观的定位到问题类。同时,需要注意的是,Logger 对象属于 org.slf4j 包下。
第二步:使用日志对象打印日志
// 2. 写日志的方法
@RequestMapping("/hi")
public String sayHi() {
// 写日志
logger.trace("我是 trace");
logger.debug("我是 debug");
logger.info("我是 info");
logger.warn("我是 warn");
logger.error("我是 error");
return "Hi, Spring Boot.";
}
实现结果:
1.4 日志级别
1.4.1 日志级别的作用
日志级别的作用在于通过设置不同级别的日志来查看不同严重程度的问题信息,方便定位问题,快速排除问题。比如在生产环境中,一般只记录INFO及以上级别的日志,这样可以减少日志量,避免影响系统性能。而在调试过程中,一般会开启DEBUG级别的日志,以便更详细地了解程序的运行情况,从而找到问题所在。总的来说,通过设置日志级别,可以大大节省开发者信息筛选的时间,帮助我们快速定位和排除问题。
1.4.2 日志级别的分类
日志的级别分为:
-
trace:微量,少许的意思,级别最低;
-
debug:需要调试时候的关键信息打印;
-
info:普通的打印信息(默认日志级别);
-
warn:警告,不影响使用,但需要注意的问题;
-
error:错误信息,级别较高的错误日志信息;
-
fatal:致命的,因为代码异常导致程序退出执行的事件。
实际中,我们能自定义的只有前5个,而致命级别的日志,会在代码异常导致程序退出时执行。日志级别的顺序如下图所示:
例如,当设置日志级别为 error 时,我们就只能收到 error、fatal 级别的日志了。而之前的案例中,是因为 Spring Boot 中默认的日志级别是 info, 因此,控制台只有 info、warn、error 级别的日志信息。
1.4.3 日志级别的设置
日志级别的设置,只需要在配置文件中设置 logging.level 配置项即可。
配置根路径的日志级别:
# 日志级别设置
logging:
level:
root: error
此时,我们再次运行自定义日志打印中的代码,得到如下结果:
可见,控制台干净了许多,原来的info等日志信息都被筛选掉了~。
在根路径日志级别的基础上配置子目录日志级别
# 日志级别设置
logging:
level:
root: error
com:
hxh:
demo:
controller: trace
此时,对于 com.hxh.demo.controller 包下的类,trace 及以上级别的日志信息被打印到控制台上。
1.5 日志持久化
到这里,我们已经了解到如何自定义日志打印以及如何设置日志级别。但是还遗留了一个致命性的问题:日志信息是输出在控制台的,如果重新启动项目,控制台的信息不就消失了吗?有没有什么方法能够将日志信息保存起来,方便以后查看呢?
答案是肯定的,在生产环境中,我们常常把日志信息保存下来。而将日志信息保存下来的过程就叫做日志持久化。想要将日志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后,
Spring Boot 就会将控制台的日志写到相应的⽬录或⽂件下了。
配置日志文件的保存路径:
# 设置日志文件的目录
logging:
file:
path: D:\\home\\log
配置日志文件的文件名:
logging:
file:
name: D:\\home\\log\\spring-1024.log
1.6 基于lombok的日志输出
1.6.1 lombok简单输出日志
通过观察自定义日志打印的案例,我们可以看出,每个打印日志的方法都需要创建 Logger 对象才能使用:
private final Logger logger = LoggerFactory.getLogger(UserController.class);
该语句比较固定,写起来不太“优雅”,这里提供一种更加简洁的方式:使用 lombok 来更简单的输出,具体步骤如下:
第一步:添加 lombok 依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
第二步:输出日志
使用 @Slf4j 注解,在程序中使用 log 对象即可输入日志,并且只能使用 log 对象才能输出,这是 lombok 提供的对象名(原因见lombok原理)。
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
@RequestMapping("/student")
@Slf4j
public class StudentController {
// 打印日志
@RequestMapping("/hi")
public String sayHi() {
log.error("这是通过 lombok 打印的日志信息~");
return "hi";
}
}
1.6.2 lombok 常用注解
二.XML
2.1 XML概述
XML是可扩展标记语言的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用于存储和传输数据。XML的特点如下:
-
XML语言书写的内容是纯文本,默认使用UTF-8编码。
-
如果把XML内容存为文件,那么他就是一个XML文件。
2.3 XML文件的使用场景
2.4 XMl文件的创建
![](https://img-blog.csdnimg.cn/895355167d294f57a09ea0952ba76e07.png)
2.5 XML的语法规则
![](https://img-blog.csdnimg.cn/719830b01976421281bfb5fcddbb92fb.png)
![](https://img-blog.csdnimg.cn/c6e358aea1a44af9862a2795023027fd.png)
2.6 XML的标签(元素)规则
2.7 文档约束
2.8 XML文档约束——DTD
![](https://img-blog.csdnimg.cn/0c4ac53b00e84a3791bb413d6c0b4222.png)
2.9 XML文档约束——schema
![](https://img-blog.csdnimg.cn/6e503e9263bf4538bf33715e10fdd4b2.png)
三.XML解析技术
3.1 什么是XML解析
![](https://img-blog.csdnimg.cn/72ccab5a9fe544c18067eaaf5b1f7661.png)
3.2 分类
3.3 DOM解析
![](https://img-blog.csdnimg.cn/8e81bd442b464921874d5b9a6b60b171.png)
![](https://img-blog.csdnimg.cn/8cebf91dbf964c638b1573bac4c89261.png)
3.4 DOM4J
![](https://img-blog.csdnimg.cn/7d9be04505e84f5a8d95f6b30f45b1ca.png)
![](https://img-blog.csdnimg.cn/d6ad11f9a0c84eb2949b97f1212072d7.png)
![](https://img-blog.csdnimg.cn/f13299f1b4e3467e990e7b42a785b7c0.png)
3.5 示例代码
![](https://img-blog.csdnimg.cn/c7c3f3fb1f5f417caa1ed3444ff1f3bb.png)
public class TestDemo {
//目标:掌握Dom4j框架的使用
public static void main(String[] args) throws DocumentException {
//1.创建解析器对象,代表整个Dom4j框架
SAXReader saxReader = new SAXReader();
//2.把整个XML文件读取到内存中成为一个Document对象
//使用Class类中提供的方法获取xml文件的输入流,可以随便找个类对象
InputStream is = Student.class.getResourceAsStream("/testfile.xml");
Document document = saxReader.read(is);
//3.使用框架提供的API
// 获取document文档对象的根元素对象
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName());
//获取根对象下的所有子元素对象
List<Element> elements = rootElement.elements();
for (Element element : elements) {
System.out.println(element.getName());
}
//获取根对象下的某个子元素对象
Element body = rootElement.element("body");
System.out.println(body.getText());
System.out.println(body.getTextTrim());
//获取属性值
Element head = rootElement.element("head");
Element title = head.element("title");
Attribute id = title.attribute("id");
System.out.println(id.getName()+"-->"+id.getValue());
String type = title.attributeValue("type");
System.out.println(type);
}
}
四.XML检索技术
4.1 XML检索技术概述
4.2 步骤
4.3 Document中与Xpath相关的API
4.4 Xpath的四大检索方案
4.4.1 绝对路径
![](https://img-blog.csdnimg.cn/31ca49eac1bc45bf8ab75ad88789a98f.png)
![](https://img-blog.csdnimg.cn/8bc1131ee50b43f6b15863edcba49ba8.png)
![](https://img-blog.csdnimg.cn/5a41d6d7b41a4a569417e9979bb208f7.png)
4.4.2 相对路径
![](https://img-blog.csdnimg.cn/60bf4b3f705f497597dbc78af9d6a4dc.png)
![](https://img-blog.csdnimg.cn/e3c193b8868c45339876a72721b45f98.png)
4.4.3 全文检索
![](https://img-blog.csdnimg.cn/82394fb4e8e34dd0924fcb1aa4d58455.png)
![](https://img-blog.csdnimg.cn/81c20932ed304531b3dc187348ca67e1.png)
4.4.4 属性查找
![](https://img-blog.csdnimg.cn/6e1b2bea810d4d61958186188c26d77d.png)
![](https://img-blog.csdnimg.cn/6371a7ca9b58498ba936d089d5bcfa26.png)