使用 Logback 记录日志

Logback 和 Log4j 是同一个人开发的,Logback 比 Log4j 的功能更强大,效率更高,但配置几乎一样。

1. 在 pom.xml 中添加 Logback 的依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.2</version>
</dependency>

2. 把 logback.xml 放到 resources 目录里

当系统发现在 classpath 里有 Logback 的 jar 包,就会自动的在 classpath 下查找 logback.xml 文件,如果找到就使用它来配置 Logback,如果没找到就使用默认的 Logback 配置。
(resources 目录里的文件会被自动的复制到 classes 目录,即 classpath 环境下)

<?xml version="1.0"?>
<configuration>
    <property name="log.base" value="logs" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%F-%M:%L] - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.base}/log.txt</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.base}/log.%d{yyyyMMdd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%F-%M:%L] - %msg%n</pattern>
        </encoder>
    </appender>

    <root>
        <appender-ref ref="STDOUT" />
        <appender-ref ref="file" />
    </root>

    <logger name="org.mybatis" level="off"/>
    <logger name="org.springframework" level="debug"/>
</configuration>

3. 使用 logback 输出信息

通过前面 2 步,logback 就配置好了,接下来就可以在代码里像下面这么使用 logback。

package controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloWorldController {
    // 1. 创建 logger 对象
    private static Logger logger = LoggerFactory.getLogger(HelloWorldController.class.getName());

    @RequestMapping("/logback")
    @ResponseBody
    public String logback() {
        // 2. 和 log4j 一样使用
        logger.debug("No params");

        // 3. 可以使用 {} 的方式传入参数
        logger.debug("With params: time: {}, name: {}", System.nanoTime(), "Bingo");

        return "Test logback";
    }
}

输出

[2015-04-06 09:08:37] [DEBUG] [HelloWorldController.java-logback:19] - No params
[2015-04-06 09:08:37] [DEBUG] [HelloWorldController.java-logback:22] - With params: time: 88085263980523, name: Bingo

同时在项目的目录下有 logs/log.txt 文件生成(关注选中的文件,其他的文件可以忽略)

4. 使用 Logback 输出 Spring 的日志

由于历史原因,Spring 的日志使用的是 JCL,而现在 SLF4J 更流行,Logback 也是在 SLF4J 的基础上输出的,为了把 JCL 的日志桥接到 SLF4J,即使用 Logback 输出,只需要把下面的依赖添加到 pom.xml 即可,这样 Spring 的日志会自动的使用 Logback 输出。

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.7</version>
</dependency>

参考文档http://unmi.cc/jcl-over-slf4j-slf4j/

Logback 的日志级别:

  1. ALL: 是最低等级的,用于打开所有日志记录。
  2. DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的。
  3. INFO: 表明消息在粗粒度级别上突出强调应用程序的运行过程。
  4. WARN: 表明会出现潜在错误的情形。
  5. ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行。
  6. FATAL: 指出每个严重的错误事件将会导致应用程序的退出。
  7. OFF: 是最高等级的,用于关闭所有日志记录。

优先级

优先级从低到高分别是 ALL、DEBUG、INFO、WARN、ERROR、FATAL、OFF

通过定义级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了 INFO 级别,则应用程序中所有 DEBUG 级别的日志信息将不被打印出来。程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。如果设置级别为 INFO,则优先级高于等于 INFO 级别(如:INFO、 WARN、ERROR, FATAL)的日志信息将可以被输出,小于该级别的如 DEBUG 将不会被输出。

过滤器

Logback 还支持过滤器,例如将过滤器的日志级别配置为 ERROR,所有 ERROR 级别的日志交给 appender 处理,非 ERROR 级别的日志,被过滤掉。过滤器被添加到 appender 中,为 appender 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。appender 有多个过滤器时,按照配置顺序执行。通过 appender 中的 filter 来严格限制日志的输出级别:

<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>ERROR</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>

精确控制日志的应用范围

在程序调试中,经常出现的情况是:错误只在某一个或者几个类或者包里,所以只需要打开这几个类或者包里的 DEBUG 级别的 log。在以前的项目,使用 Spring 和 Hibernate 时,一旦打开 DEBUG 级别的 log,程序本身的 debug 信息就会被 Spring 和 Hibernate 的大量日志淹没,大大降低了调试的效率。而 logback 让这一切变的简单起来了:

<logger name="org" level="ERROR" />

这一行就将org包下面的所有日志级别设为了ERROR,不会再打扰我们的 DEBUG。

参考文档:

http://blog.csdn.net/mydeman/article/details/6716925
http://www.360doc.com/content/12/0321/13/203871_196275021.shtml