初探 logback
您目前处于:技术核心竞争力  2016-08-03

一、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 来访问日志的功能。

二、maven 依赖

<!-- logback+slf4j -->  
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>slf4j-api</artifactId>  
    <version>1.7.12</version>
</dependency>  
<dependency>  
    <groupId>ch.qos.logback</groupId>  
    <artifactId>logback-core</artifactId>  
    <version>1.1.3</version>  
</dependency>  
<dependency>  
    <groupId>ch.qos.logback</groupId>  
    <artifactId>logback-classic</artifactId>  
    <version>1.1.3</version>
</dependency>

三、配置和使用

1. 日志使用

我们使用 org.slf4j.LoggerFactory,就可以直接使用日志了。

protected final Logger logger = LoggerFactory.getLogger(this.getClass());

2. 在控制台输出特定级别的日志

logback 的配置文件都放在 /src/main/resource/ 文件夹下的 logback.xml 文件中。其中 logback.xml 文件就是 logback 的配置文件。只要将这个文件放置好了之后,系统会自动找到这个配置文件。

下面的配置中,我们输出特定的 ERROR 级别的日志:

<?xml version="1.0"?>  
<configuration>  
    <!-- ch.qos.logback.core.ConsoleAppender 控制台输出 -->  
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern>  
        </encoder>  
    </appender>  
    <!-- 日志级别 -->  
    <root>  
        <level value="error" />  
        <appender-ref ref="console" />  
    </root>  
</configuration>

结果只在控制台输出 ERROR 级别的日志。

3. 设置输出多个级别的日志

<?xml version="1.0"?>  
<configuration>  
    <!-- ch.qos.logback.core.ConsoleAppender 控制台输出 -->  
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern>  
        </encoder>  
    </appender>    
    <!-- 日志级别 -->  
    <root>  
        <level value="error" />  
        <level value="info" />  
        <appender-ref ref="console" />  
    </root>    
</configuration>

设置两个 level,则可以输出 ERROR 和 INFO 级别的日志了。

4. 设置文件日志

<?xml version="1.0"?>  
<configuration>  
    <!-- ch.qos.logback.core.ConsoleAppender 控制台输出 -->  
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n  
            </pattern>  
        </encoder>  
    </appender>    
    <!-- ch.qos.logback.core.rolling.RollingFileAppender 文件日志输出 -->  
    <appender name="file"  
        class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <Encoding>UTF-8</Encoding>  
        <File>/home/test.log</File>  
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <FileNamePattern>/home/test-%d{yyyy-MM-dd}.log  
            </FileNamePattern>  
            <MaxHistory>10</MaxHistory>  
            <TimeBasedFileNamingAndTriggeringPolicy  
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
                <MaxFileSize>5MB</MaxFileSize>  
            </TimeBasedFileNamingAndTriggeringPolicy>  
        </rollingPolicy>  
        <layout class="ch.qos.logback.classic.PatternLayout">  
            <pattern>[%-5level] %d{HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n  
            </pattern>  
        </layout>  
    </appender>    
    <!-- 日志级别 -->  
    <root>  
        <!-- 定义了ERROR和INFO级别的日志,分别在FILE文件和控制台输出 -->  
        <level value="error" />  
        <level value="info" />  
        <appender-ref ref="file" />   
        <appender-ref ref="console" />  
    </root>  
</configuration>

四、logback 配置详解

1. 根节点 configuration 包含的属性

<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration>

scan:当此属性设置为 true 时,配置文件如果发生改变,将会被重新加载,默认值为 true。

scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔为1分钟。

debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false。

2. 根节点 configuration 的子节点

(1) 设置上下文名称:contextName

每个 logger 都关联到 logger 上下文,默认上下文名称为 default。但可以使用 contextName 设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <contextName>myAppName</contextName>  
      <!-- 其他配置省略-->  
</configuration>

(2) 设置变量:property

用来定义变量值的标签,property 有两个属性,name 和 value;其中 name 的值是变量的名称,value 的值是变量定义的值。通过 property 定义的值会被插入到 logger 上下文中。定义变量后,可以使 ${} 来使用变量。

例如使用 property 定义上下文名称,然后在 contentName 设置 logger 上下文时使用。

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <property name="APP_Name" value="myAppName" />   
      <contextName>${APP_Name}</contextName>  
      <!-- 其他配置省略-->  
</configuration>

(3) 获取时间戳字符串:timestamp

两个属性 key:标识此 timestamp 的名字;datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循 java.txt.SimpleDateFormat的格式。

例如将解析配置文件的时间作为上下文名称:

<configuration scan="true" scanPeriod="60 seconds" debug="false">  
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>   
      <contextName>${bySecond}</contextName>  
      <!-- 其他配置省略-->  
</configuration>

(4) 设置loger

- loger

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定 appender。loger 仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。

name:

用来指定受此 loger 约束的某一个包或者具体的某一个类。

level:

用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值 INHERITED 或者同义词 NULL,代表强制执行上级的级别。

如果未设置此属性,那么当前 loger 将会继承上级的级别。

addtivity:

是否向上级 loger 传递打印信息。默认是 true。

loger 可以包含零个或多个 appender-ref 元素,标识这个 appender 将会添加到这个 loger。

- root

也是 loger 元素,但是它是根 loger。只有一个 level 属性,应为已经被命名为 root。

level:

用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为 INHERITED 或者同义词 NULL。

默认是 DEBUG。

root 可以包含零个或多个 appender-ref 元素,标识这个 appender 将会添加到这个 loger。

五、替换 log4j

首先工程里不能有 log4j 的 maven 以来,其次用 logback 的包替换 log4j 的包。

<!-- logback -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.3</version>
</dependency>
<!-- logback + slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.13</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.13</version>
</dependency>
<!-- logback + log4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.13</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.13</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.13</version>
</dependency>



转载请并标注: “本文转载自 linkedkeeper.com ”  ©著作权归作者所有