`

slf4j-logback

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

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 图如下:


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

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

logger 和 level的 继承关系如下:

logger 和 additivity 的关系如下:


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。那么说明 logger的level覆盖了root 的level设置

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

appender:含义为输出的媒介,比如命令行,文件或在数据库等等。英文为: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 如下:


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>



  • 大小: 2.9 KB
  • 大小: 4.4 KB
  • 大小: 308.9 KB
  • 大小: 69.7 KB
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics