SpringBoot日志,web开发

SpringBoot日志,web开发

SpringBoot日志

日志框架

市面上的日志框架:
JUL,JCL,Jboss-logging,logback,log4j,log4j2,slf4j

日志门面日志实现
JCL SLF4j Jboss-loggingLog4j JUL Log4j2 Logback

左边选一个门面(抽象层),右面选一个实现

日志门面:SLF4J
日志实现:Logback

SpringBoot:底层是Spring框架,Spring框架默认是使用JCL
SpringBoot选用SLF4j和Logback

SLF4j使用

如何在系统中使用SlF4j

开发时候,日志记录方法的调用,不应该直接调用日志的实现类方法,应该调用而是调用日志抽象层里面的方法

给系统导入slf4j和logback的jar

每一个日志的实现框架都有自己的配置文件,使用slf4j以后,配置文件还是做成日志实现框架的配置文件

统一日志记录

即使是别的框架也和我一起统一使用slf4j进行输出

如何让系统中所有的日志都统一到slf4j

  1. 将系统中的其他日志框架线排除
  2. 用中间包来替换替换源有的日志框架
  3. 我们导入slf4j的其他实现

SpringBoot的日志

springboot是用他来做日志功能的

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.2.6.RELEASE</version>
      <scope>compile</scope>
</dependency>

总结:

  1. SpringBoot底层也是使用slf4j来进行日志记录
  2. SpringBoot也把日志都替换成了替换包
  3. 中间替换包
  4. 如果我们要引入其他框架,一定要包这个框架的默认日志依赖移除掉
    SpringBoot能自动适配所有日志,我们唯一要做的是引入其他框架的时候,只需要吧这个框架的依赖去除掉

日志使用

默认配置

SpringBoot默认帮我们配置好了日志直接使用即可

Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
// 日志的级别由低到高
	logger.trace("这是trace日志");
	logger.debug("这是debug日志");
	logger.info("这是info日志");
	logger.warn("这是warn日志");
	logger.error("这是error日志");
}

SpringBoot默认的日志等级是(root等级)info级别

可以在配置文件中对日志进行配置

简单的日志配置

配置包的日志等级logging.level.top.byfree = trace
配置生成文件的路径logging.file.path=
配置生成文件的名称logging.file.name=
配置控制台输出的格式logging.pattern.console=
配置文件输出格式logging.pattern.file=

具体的输出格式的写法参照之前mybatis中的日志部分的笔记

指定配置

给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不用使用他默认配置的了

Logging SystemCustomization
Logbacklogback-spring.xml logback-spring.groovy logback.xml logback.groovy
Log4j2log4j2-spring.xml log4j2.xml
JDK(Java Utill Logging)logging.properties

logback.xml:直接就被日志框架识别了
logback-spring.xml:先被springboot识别

被springboot识别可以使用一个很强大的功能
可以使用springProfile标签进行环境配置

<springProfile name="dev">
</springProfile>

注意必须是使用-spring的文件名才可以使用这个高级功能

切换日志框架

可以按照slf4j的日志适配图,进行相关的切换
slf4j+log4j

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			<artifactId>logback-classic</artifactId>
			<groupId>ch.qos.logback</groupId>
		</exclusion>
		<exclusion>
			<artifactId>log4j-to-slf4j</artifactId>
			<groupId>org.apache.logging.log4j</groupId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-log4j12</artifactId>
</dependency>

使用log4j2

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			<artifactId>spring-boot-starter-logging</artifactId>
			<groupId>org.springframework.boot</groupId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

SpringBoot Web开发

使用SpringBoot

  1. 创建一个SpringBoot应用选中我们需要的模块
  2. SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
  3. 自己编写业务代码

SpringBoot对静态资源的映射规则

1.所有/webjars/,都去classpath:/META-INF/resources/webjars/找资源
webjars: 以jar包的方式引入静态资源
2. "/
"访问当前项目的任何资源

"classpath:/META-INF/resources"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public"
"/":当前的类路径

localhost:8080/abc === 去静态资源文件夹里面去找abc
3. 欢迎页;静态资源文件夹下的所有index.html页面;被"/"映射
4. 所有的
/favicon.ico都是在静态资源文件下找

模板引擎

jsp,velocty,freemarker,thymeleaf

SprigBoot推荐使用thymeleaf
语法更简单,功能更强大

引入thymeleaf

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Thymeleaf使用&语法

只要我们打HTML页面放在classpath:/templates/,thymeleaf就能帮我们自动渲染

  1. 导入thymeleaf的名称空间用以获得代码提示
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
  2. 使用thymeleaf语法
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>成功</title>
</head>
<body>
<h3>成功!</h3>
<!--将div里面的文本内容设置位tx:text-->
<div th:text="${hello}"></div>
</body>
</html>
  1. 语法规则
    1). th:任意html属性;来替换原生属性的值
    2). 表达式?
    ${}:获取变量值 OGNL
    *{}:和${}基本一样,多出补充配和th:object使用
    #{}:获取国际化内容
    @{}:定义URL
    ~{}:引用表达式

小案例

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>成功</title>
</head>
<body>
<h3>成功!</h3>
<!--将div里面的文本内容设置位tx:text-->
<div th:text="${hello}"></div>
<div th:utext="${hello}"></div>
<hr/>
<h4 th:text="${user}" th:each="user:${users}"></h4>

<ul>
    <li th:each="user:${users}">[[${user}]]</li>
</ul>
</body>
</html>

SpringMVC自动配置

SpringBoot 自动配置好了SpringMVC
以下是SpringBoot对SpringMVC的默认配置:

  • ContentNegotiatingViewReslover 和 BeanNameViewResolver
    • 自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View)驶入对象决定如何渲染(转发?重定向))
    • ContentNegotiatingViewReslover:组合所有的视图解析器
    • 如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来
  • 静态资源文件夹路径和webjars
  • 静态首页访问
  • favicon.ico
  • 自动注册了Converter,Formatter
    • Converter:转换器;类型转换使用
    • Formatter:格式化器;2017/12/7===Date
    • 自己添加的格式化器和转换器只需要放在容器中即可
  • HttpMessageConverters
    • HttpMessageConverters:SpringMVC用来转换Http请求和响应的;User-json

扩展SpringBoot

编写一个配置类(@Configuration),
是WebMvcConfigurerAdapter类型;不能标注@EnableWebMvc
(在springboot的高版本中WebMvcConfigurerAdapter被弃用了,推荐使用的是WebMvcConfigurer,直接实现或者是继承子类WebMvcConfigurationSupport也可以)
既保留所有的自动配置,也扩展了我们的控制

在这个配置类当中实现需要的方法即可

@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        // 浏览器发送free请求来到success
        registry.addViewController("/free").setViewName("success");
    }
}

原理:

  1. WebMvcAutoConfiguration是SpringMVC的自动配置类
  2. 在做其他的自动配置时会导入:@Import(EnableWebMVCConfiguration.class)
  3. 容器中说有的WebMvcConfigurer都会一起起作用
  4. 我们的配置类也会被调用:
    效果:SpringMVC和我们的配置类都会起作用

全面接管SpringMVC

SpringBoot对SpringMVC的自动配置都不需要了,所有的都是我们自己配
我们需要在配置类中添加@EnableWebMvc

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.byfree.top/archives/springbootlogandweb