Logback介绍及使用

摘要:Logger 作为日志的记录器,把它关联到应用的对应的 context 上后,主要用于存放日志对象,也可以定义日志类型、级别。

Logback简介

Logback 是由log4j创始人设计的又一个开源日志组件。

logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现 SLF4J API 使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。 Logback是要与SLF4J结合起来用两个组件的官方网站如下:

logback的官方网站: http://logback.qos.ch

SLF4J的官方网站: http://www.slf4j.org

本文章用到的组件如下:

     logback-access-1.0.0.jar

    logback-classic-1.0.0.jar

    logback-core-1.0.0.jar

    slf4j-api-1.6.0.jar

使用Maven获取类库组件,则依赖如下:

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>

这样依赖包全部自动下载了!


logback 的优点

参考文章《从Log4j迁移到LogBack的理由


Logback的配置介绍


1、Logger、appender及layout

Logger 作为日志的记录器,把它关联到应用的对应的 context 上后,主要用于存放日志对象,也可以定义日志类型、级别。

Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、 Oracle和其他数据库、JMS和远程UNIX Syslog守护进程等。

Layout 负责把事件转换成字符串,格式化的日志信息的输出。


2、logger context

各个 logger  都被关联到一个  LoggerContext LoggerContext 负责制造 logger ,也负责以树结构排列各  logger 。其他所有 logger 也通过 org.slf4j.LoggerFactory  类的静态方法 getLogger 取得。  getLogger 方法以  logger  名称为参数。用同一名字调用 LoggerFactory.getLogger  方法所得到的永远都是同一个 logger 对象的引用。


3、有效级别及级别的继承

Logger  可以被分配级别。级别包括: TRACE DEBUG INFO WARN   ERROR ,定义于  ch.qos.logback.classic.Level 类。如果 logger 没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。 root logger  默认级别是  DEBUG


4、打印方法与基本的选择规则

打印方法决定记录请求的级别。例如,如果  L  是一个  logger  实例,那么,语句  L.info("..") 是一条级别为  INFO  的记录语句。记录请求的级别在高于或等于其  logger  的有效级别时被称为被启用,否则,称为被禁用。 记录请求级别为  p ,其  logger 的有效级别为  q ,只有则当 p>=q 时,该请求才会被执行。

该规则是  logback  的核心。级别排序为:  TRACE < DEBUG < INFO < WARN < ERROR 。 


Logback的默认配置

如果配置文件 logback-test.xml和 logback.xml都不存在,那么logback默认地会调用 BasicConfigurator,创建一个最小化配置。最小化配置由一个关联到根logger的ConsoleAppender 组成。输出用模式为 %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder进行格式化。 root logger  默认级别是  DEBUG


1、Logback的配置文件

Logback  配置文件的语法非常灵活。正因为灵活,所以无法用  DTD   XML schema  进行定义。尽管如此,可以这样描述配置文件的基本结构:以 <configuration> 开头,后面有零个或多个 <appender> 元素,有零个或多个 <logger> 元素,有最多一个 <root> 元素。


2、Logback默认配置的步骤

  (1).  尝试在  classpath  下查找文件  logback-test.xml

  (2).  如果文件不存在,则查找文件  logback.xml

  (3).  如果两个文件都不存在, logback   BasicConfigurator  自动对自己进行配置,这会导致记录输出到控制台。

3、Logback.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="layout_pattern" value="[%level]%date, 
                  [%thread]%file:%line, %msg%n"/>
    <appender name="alllog" 
                class="ch.qos.logback.core.rolling.RollingFileAppender">
        <Append>true</Append>
        <Encoding>UTF-8</Encoding>
        <File>/data/log/sea.log</File>
        <rollingPolicy 
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/data/log/sea.log.%d{yyyy-MM-dd-HH}
        </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${layout_pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>
    <appender name="errorlog"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <Append>true</Append>
        <Encoding>UTF-8</Encoding>
        <File>/data/log/sea_error.log</File>
        <rollingPolicy 
           class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/data/log/sea_error.log.%d{yyyy-MM-dd}
        </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${layout_pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>
    <appender name="warnlog" 
                 class="ch.qos.logback.core.rolling.RollingFileAppender">
        <Append>true</Append>
        <Encoding>UTF-8</Encoding>
        <File>/data/log/sea_warn.log</File>
        <rollingPolicy 
             class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/data/log/sea_warn.log.%d{yyyy-MM-dd}
        </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${layout_pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <Encoding>UTF-8</Encoding>
        <encoder>
            <pattern>${layout_pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <root level="INFO">
        <appender-ref ref="alllog"/>
        <appender-ref ref="errorlog"/>
        <appender-ref ref="warnlog"/>
        <appender-ref ref="stdout"/>
    </root>
</configuration>


Logback例子

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

public class SeaTest {
    private final static Logger logger = LoggerFactory.
                                getLogger(SeaTest.class);

    public static void main(String[] args) throws Exception {
        logger.info("Test logback, name is {}, age is {}", "SeaTest", 20);
        logger.warn("Test logback, fail!!!");
    }
}


输出的结果是:

Test logback, name is SeaTest, age is 20
Test logback, fail!!!


注意上面代码中使用的是SLF4J作为日志的接口,而不是Logback。为什么要使用SLF4J而不是Log4J呢?请参考文章《为什么要使用SLF4J而不是Log4J

版权说明:如无特殊说明,文章均为本站原创,如需转载请注明出处

本文标题:Logback介绍及使用

本文地址:http://www.wolfbe.com/detail/201609/354.html

本文标签: logback log4j slf4j

感谢您的支持,朗度云将继续前行

扫码打赏,金额随意

温馨提醒:打赏一旦完成,金额无法退还,请谨慎操作!

扫二维码 我要反馈 回到顶部