日志:描述系统运行状态的所有信息都是日志.
日志能力:
1.定制输出目标.
2.定制输出格式.
3.携带上下文信息
4.运行时选择输出.
5.灵活的配置
日志选择:
日志门面:JCL(和Logback不是一个作者) SLF4j(作者相同) jboos-logging(非面向大众)
日志实现:Log4j(作者自己说太烂了) Log4j2(太过复杂,性能最优,但是基本上不会用到) Logback(Log4j的第二代) JUL(太过简陋)
显然我们可以应该选择:SLF4j+Logback.
如何使用:
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;
/**
* Created by kkm on 2019/12/3.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class LoggerTest {
private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
@Test
public void test1(){
logger.debug("debug...");
logger.info("info...");
logger.error("error...");
}
}
View Code
右键运行test1,可以在控制台看到输出.
可以看到debug没有输出,因为info等级比他高,如果下面有info要输出,那么debug不会输出.
window系统下面可以使用按键 ctrl+shift+alt+N,呼出类查找框 然后输入 Level 到slf4j中查找就可以看到各种级别的日志.
logger是LoggerFactory的实例化,这个地方应该填对应类名.
可以看到现在输出就是当前类名,如果你改成其他类那么,这个输出也会改变.
有的小伙伴说这样我每次写都要写个这个的实例化,太麻烦了,其实如果你懂控制反转的话,这一句是可以省略的,使用插件lombok,就可以使用注解省略这一句话,但是这样就是另外一个坑了.
如果有插件lombok,那么只需要这样写
package com.ccpuc;
import lombok.extern.slf4j.Slf4j;
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;
/**
* Created by kkm on 2019/12/8.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
@Test
public void test1(){
log.debug("debug...");
log.info("info...");
log.error("error...");
}
}
View Code
可以看到结果一样的
2019-12-08 21:06:46.738 INFO 7384 --- [ main] com.ccpuc.LoggerTest : info...
2019-12-08 21:06:46.738 ERROR 7384 --- [ main] com.ccpuc.LoggerTest : error...
View Code
除了可以使用字符串拼接,log还支持格式化输出.
log.info("name:{},,,id:{}","第一个大括号","第二个大括号");
输出:2019-12-08 21:10:53.209 INFO 13036 --- [ main] com.ccpuc.LoggerTest : name:第一个大括号,,,id:第二个大括号
View Code
以上都是在控制台输出,logback还支持文件输出.
logback的配置方法,可以通过applicatin.yml文件配置.
logging.pattern.console : 输出到控制台的格式.(顺带一提,yml的注释使用#)
logging.config : 配置文件路径
logging.path : 输出的日志文件路径(这个会使用默认的spring作为文件名称)
logging.file : 输出的日志文件路径(这个可以指定)
logging.level : 指定输出日志的级别,level还可以指定到包指定到类.
logging:
pattern:
# console: "%d - %msg%n"
# path: C:\Users\kkm\Desktop\actual\dsell_test\log
# file: C:\Users\kkm\Desktop\actual\dsell_test\log\dsell
# level:
# com.ccpuc.LoggerTest : debug
去掉#既可以生效.
记得要注释掉上面的然后再用logback-spring.xml来配置.
还可以通过logback-spring.xml来配置,上面的application.yml的配置比较简单.往往需要使用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">
<!--根据等级过滤-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--要过滤除INFO等级以外的,如果onMatch,就ACCEPT,就是接收日志,反之DENY,就是过滤不要-->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<!--日志格式-->
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略,基于时间-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--输出文件-->
<fileNamePattern>
C:\Users\kkm\Desktop\actual\dsell_test\log\info\info.%d.log
</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--根据等级范围过滤,就是过滤掉选择等级低的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<!--日志格式-->
<pattern>
%msg%n
</pattern>
</encoder>
<!--滚动策略,基于时间-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--输出文件-->
<fileNamePattern>
C:\Users\kkm\Desktop\actual\dsell_test\log\error\error.%d.log
</fileNamePattern>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="consoleLog" />
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
</root>
</configuration>
View Code