2018-12-12 · Develop

Java 日志框架 - logback

简介

Logback 分为一下三个模块:

logback 需要和 slf4j 联合使用,本文主要讲下 logback 的配置,暂不介绍 slf4j 的相关信息。

使用

引入依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

使用

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Controller
public class IndexController {

    private static final Logger log = LoggerFactory.getLogger(IndexController.class);

    @RequestMapping("/")
    @ResponseBody
    public String index() {
        for (String key : System.getProperties().stringPropertyNames()) {
            log.info("{} -> {}", key, System.getProperty(key));
        }
        return "SUCCESS";
    }
}

后面的就剩下日志配置了。

配置详解

其实 log 的配置无非都是分成 logger, appender 和 layout 三部分。和其他的日志的配置没有啥大的区别。 logback 寻找配置的顺序 logback-text.xml -> logback.xml -> BasicConfigurator.java

下面先看个简单的配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

configuration

<configuration> 根节点,其有几个参数:

appender

appender 接口有很多的实现,常用的有下面几个

控制台输出

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

其中 encoder 对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。
PatternLayoutEncoder 是唯一的 encoder。 关于 pettern 中的各种占位符,如 %d{HH:mm:ss} 的具体用法可以参考 这篇文档。 其实在 ch.qos.logback.classic.PatternLayout 类里面也能看见各种占位符及其解析的实现。当然我们也可以自定义一些占位符,这个留待后面再讲。

文件输出

ch.qos.logback.core.FileAppender 这个并不常用,一般使用可以进行文件切割功能的 ch.qos.logback.core.rolling.RollingFileAppender。 根据不同的回滚文件功能,可以制作不同的日志文件配置。

1. TimeBasedRollingPolicy 是最常用的滚动策略,通过时间来控制。

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
        </rollingPolicy>
    </appender>
</included>

TimeBasedRollingPolicy 是既负责滚动也负责出发滚动。几个总要属性

2. SizeAndTimeBasedRollingPolicy

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d [%thread] %-5level %logger{18} - %msg%n</pattern>
        </encoder>
        <file>${catalina.home}/logs/%d{yyyy-MM}/${hostName:-localhost}-debug.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${catalina.home}/logs/${hostName:-localhost}-debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
        </rollingPolicy>
    </appender>

上面的配置不但每日滚动,当文件大于 10M 的时候也进行滚动。

3. FixedWindowRollingPolicy 根据固定窗口算法重命名文件的滚动策略。

其他的 Appender

除了文件和控制台外,还有很多的 Appender,但是并不常用,比如:SocketAppender、SMTPAppender、DBAppender、SyslogAppender 等。如果需要用到的话,就直接阅读 文档

Logger

    <!---->
    <!-- myibatis log configure -->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

用来设置某一个包或具体的某一个类的日志打印级别。特别说明 root 是根 logger 是 logger 的父类。

变量替换

<property name="LOG_PATH" value="D:/"/>

使用

<file>${LOG_PATH}</file>

当然可以设置个默认值

<file>${LOG_PATH:-D:/}</file>