目录
什么是日志
- 能够描述系统运行行状态的所有时间都可以算作日志 --> 用户下线 接口超时 数据库崩溃
什么是日志框架
- 是一套实现日志输出的工具包
日志框架的能力
- 定制输出目标
- 定制输出格式
- 日志框架的选择
- 携带上下文信息 (类路径、时间戳、线程、调用对象等等)
- 运行选择性输出
- 灵活的配置
- 优异的性能
常见日志框架
JCL、jboos-logging、Log4j、Log4j2、SLF4j、JUL、Logback
logback的使用与配置
项目结构
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
测试类 @slf4j 注解的使用
package cn.bufanli.shell;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ShellApplication.class}) //启动类
@Slf4j
public class ShellApplicationTests {
@Test
public void contextLoads() {
String name = "bufanli";
String pass = "123456";
log.debug("debug.....");
//日志中使用变量
//占位符使用
log.info("info...{} ---{}",name,pass);
//拼接
log.error("eroor..."+name+"---"+pass);
}
}
控制台输出
日志输出到文件配置
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
两种方式
application.properties 简单文件配置
logging.level.com.atguigu=trace
#logging.path=
# 不指定路径在当前项目下生成springboot.log日志
# 可以指定完整的路径;
#logging.file=G:/springboot.log
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
logback-spring.xml xml复杂文件配置 区分info和error日志,每天产生一个日志文件,便于我们定位问题查找日志,不需要yml配置,文件名称固定放在resources根目录下
logback-spring.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--控制台输出日志-->
<appender name="conlsoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--打印日志的格式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
<!--info日志配制-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--过滤掉error级别日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--如果是error就不執行appender的配置,不是就执行info信息保存到本地-->
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 根目录logs/info.xxx.log-->
<FileNamePattern>./logs/info/%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
</appender>
<!--error日志配置-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--过滤只输出error级别日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>./logs/error/%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
</appender>
<!--引用上面的 appender-->
<root level="info">
<appender-ref ref="conlsoleLog" />
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
</root>
</configuration>
执行test
error目录下日志文件
info目录下
扩展
使用LogBack日志可以把日志配置文件名成命名如下,不同的名称功能不同