(1)常见的日志框架如下:
抽象层:JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging
实现层:Log4j Log4j2 Logback JUL(java.util.logging)
抽象层只有接口,用户只需要使用这些接口进行开发就行了,这样如果想更换日志框架,只需要更换实现层即可。
(2)SpringBoot 默认抽象层使用的是 SLF4j,实现层使用的是 Logback。
(3)使用时调用 SLF4j 提供的接口即可,但是需要导入实现层的 jar 包。
而配置文件中的日志配置是针对于实现层的,SLF4j 只是提供了调用的接口。
(1)不同的框架使用的日志框架是不一样的,如 SpringBoot 使用的是 SLF4j 而 Spring 使用的是 commons-loggin。因此如果同时存在多个框架,而他们的日志框架又不相同,就会发生冲突。
(2)SpringBoot 中提供的解决方案:
引入中间包(jul-toslf4j、log4j-over-slf4j、jcl-over-slf4j)来替换原来的日志包,下图是 SpringBoot 中日志部分的依赖关系
注:中间包的原理:偷梁换柱,这些中间包中的类名和方法名都和原来的日志包中的相同,但是在方法内部有调用了 SLF4j 的接口来实现。这样原来的日志框架在调用日志记录方法的时候,就会进入到中间包的方法内,进而调用到 SLF4j 的接口。
在引入中间包后,和原来的日志包会发生冲突,因此在导入其他框架的时候需要将原来的日志包给移除,不然会报错。
org.springframework.ws
spring-ws-core
${spring-ws.version}
commons-logging
commons-logging
总结:SpringBoot 能够自动适配所有日志框架,其底层采用的是 SLF4j + Logback 的方式记录日志,当引入其他框架时,需要把这个框架依赖的其他日志框架移除。
(1)日志级别
trace(追踪程序运行用的信息,例如想输出运行到哪一步了) < debug(调试信息,关键步骤的输出) < info(自定义信息) < warn(返回值非预期) < error(异常)
SpringBoot 默认输出的是 info 级别的日志,如果想要更改日志的输出级别,可以通过配置文件更改
(2)使用 SLF4j
public class SpringbootHelloworld {
Logger logger = LoggerFactory.getLogger(SpringbootHelloworld.class);
public void testLogging() {
logger.trace("trace...");
logger.debug("debug...");
logger.info("info...");
logger.warn("warn...");
logger.error("error...");
}
(3)日志的配置
① 在全局配置文件中配置
利用 logging.level 来指定某个包的日志级别
利用 logging.file 来指定日志输出文件
利用 logging.path 来指定日志输出文件的目录,SpringBoot 会在指定目录下生成 spring.log 文件
利用 logging.pattern.console 来指定控制台的日志输出格式
利用 logging.pattern.file 来指定文件中日志的输出格式
注: logging.file 和 logging.path 均未配置时,日志不会输出到文件中,两者均配置时会以 logging.file 的配置为准。
logging.level.robinpractice.springboot_helloworld=trace
logging.file=robin.log
logging.path=E:/springboot/log
② 导入日志配置文件
只需要将配置文件的名字改为下面的格式,放到资源目录下,配置文件就会被自动加载
Logging System | Customization |
---|---|
Logback |
|
Log4j2 |
|
JDK (Java Util Logging) |
|
加载时,如果配置文件名不带 -spring,那么将会被 Spring 加载而不会被 SpringBoot 加载。若配置文件名为 **-spring.xml 则会被 SpringBoot 加载,这样就可以才可以使用 SpringBoot 的高级功能。因此推荐 **-spring.xml 的命名方式。
(1)通过 /** 这样的请求来访问资源,如果这个请求没有被处理(没有Mapping映射),就会去静态资源文件夹下寻找:
① classpath:/META-INF/resources/ 实际上相当于 src/main/resources/META-INF/resources/
② classpath:/resources/ 实际上相当于 src/main/resources/resources
③ classspath:/static/ 实际上相当于 src/main/resources/static
④ classspath:/public/ 实际上相当于 src/main/resources/public
⑤ / 这个是当前项目的根目录
注:classpath 实际上就相当于 src 下的 resources 目录和 java 目录。
classpath 是编译后 target 下的 classes 目录;而 resources 目录和 java 目录中的内容均会被编译到这个目录下。
(2)欢迎页,通过 localhost:8080/ 请求来访问欢迎页,SpringBoot 会在静态资源文件夹下寻找 index.html 文件。
当静态资源文件夹下有多个 index.html 时,按照 ① 中由上到下的顺序寻找。
(3)页面图标,SpringBoot 会在静态资源文件夹下寻找 favicon.ico 文件作为页面的图标
(1)SpringBoot 不支持 JSP,但是支持模板引擎,因此在开发时都会引入模板引擎开发前端页面。SpringBoot 推荐的模板引擎就是 thymeleaf。
(2)使用 thymeleaf 需要引入依赖 starter-thymeleaf 。
org.springframework.boot
spring-boot-starter-thymeleaf
(3)页面跳转的前后缀
@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
从 ThymeleafProperties 类中可以看出,页面跳转的前缀为 classpath:/templates,后缀为 .html。因此跳转的页面应该放在 classpath:/templates 目录下。如果要修改前后缀可以在配置文件中配置。
(4)Thymeleaf 语法规则
参考资料 https://www.thymeleaf.org/
使用前可以引入命名空间,这样就会有提示
① 更改元素的属性值
tx:text :改变当前元素的文本信息,可以设置默认的文本信息,在显示静态页面时,会显示默认信息,在显示动态页面时,会显示 tx:text 中的值。
tx:任意属性:改变当前元素的任意属性值
② 表达式
${ } / *{ }: 获取变量的值、获取对象的属性、调用方法
#{ } :获取国际化内容
@{ } :定义 URL
③ 支持常见的 数学运算/逻辑运算/比较运算/字符串拼接 等
④ 支持条件语句 th:if ,遍历 th:each,循环 th:for 等等
默认文本