27.日志技术、XML

一.日志技术

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文件的使用场景

1.XML文件经常被当成消息进行网络传输。
2.XML文件可以作为配置文件存储系统的信息。

2.4 XMl文件的创建

就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml

2.5 XML的语法规则

1. XML文件的后缀名必须是xml。
2. 文档声明必须是在第一行。
3. XML文件中可以定义注释信息,格式为:<!- 注释内容 -->
4. XML文件中可以存在以下特殊字符。因为XML不一定能正确识别关系运算符等特殊字符,所以用其他字符代替。
5. XML文件中可以存在CDATA区: <![CDATA[   …内容…  ]]>。
当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。
在CDATA段中出现的“<”、“>”、“””、“’”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。
在CDATA段中不能包含“]]>”,即CDATA段的结束定界符

2.6 XML的标签(元素)规则

1. 标签由一对尖括号和合法标识符组成 : <name></name> 必须存在一个根标签, 有且只能有一个。
2. 标签必须成对出现,有开始,有结束 : <name></name>
3. 特殊的标签可以不成对,但是必须有结束标记,如 : < br />
4. 标签中可以定义属性,属性和标签名空格隔开 , 属性值必须用引号引起来 <student id = 1 ></name>
5. 标签需要正确的嵌套

2.7 文档约束

1.问题引出
由于XML文件可以自定义标签,导致XML文件可以随意定义,程序在解析的时候可能出现问题。
2.什么是文档约束
是用来限定XML文件中的标签和属性应该怎么写。
3.文档约束的分类
文档约束分为DTD和schema

2.8 XML文档约束——DTD

1.需求:使用DTD文档约束,约束一个XML文件的编写。
2.步骤:
①编写DTD约束文档,后缀必须是.dtd。一般不用我们编写,后面的框架技术会帮我们准备好。
②在需要编写XML文件中导入该DTD约束文档。
③按照约束的规则编写XML文件的内容。
3.注意事项
不能约束具体的数据类型。

2.9 XML文档约束——schema

1.需求:
利用schema文档约束,约束一个XML文件的编写
2.步骤:
①编写schema文档约束,后缀必须是.xsd,具体的形式到代码中观看。
②在需要编写的XML文件中导入该schema约束文档
③按照约束内容编写XML标签
3.优点
①schema 可以约束具体的数据类型,约束能力上更强大。
②schema 本身也是一个 xml 文件,本身也受到其他约束文件的要求,所以编写的更加严谨

三.XML解析技术

3.1 什么是XML解析

使用程序读取XML文件中的数据。

3.2 分类

XMl解析分为SAX解析和DOM解析。
DOM解析:把整个XML文档读取到内存形成一棵文档树对象。
SAX解析: 逐行扫描XML文档,一边扫描一遍解析。

3.3 DOM解析

1.什么是DOM解析
把整个XML文档读取到内存形成一棵文档树对象,把XML文档中的每个标签、属性、数据看成一个个结点,然后对这些结点进行操作。
2.DOM常见的解析工具

3.4 DOM4J

1.需求:使用DOM4J解析XML文件
2.步骤:
①去官网下载DOM4J框架
②在项目中创建一个lib文件夹
③将dom4j框架所需的jar包复制到lib文件夹下
④在jar文件上右键, 选择 Add as Library -> 点击 OK
⑤在类中导包使用
3.DOM4J常用API:
SAXReader用于创建解析器对象,代表整个DOM4J对象。
Documnet类代表整个XML文档对象,Documnet对象用SAXReader的read方法获取。
DOM4J解析XML文件中的各种结点所需API:

3.5 示例代码

使用DOM4J提供的API进行文档的解析
xml文件代码:
解析代码:
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检索技术概述

XPath 使用 路径表达式 来定位 XML 文档中的元素节点或属性节点

4.2 步骤

1. 导入 jar (dom4j的 jaxen-1.1.2.jar) Xpath 技术依赖 Dom4j 技术
2. 通过 dom4j SAXReader 获取 Document 对象
3. 利用 XPath 提供的 API, 结合 XPath 的语法完成选取 XML 文档元素节点进行解析操作。

4.3 Document中与Xpath相关的API

4.4 Xpath的四大检索方案

4.4.1 绝对路径

采用绝对路径获取从根节点开始逐层的查找
代码示例:

4.4.2 相对路径

先得到根节点 contactList, 再采用相对路径获取下一级 contact 节点的 name 子节点并打印信息
代码示例:

4.4.3 全文检索

直接全文搜索所有的 name 元素并打印
代码示例:

4.4.4 属性查找

在全文中搜索属性,或者带属性的元素
代码示例:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真滴book理喻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值