slf4j-logback

上一篇文章讲了log4j的使用,作为log4j的新一代产品logback 无疑在将来有着更大的市场和应用。
log4j:[url]http://wangxinchun.iteye.com/blog/2094046[/url]

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的优势:
1、功能更强大,更全面,更灵活。(这是迁移到logback的根本原因)
2、较好的性能。(据说了,没有测试过)

Logback默认的读取步骤:
(1). 尝试在 classpath 下查找文件 logback-test.xml;
(2). 如果文件不存在,则查找文件 logback.xml;
(3). 如果两个文件都不存在,logback 用 Bas icConfigurator 自动对自己进行配置,这会导致记录输出到控制台。

logback 是基于xml 配置的,没有官方的schema。
最外层的标签是:configuration 其,但是其默认对应的xml schema 图如下:
[img]http://dl2.iteye.com/upload/attachment/0099/4045/71b59019-0c76-30d5-895c-ff19d68d4ffc.png[/img]

如上图所示,configuration 最重要的配置标签有:appender,logger,root

[b]logger [/b]:代表一个日志记录的规则。它指定哪些名字(有继承规则)的log,输出哪些level的日志,以及输出的最终appender。
name: 是必须的属性,一般是包名,类名通过.连接组成的一个字符串。
level :可选的属性,如果没有设置自然继承父包的level属性,以此类推到root的level。
additivity:可选的属性,默认设置为true,如果设置为false,那么log仅仅输出到logger的appender-ref,不再输出的父logger的appender-ref,当然root的appender-ref也不会输出的。

logger 和 level的 继承关系如下:
[img]http://dl2.iteye.com/upload/attachment/0099/4787/03878b01-8ef7-3dd4-a812-1252a0397c67.jpg[/img]
logger 和 additivity 的关系如下:
[img]http://dl2.iteye.com/upload/attachment/0099/4358/0c1183e7-de88-32e4-a29f-a4604b2c47d1.jpg[/img]

eg:

logger.debug("hello {} ", "world");
logger.info("hello {} ", "world");
logger.warn("hello {} ", "world");
logger.error("hello {} ", "world");


<logger name="com.qunar.logback.LogbackTest" additivity="false" level="ERROR">
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>


输出:
1、additivity = false : 只有FILE输出了ERROR级别的日志。STDOUT没有输出。
2、additivity = true:FILE 和STDOUT 都有ERROR日志的输出。
另外注意:com.qunar.logback.LogbackTest对应的logger的 level 设置为debug,而root对应的level为INFO,但是文件输出中有debug。那么说明 [b]logger的level覆盖了root 的level设置[/b]。

[b]root[/b]:代表一个root logger,它的含义本质依然是一个logger,只是比较特殊所以单独设置一个root标签,这样root logger 也就不需要普通logger所需要的name属性,root有且仅有一个level属性,默认是debug,它不支持其他的任何属性。不过root 可以拥有0或在n个<appender-ref> 元素。

[b]appender[/b]:含义为输出的媒介,比如命令行,文件或在数据库等等。英文为:an output destination is called an appender appenders exist for the console, files, remote socket servers, to MySQL, PostgreSQL, Oracle and other databases, JMS, and remote UNIX Syslog daemons.

规则1、一个logger请求(debug,info,error),会输出到logger关联的所有的appender,当然logger的父logger也会输出。
eg:

import org.slf4j.LoggerFactory;

public class LogbackTest2 {
public static final Logger x = LoggerFactory.getLogger("a.x");
public static final Logger y = LoggerFactory.getLogger("a.y");
@Test
public void testLogback() {
x.info("hello {} ", "world");
y.info("hello {} ", "world");
}
}


logback.xml

<logger name="a" additivity="false" level="info">
<appender-ref ref="FILE" />
</logger>

输出:
2014-07-22 21:00:19,835 INFO [main] a.x [LogbackTest2.java:14] hello world
2014-07-22 21:00:19,842 INFO [main] a.y [LogbackTest2.java:15] hello world

上面这个例子说明了:x 和 y 是 a 的子log。所以x 和 y的请求都在 a对应的appender 中输出了。

规则2:

appender的配置相对复杂,相应的配置也是重点和难点。
appender对于的schema 如下:
[img]http://dl2.iteye.com/upload/attachment/0099/4047/e4f9ec8b-3808-3788-af69-644a33b1fa1d.png[/img]

maven 引入 logback 和slf4j

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

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



案例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<contextName>myAppName</contextName>
<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} %contextName [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
</pattern>
</encoder>
</appender>

<logger name="com.qunar.logback.LogbackTest" level="DEBUG" />
<logger name="com.qunar.logback.LogbackTest2" additivity="false">
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>


其他:
1、设置全局属性。其他地方可以直接使用%name
<contextName>myAppName</contextName>
eg:
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
2、timestamp 标签时间戳。
<timestamp key="byHH" datePattern="yyyy-MM-dd-HH"/>
比如要根据每个小时生成一个日志文件的需求:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>log-${byHH}.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
</pattern>
</encoder>
</appender>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值