SpringBoot日志
日志框架
市面上的日志框架:
JUL,JCL,Jboss-logging,logback,log4j,log4j2,slf4j
日志门面 | 日志实现 |
---|---|
左边选一个门面(抽象层),右面选一个实现
日志门面:SLF4J
日志实现:Logback
SpringBoot:底层是Spring框架,Spring框架默认是使用JCL
SpringBoot选用SLF4j和Logback
SLF4j使用
如何在系统中使用SlF4j
开发时候,日志记录方法的调用,不应该直接调用日志的实现类方法,应该调用而是调用日志抽象层里面的方法
给系统导入slf4j和logback的jar
每一个日志的实现框架都有自己的配置文件,使用slf4j以后,配置文件还是做成日志实现框架的配置文件
统一日志记录
即使是别的框架也和我一起统一使用slf4j进行输出
如何让系统中所有的日志都统一到slf4j
- 将系统中的其他日志框架线排除
- 用中间包来替换替换源有的日志框架
- 我们导入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>
总结:
- SpringBoot底层也是使用slf4j来进行日志记录
- SpringBoot也把日志都替换成了替换包
- 中间替换包
- 如果我们要引入其他框架,一定要包这个框架的默认日志依赖移除掉
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 System | Customization |
---|---|
Logback | logback-spring.xml logback-spring.groovy logback.xml logback.groovy |
Log4j2 | log4j2-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
- 创建一个SpringBoot应用选中我们需要的模块
- SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
- 自己编写业务代码
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就能帮我们自动渲染
- 导入thymeleaf的名称空间用以获得代码提示
<html lang="en" xmlns:th="http://www.thymeleaf.org">
- 使用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). 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");
}
}
原理:
- WebMvcAutoConfiguration是SpringMVC的自动配置类
- 在做其他的自动配置时会导入:@Import(EnableWebMVCConfiguration.class)
- 容器中说有的WebMvcConfigurer都会一起起作用
- 我们的配置类也会被调用:
效果:SpringMVC和我们的配置类都会起作用
全面接管SpringMVC
SpringBoot对SpringMVC的自动配置都不需要了,所有的都是我们自己配
我们需要在配置类中添加@EnableWebMvc
Q.E.D.