logback的产生是作为著名的日志框架log4j项目的一个继承者。它的设计者正是log4j的创造者Ceki Gülcü。logback在很大幅度上比现有的日志系统拥有更快的速度和更小的体积。logback也提供了独特和一些有用的特性,譬如标记、参数化的日志语句、有条件的堆栈跟踪和强大的事件过滤机制。这些只是运用logback提供的特性的一些例子。对于它自己的错误报表,logback依赖于状态对象,这样很大程度上促进了故障的排除。你可能更希望在日志之外依赖于状态对象。logback的核心绑定joran,一个强大和通用的配置系统,能在你自己的项目中起到很大的影响。
logback-classic-1.0.0.jar
logback-core-1.0.0.jar
slf4j-api-1.6.4.jar
logback jar下载地址:http://logback.qos.ch
slf4j jar下载地址:http://www.slf4j.org/
logback可以有以下三种配置文件:
Ø logback.groovy
Ø logback-test.xml
Ø logback.xml
logback加载时也是按以上顺序进行加载的。
可以在代码中添加以下语句查看logback内部状态:
LoggerContextlc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
如果你没有配置文件,会在控制台上输出以下语句:
11:19:06,828|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource[logback.groovy]
11:19:06,828|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT findresource [logback-test.xml]
11:19:06,828|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT findresource [logback.xml]
11:19:06,828|-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up defaultconfiguration.
Loggerlogger = LoggerFactory.getLogger(“loggerOne”); //获取logger对象实例
logger.debug("Hellologback debug."); //logger对象以debug级别输出调试语句
以上代码语句就生成了一个logger实例,命名为”loggerOne”,也就是说“loggerOne”就是这个logger的名称。
如果在代码中添加如下语句:
Logger logger1 =LoggerFactory.getLogger(“loggerOne”);
Logger logger2 =LoggerFactory.getLogger(“loggerOne”);
则代表logger1和logger2是两个相同的对象实例。所以在logback中只要logger的名称相同,那就代表是相同的对象实例。
logger的命名是大小写敏感的,logger的命名一般都是取“类名.class”,这样命名在日志输出中也可看出其来源。
代码:
Logger logger =LoggerFactory.getLogger(LogBackAction.class);
logger.debug("Hello logbackdebug.");
控制台输出:
11:57:07.375["http-apr-8080"-exec-8] DEBUG app.action.LogBackAction - Hello logbackdebug.
就可以看出其具体来源于哪个类
logger命名层次:
如果logger名称带上点号后是另一个logger的名称的前缀,则前者就被称为后者的祖先,如果logger与其后者logger之间没有其他祖先,则称前者为父logger,后者为子logger,相当于java中子类跟父类的概念。
例如:
app.action //父logger
app.action.logbackaction //子logger
logback中一共有5种有效级别,分别是TRACE、DEBUG、INFO、WARN、ERROR,优先级依次从低到高,logger之间的级别也有继承关系,但这里就不阐述了。
logback的配置文件还是非常简单,它的根节点是
图(1)
如下代码所示是一个最简单的配置:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
以上配置中定义了一个appender和一个root,appender可以理解为logback输出的目的地,root节点是根logger的意思,这里定义了根logger的输出就是控制台。
pattern节点中定义的是输出的模式规则:
%d{HH:mm:ss.SSS}:当前时间
[%thread]:线程名
%-5level:logger定义的级别
%logger{36}:logger名称
-%msg%n:定义的输出
如下代码:
Loggerlogger = LoggerFactory.getLogger(LogBackAction.class);
logger.debug("Hellologback debug.");
输出:
13:13:51.625["http-apr-8080"-exec-6] DEBUG app.action.LogBackAction - Hellologback debug.
logback日志级别一共有5种,可以通过配置文件输出指定级别的日志信息。
在以上配置文件中添加如下代码:
表示命名为“app.action.LogBackAction”的logger只输出info级别的日志信息。
appender可以包含0过或多个layout节点,0个或多个encoder节点,0个或多个filter节点,如下图所示:
图(2)
输出到文件的appender,配置如下:
myApp.log
%d{yyyy-MM-dd HH:mm:ss} -%msg%n
如上配置后日志信息将写入到myApp.log文件中,默认情况下logback会将日志信息追加到日志文件中,如果在appender中加入
logback配置文件中还可以设置时间戳,这样的话就可以将日志信息输出到日期的指定文件中,如下配置:
appender配置如下:
myApp_${byDay}.log
%d{yyyy-MM-dd HH:mm:ss} -%msg%n
以上配置日志信息就会写入一个“myApp”+ “yyyy-MM-dd”的文件中.
以上appender中使用到的类是FileAppdener,也就是基本的文件输出,logback中还有RollingFileAppender继承FileAppender,能够滚动记录文件。也就是当符合某个条件时,可以将日志信息记录到其他日志文件中。如果想用RollingFileAppender则需要配置RollingPolicy和TriggerPolicy,分别表示滚动策略和触发策略。
示例如下:
test.log
test.%i.log
1
3
5MB
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
以上代码配置了RollingFileAppender,rollingPolicy定义为FixedWindwoRollingPolicy,这个滚动策略表示当满足了一定的触发策略后,logback会将日志信息写入到其他的日志文件中。配置了FixedWindowRollingPolicy后需要配置以下节点信息:
假设生成三个日志归档文件,test.1.log、test.2.log、test.3.log,则test.1.log文件代表最先写入的那个文件,当三个文件都写满后会先删除test.3.log文件,依次循环。
logback中还有基于时间的rollingPolicy,配置如下:
true
logFile.%d{yyyy-MM-dd}.log
30
%-4relative [%thread] %-5level %logger{35} - %msg%n
以上配置的保存30天的根据fileNamePattern的命名规则创建归档文件,日志信息则写入新的文件中。
有时当你在按照日期进行归档时还想对日志文件大小进行限制,可以使用logback中的SizeAndTimeBasedFNATP,它是TimeBasedRollingPolicy的子组件,FNATP代表“文件命名和触发策略”。
配置如下:
mylog.txt
mylog-%d{yyyy-MM-dd}.%i.txt
100MB
%msg%n
以上配置表示媒体的日志文件不能超过100MB,一旦超过就要归档。
logback还有很多的高级特性,但以上介绍可以满足一般系统对日志的需求。
未完待续。。。。。。