一.什么是日志框架

  • 一套能实现日志输出的工具包
  • 能够描述系统运行状态的所有时间都可以算作日志
  • 如记录用户下线、接口超时、数据库崩溃等

二.日志框架的能力

  • 定制输出目标
  • 定制输出格式
  • 携带上下文信息
  • 运行时选择性输出
  • 灵活的配置
  • 优异的性能

三.常见日志框架

  • 日志框架与日志实现

  • 日志门面是日志实现的抽象层,这样一来日志实现层进行代码的改动,不影响用户使用日志时调用的接口

    日志门面 日志实现
    JCL Log4j
    SLF4j Log4j2
    jboss-logging Logback
    JUL

    实际开发中,使用一个抽象层日志门面+日志实现,SpringBoot中默认选择的搭配是:SLF4j+Logback

四.常规日志的使用(SpringBoot为例)

  • 普通方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @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...");
    }
    }
  • 简便方式

    1
    2
    3
    4
    5
    <!--添加日志工具依赖-->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </dependency>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Slf4j
    public class LoggerTest {

    //private final Logger logger = LoggerFactory.getLogger(LoggerTest.class); //一定要写当前的类

    @Test
    public void test1(){
    log.debug("debug...");
    log.info("info...");
    log.error("error...");
    }
    }
    //注意:若添加lombok依赖且加入Slf4j注解后无法识别log方法,在idea中Settings中设置Plugins,在Marketplace中搜lombok插件并安装即可

  • 日志中输出变量

    1
    2
    3
    4
    5
    String name = "张同学";
    String password = "515Club";
    log.info("name:{}, password:{}",name,password);
    //注意:{}中不要带空格

  • 常用日志级别

    级别由高到低 描述
    ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
    WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
    INFO 打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
    DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
    TRACE 很低的日志级别,一般不使用

    注:在一般程序开发中,通常区分并打印ERROR与INFO两个级别的日志

五.Logback的配置

  • 第一种方式——application.yml中配置

    1
    2
    3
    4
    5
    6
    logging:
    pattern:
    console: "%d = %msg%n"
    # path: var/log/tomcat/ 配置文件路径
    file: var/log/tomcat/sell.log
    level: debug
  • 第二种方式——在logback-spring.xml中配置(推荐)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?xml version="1.0" encoding="UTF-8" ?>

    <configuration>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
    <!--配置日志输出格式 %d为日期,%msg为日志信息,%n为换行-->
    <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">
    <!--过滤高级别日志,有DENY/NEUTRAL/ACCEPT三种过滤机制-->
    <level>ERROR</level>
    <onMatch>DENY</onMatch> <!--匹配该level进行的操作-->
    <onMismatch>ACCEPT</onMisMatch> <!--不匹配该level进行的操作-->
    </filter>
    <encoder>
    <pattern>
    %msg%n
    </pattern>
    </encoder>
    <!--滚动策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!--路径-->
    <fileNamePattern>var/log/tomcat/sell/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>var/log/tomcat/sell/error.%d.log</fileNamePattern>
    </rollingPolicy>
    </appender>

    <root level="info">
    <appender-ref ref="consoleLog" />
    <appender-ref ref="fileInfoLog"/>
    <appender-ref ref="fileErrorLog"/>
    </root>
    </configuration>

    注意:此文件配置时没有人性化提示,务必检查标签拼写问题!