作为一个完整的项目首先必不可少的就是需要有日志,本文我们用springboot进行日志的搭建。
常见的日志框架根据门面和实现可分为两大类:
(1)日志门面:JCL、SLF4j、jboss-logging
(2)日志实现:Log4j、Log4j2、Logback、JUL
其中,SLF4j、Log4j、Logback出自于同一作者,为了保证良好的可用性和兼容性,我们使用SLF4j、Logback进行日志的搭建。
首先,建立一个LoggerTest类:
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
@Slf4j
public class LoggerTest {
@Test
public void test1(){
String name = "abc";
String password = "123456";
log.debug("debug...");
log.info("name: {}, password: {}", name, password);//占位符写法
log.error("error...");
log.warn("warn...");
}
}
其中,注解@Slf4j要引入maven包:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
以上为日志的门面,其决定所输出的日志。下面将关于日志的实现,就是如何选择日志打印到文件或者控制台中。
有关Logback的配置,有两种方式:
(1)在配置文件application中设置
(2)在logback-spring.xml中设置
这两种方式,第一种通常可修改的地方较少,比较简单;第二种可定制的地方较多,我们分别讨论。
在日志的通常要求上,一般应该满足:至少要区分info和error日志,然后至少保证每天可以产生一个日志文件这两个方面。
首先来看第一种,我们选用application.properties文件设置日志:
logging.pattern.console=%d - %msg%n //设置控制台日志打印的格式
logging.file=E:/test.log //设置日志存放的文件路径及文件名,可代替logging.path
logging.level.com.demo.rizhi.LoggerTest=debug //level后面是我的包名,此段代码是设置LoggerTest类日志的打印级别
如果想设置全部类的日志打印级别,可用
logging.pattern.level=debug
日志设置路径也可以采用不带文件名的形式,那这时日志会自己采用默认值,spring.log
logging.path=E:/
这里提到了一个日志级别的概念,我们稍后讲。
以上是第一种日志实现方式,可供选择的参数较少,一般来说更常用的是第二种方式。现在我们来讲第二种方式。
第二种方式是在resource文件夹下建立一个文件logback-spring.xml。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">//设置控制台日志的格式
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">//设置文件info日志的格式
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level> //设置过滤器,ERROR级别及以上
<onMatch>DENY</onMatch> //如果匹配ERROR则否定
<onMismatch>ACCEPT</onMismatch> //如果不匹配则接收
</filter>
<encoder>
<pattern> //设置输出格式
%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>E:/springbootweixinrizhi/sell/info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">//设置文件ERROR日志的格式
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> //过滤器,打印ERROR级别以上的日志
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>E:/springbootweixinrizhi/sell/error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<root level="info"> //用到root下面,表示整个项目都适用,设置info级别
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
</root>
</configuration>
在这里,我们讲一下日志的级别,在org.slf4j.event下,可以找到日志的级别分别有五个:
ERROR、WARN、INFO、DEBUG、TRACE。其优先级分别为40,30,20,10,0.
在第一种日志配置方式中,无论是设置具体类的日志打印级别,还是全部类的日志打印级别,后面跟的参数都是代表所打印日志的最低级别,上文用例是debug,也就是打印除TRACE外的日志都会打印在控制台上。
第二种日志配置方式则分为了两种:
(1)第一个ERROR日志打印方式,设置了level,是表示打印ERROR及其以上级别的日志,也就只有ERROR自己,符合只打印ERROR的日志要求
(2)第二个INFO日志的打印方式,设置了ERROR过滤器,如果匹配则不打印,不匹配则打印。
在INFO日志的打印方式中我们还看到了匹配指令有DENY、ACCEPT,实际上还有一个NEUTRAL。表示中立,即会先忽略其所在规则,然后往下走看是否被以下的规则所命中。
由以上两种日志搭建方式可见,第一种方式局限性较大,第二种可以满足ERROR和INFO分别按天数打印的特点。因此第二种方式更常用一些。因此推荐使用第二种方式。