2.1 日志框架
2.1.1 基本介绍
市面上有的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j …. | 日志门面 (日志的抽象层) | 日志方法(日志的实现层) | | :—-: | :—-: | | JCL(Jakarta Commons Logging)
SLF4j(Simple Logging Facade for Java)
jboss-loggi | JUL(java.util.logging)
Log4j
Log4j2 (Apache 开发的)
Logback(比 log4j 性能更好) |使用:开发时有关日志记录方法的调用,不应该直接调用日志的实现类,而应该调用日志抽象层里面的方法;
2.1.2 SLF4j 背景
完整介绍可参考 slf4j 官网
slf4j 及与各实现框架的适配实现
注:每一个日志的实现框架都有自己的配置文件,使用 slf4j 以后,配置文件还是做成日志实现框架自己本身的配置文件;
slf4j + logback 实现
//jar 包准备:从 pom.xml 中导入 slf4j 的 jar 和 logback 的实现 jar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
使用 slf4j 统一系统日志
- 项目中可能依赖不同的框架,其所用的日志可能不同,如 Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis……
- 解决方案:将项目中用到的多种日志 API 中间使用 SLF4J 或第三方提供的日志适配器统一适配到 SLF4J;
- “适配”的本质:将系统中其他日志框架先排除出去,用中间包来替换原有的日志框架(适配器的类名和包名与替换的被日志框架一致),然后导入 slf4j 其他的实现;
2.1.3 spring boot 对 SEL4J 的使用
SpringBoot 使用 sel4j 来做日志功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
spring boot 日志工具包特点
- SpringBoot 底层使用 slf4j+logback 的方式进行日志记录;
- SpringBoot 能自动适配所有日志,通过中间替换包把其他的日志都替换成 slf4j;
- 在引入其他框架时,需要把这个框架的默认日志依赖移除掉,如 Spring 框架使用 commons-logging;
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
使用
- 使用1-使用记录器 logger 打印不同级别的日志信息; ```java package com.cyt.springboot;
import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) @SpringBootTest public class SpringBootLoggingApplicationTests {
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//日志的级别,由低到高 trace->debug->info->warn->error
//可以调整输出的日志级别,日志就只会打印不低于这个级别的日志信息
//spring boot 默认使用 info 级别
logger.trace("这是 trace 日志");
logger.debug("这是 debug 日志");
logger.info("这是 info 日志");
logger.warn("这是 warn 日志");
logger.error("这是 error 日志");
}
}
- 使用2-在 application.properties 中修改日志的默认配置;
```java
# 1. 配置可以输出的日志级别
logging.level.root=error #也可以指定一个包路径,eg:logging.level.com.cyt=error
# 2. 配置日志文件的输出路径,默认输出在当前 console 控制台
# 注意:logging.path 和 logging.file 二者选一使用;
logging.file=G:/springboot.log #不指定路径的话默认在在当前项目路径下生成 springboot.log 日志
logging.path=/spring/log #在当前磁盘的根路径下创建spring文件夹和里面的log文件夹,且使用 spring.log 作为默认文件
# 3. 配置输出的日志格式
# 3.1 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 3.2 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
# 3.3 补充:日志输出格式->
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符->
使用3-在类路径下自定义日志配置文件,会覆盖 SpringBoot 的默认配置;
配置文件命名如下所示,推荐使用 xx-spring.xml,可以使用 spring 的高级功能; | Logging System | Customization | | —- | —- | | Logback |
logback-spring.xml
,logback-spring.groovy
,logback.xml
orlogback.groovy
| | Log4j2 |log4j2-spring.xml
orlog4j2.xml
| | JDK (Java Util Logging) |logging.properties
|logback.xml 和 logback-spring.xml 的区别
- logback.xml 会直接就被日志框架识别然后使用;
- logback-spring.xml:会由 SpringBoot 解析日志并配置,可使用 SpringBoot 的高级 Profile 功能等;
- 案例:在 logback-spring.xml 中配置不同开发环境选用不同的日志输出格式
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <springProfile name="dev"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern> </springProfile> <springProfile name="!dev"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern> </springProfile> </layout> </appender>Copy to clipboardErrorCopied