1、logback和slf4j的关系
slf4j为简单日志门面,是日志框架的抽象,实现了很多日志框架一些通用的api,其中log4j和logback是众多日志框架中的几种。
llogback可以单独的使用,也可以绑定slf4j一起使用。
1. 单独使用。分别调用框架自己的方法来输出日志信息。
2. 绑定slf4j一起使用。调用slf4j的api来输入日志信息,具体使用与底层日志框架无关(需要底层框架的配置文件)
简单来说,logback是一个日志框架,而slf4j封装了很多日志框架通用的api,可以结合日志框架更加简单的使用日志框架。
2、实际使用
2.1引入依赖
<dependency>
<!-- lombok中集成了slf4japi-->
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- logback 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
2.2在resouces目录下建立logback.xml配置文件
输出目录和日志级别就在这里配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %5p %m%n</pattern>
</encoder>
</appender>
<!-- 出错日志 appender -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/logbackdemo/error/error.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<!-- log.dir 在maven profile里配置 -->
<fileNamePattern>./logs/logbackdemo/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 日志最大的历史 2天 -->
<maxHistory>2</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10485760</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- info日志 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/logbackdemo/info/info.log</file>
<append>true</append>
<!-- 按天回滚 daily -->
<!-- log.dir 在maven profile里配置 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>./logs/logbackdemo/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 日志最大的历史 2 -->
<maxHistory>2</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10485760</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO" />
<appender-ref ref="ERROR" />
</root>
</configuration>
2.3测试类
package com.lst.logdemo;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
@SpringBootTest
@Component
class LogdemoApplicationTests {
private static final Logger log = LoggerFactory.getLogger(LogdemoApplicationTests.class);
@Test
void contextLoads() {
log.error("错误日志测试");
}
}
2.4输出结果
控制台输出:
找到配置的目录下:
3、在实际的项目中,我们可以编写一个aop切面来将所有拦截的连接点(需要日志的接口),然后进行日志的统一处理
public class AllAop {
private static final Logger logger = LoggerFactory.getLogger(AllAop.class);
/**
* 类切点
*/
@Pointcut(value = "execution(* com.lst.*.ctrl.*+.*(..)) ")
public void AllAop() {
}
@Around("AllAop()")
public Object aroundMethod(ProceedingJoinPoint pdj) throws Exception {
//自己的日志信息的封装
//......
Long startTime = 0L;
Long endTime = 0L;
Long takeTime = 0L;
String exception = "";
Object result = "";
try {
startTime = System.currentTimeMillis();
final Object[] paramValues = pdj.getArgs();
//参数
} catch (Exception e) {
e.printStackTrace();
}
try {
result = pdj.proceed();//运行接口方法
} catch (Throwable e) {
e.printStackTrace();
throw new Exception(exception);
} finally {
Map<String,Object> map=new HashMap<>();
//........封装日志信息
logger.info(JSON.toJSONString(map));
}
return result;
}
}