logback.xml logger生成的logger怎样才能全局有效

下次自动登录
现在的位置:
& 综合 & 正文
Logback手记(一)
1、什么是logback
logback的产生是作为著名的日志框架log4j项目的一个继承者。它的设计者正是log4j的创造者Ceki Gülcü。logback在很大幅度上比现有的日志系统拥有更快的速度和更小的体积。logback也提供了独特和一些有用的特性,譬如标记、参数化的日志语句、有条件的堆栈跟踪和强大的事件过滤机制。这些只是运用logback提供的特性的一些例子。对于它自己的错误报表,logback依赖于状态对象,这样很大程度上促进了故障的排除。你可能更希望在日志之外依赖于状态对象。logback的核心绑定joran,一个强大和通用的配置系统,能在你自己的项目中起到很大的影响。
2.1、所需jar包
logback-classic-1.0.0.jar
logback-core-1.0.0.jar
slf4j-api-1.6.4.jar
logback jar下载地址:
slf4j jar下载地址:
2.2、配置文件
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.
2.3、简单应用
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的名称相同,那就代表是相同的对象实例。
2.4、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
2.5、logger有效级别
logback中一共有5种有效级别,分别是TRACE、DEBUG、INFO、WARN、ERROR,优先级依次从低到高,logger之间的级别也有继承关系,但这里就不阐述了。
3、配置文件语法规则
3.1、简单配置分析
logback的配置文件还是非常简单,它的根节点是&configuration&,其又包括0个或多个&appender&节点、0个和多个&logger&节点、至多一个&root&节点。如下图所示:
如下代码所示是一个最简单的配置:
&configuration&
&appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&
&pattern&%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&/pattern&
&/encoder&
&/appender&
&root level="debug"&
&appender-ref ref="STDOUT" /&
&/configuration&
以上配置中定义了一个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.
3.2、控制输出级别
logback日志级别一共有5种,可以通过配置文件输出指定级别的日志信息。
在以上配置文件中添加如下代码:
&loggername="app.action.LogBackAction" level="INFO"/&
表示命名为“app.action.LogBackAction”的logger只输出info级别的日志信息。
3.3、配置appender
appender可以包含0过或多个layout节点,0个或多个encoder节点,0个或多个filter节点,如下图所示:
输出到文件的appender,配置如下:
&appender name="logFile" class="ch.qos.logback.core.FileAppender"&
&file&myApp.log&/file&
&pattern&%d{yyyy-MM-dd HH:mm:ss} -%msg%n
&/pattern&
&/encoder&
&/appender&
如上配置后日志信息将写入到myApp.log文件中,默认情况下logback会将日志信息追加到日志文件中,如果在appender中加入&appender&false&/appender&则会替换之前的日志信息。
logback配置文件中还可以设置时间戳,这样的话就可以将日志信息输出到日期的指定文件中,如下配置:
&!--时间戳格式设置为yyyy-MM-dd--&
&timestampkey="byDay" datePattern="yyyy-MM-dd"/&
appender配置如下:
&appender name="logFile" class="ch.qos.logback.core.FileAppender"&
&file&myApp_${byDay}.log&/file&
&pattern&%d{yyyy-MM-dd HH:mm:ss} -%msg%n
&/pattern&
&/encoder&
&/appender&
以上配置日志信息就会写入一个“myApp”+ “yyyy-MM-dd”的文件中.
以上appender中使用到的类是FileAppdener,也就是基本的文件输出,logback中还有RollingFileAppender继承FileAppender,能够滚动记录文件。也就是当符合某个条件时,可以将日志信息记录到其他日志文件中。如果想用RollingFileAppender则需要配置RollingPolicy和TriggerPolicy,分别表示滚动策略和触发策略。
示例如下:
&appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"&
&file&test.log&/file&
&rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"&
&fileNamePattern&test.%i.log&/fileNamePattern&
&minIndex&1&/minIndex&
&maxIndex&3&/maxIndex&
&/rollingPolicy&
&triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"&
&maxFileSize&5MB&/maxFileSize&
&/triggeringPolicy&
&pattern&%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&/pattern&
&/encoder&
&/appender&
以上代码配置了RollingFileAppender,rollingPolicy定义为FixedWindwoRollingPolicy,这个滚动策略表示当满足了一定的触发策略后,logback会将日志信息写入到其他的日志文件中。配置了FixedWindowRollingPolicy后需要配置以下节点信息:
&fileNamePattern&:表示当触发了回滚策略后,按这个文件命名规则生成归档文件,命名规则中的%i表示在maxIndex和minIndex之间的一个整数值。
&minIndex&:最小索引值
&maxIndex&:最大索引值
假设生成三个日志归档文件,test.1.log、test.2.log、test.3.log,则test.1.log文件代表最先写入的那个文件,当三个文件都写满后会先删除test.3.log文件,依次循环。
logback中还有基于时间的rollingPolicy,配置如下:
&appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"&
&!-- Support multiple-JVM writing to the same log file --&
&prudent&true&/prudent&
&rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&
&fileNamePattern&logFile.%d{yyyy-MM-dd}.log&/fileNamePattern&
&maxHistory&30&/maxHistory&
&/rollingPolicy&
&pattern&%-4relative [%thread] %-5level %logger{35} - %msg%n&/pattern&
&/encoder&
&/appender&
以上配置的保存30天的根据fileNamePattern的命名规则创建归档文件,日志信息则写入新的文件中。
有时当你在按照日期进行归档时还想对日志文件大小进行限制,可以使用logback中的SizeAndTimeBasedFNATP,它是TimeBasedRollingPolicy的子组件,FNATP代表“文件命名和触发策略”。
配置如下:
&appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"&
&file&mylog.txt&/file&
&rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&
&!-- rollover daily --&
&fileNamePattern&mylog-%d{yyyy-MM-dd}.%i.txt&/fileNamePattern&
&timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&
&!-- or whenever the file size reaches 100MB --&
&maxFileSize&100MB&/maxFileSize&
&/timeBasedFileNamingAndTriggeringPolicy&
&/rollingPolicy&
&pattern&%msg%n&/pattern&
&/encoder&
&/appender&
以上配置表示媒体的日志文件不能超过100MB,一旦超过就要归档。
logback还有很多的高级特性,但以上介绍可以满足一般系统对日志的需求。
未完待续。。。。。。
&&&&推荐文章:
【上篇】【下篇】logback 常用配置详解(四) &appender& 每天生产一个日志文件,或者按规定大小生产日志文件
logback 常用配置详解(四) &appender& 每天生产一个日志文件,或者按规定大小生产日志文件
logback 常用配置详解(二)&&appender&&&appender&:&appender&是&configuration&的子节点,是负责写日志的组件。&appender&有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。&1.ConsoleAppender:把日志添加到控制台,有以下子节点:&encoder&:对日志进行格式化。(具体参数稍后讲解&)&target&:字符串&System.out&或者&System.err&,默认&System.out&;例如:&2.FileAppender:把日志添加到文件,有以下子节点:&file&:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。&append&:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。&encoder&:对记录事件进行格式化。(具体参数稍后讲解&)&prudent&:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。例如:3.RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:&file&:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。&append&:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。&encoder&:对记录事件进行格式化。(具体参数稍后讲解&)&rollingPolicy&:当发生滚动时,决定&RollingFileAppender&的行为,涉及文件移动和重命名。&triggeringPolicy&&:&告知&RollingFileAppender&合适激活滚动。&prudent&:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。&rollingPolicy:&TimeBasedRollingPolicy:&最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:&fileNamePattern&:必要节点,包含文件名及“%d”转换符,&“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender&的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern&的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。&&maxHistory&:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且&maxHistory&是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。&&FixedWindowRollingPolicy:&根据固定窗口算法重命名文件的滚动策略。有以下子节点:&minIndex&:窗口索引最小值&maxIndex&:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。&fileNamePattern&&:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip&triggeringPolicy:&SizeBasedTriggeringPolicy:&查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender&触发当前活动文件滚动。只有一个节点:&maxFileSize&:这是活动文件的大小,默认值是10MB。&&&例如:每天生成一个日志文件,保存30天的日志文件。&&& 例如:按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。&4.另外还有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,并不常用,这些就不在这里讲解了,大家可以参考官方文档。当然大家可以编写自己的Appender。&&&encoder&:负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。目前PatternLayoutEncoder&是唯一有用的且默认的encoder&,有一个&pattern&节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“\%”进行转义。例如:&&pattern&里面的转换符说明:&转换符作用c&{length&}&lo&{length&}&logger&{length&}&输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。Conversion specifierLogger nameResult%loggermainPackage.sub.sample.BarmainPackage.sub.sample.Bar%logger{0}mainPackage.sub.sample.BarBar%logger{5}mainPackage.sub.sample.Barm.s.s.Bar%logger{10}mainPackage.sub.sample.Barm.s.s.Bar%logger{15}mainPackage.sub.sample.Barm.s.sample.Bar%logger{16}mainPackage.sub.sample.Barm.sub.sample.Bar%logger{26}mainPackage.sub.sample.BarmainPackage.sub.sample.Bar&C&{length&}&class&{length&}&输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。contextName&cn&输出上下文名称。d&{pattern&}&date&{pattern&}&输出日志的打印日志,模式语法与java.text.SimpleDateFormat&兼容。Conversion PatternResult%d 14:06:49,812%date 14:06:49,812%date{ISO8601} 14:06:49,812%date{HH:mm:ss.SSS}14:06:49.812%date{dd&MMM&yyyy&;HH:mm:ss.SSS}20 oct. :49.812F / file输出执行记录请求的java源文件名。尽量避免使用,除非执行速度不造成任何问题。caller{depth}caller{depth, evaluator-1, ... evaluator-n}输出生成日志的调用者的位置信息,整数选项表示输出信息深度。例如,&%caller{2}&& 输出为:0
[main] DEBUG - logging statement
at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)例如,&%caller{3}&& 输出为:16
[main] DEBUG - logging statement
at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
at mainPackage.ConfigTester.main(ConfigTester.java:38)L / line输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。m / msg / message输出应用程序提供的信息。M / method输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。n输出平台先关的分行符“\n”或者“\r\n”。p / le / level输出日志级别。r / relative输出从程序启动到创建日志记录的时间,单位是毫秒t / thread输出产生日志的线程名。replace(p&){r, t}p&为日志内容,r&是正则表达式,将p&中符合r&的内容替换为t&。例如, "%replace(%msg){'\s', ''}"&&格式修饰符,与转换符共同使用:可选的格式修饰符位于“%”和转换符之间。第一个可选修饰符是左对齐&标志,符号是减号“-”;接着是可选的最小宽度&修饰符,用十进制数表示。如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。如果字符大于最小宽度,字符永远不会被截断。最大宽度&修饰符,符号是点号"."后面加十进制数。如果字符大于最大宽度,则从前面截断。点符号“.”后面加减号“-”在加数字,表示从尾部截断。
发表评论:
TA的最新馆藏[转]&logback怎么根据logger输出不-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
logback怎么根据logger输出不
来源:互联网 发表时间: 10:19:37 责任编辑:李志喜字体:
为了帮助网友解决“logback怎么根据logger输出不”相关的问题,中国学网通过互联网对“logback怎么根据logger输出不”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:logback怎么根据logger输出不同文件,具体解决方案如下:解决方案1:
venality-%d{yyyy-MM-dd};logs/&gt: Xml代码 &lt.&quot: 不同包的日志可能要放到不同的文件中;logger name=&&#47,如service层和dao层的日志.xml中添加;level&gt.SSS} [%thread] %-5level %logger{5} - %msg%n&
&/ &logs&#47.error(&quot.;
&encoder&gt..RollingFileAppender&
&false& 3; level=&
&/DEBUG&quot..serviceAppender&quot.pattern&/&#47.RollingFileAppender&quot.venality-%d{yyyy-MM-dd}.j;rollingPolicy&encoder&gt.log和&#47.!-- 只打印错误日志 --&ACCEPT&lt.error(& &#47.: Java代码
&lt. 在logback(-test);fileNamePattern&gt:
&lt.service的logger都加上errorAppender.s.:59;
} } 2;ERROR&lt.rolling; 不同日志级别;/
&): Java代码 @Test public void dispatchByPackageTest() {
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(&&
&lt. 15.SSS} [%thread] %-5level %logger{5} - %msg%n&lt.ObligationService -file&venality:12.
log.s;rollingPolicy class=&/logger&gt. 执行上面的测试方法;encoder&gt.log中打印了;DENY& class=&quot.logs/errorAppender&quot.SSS} %thread %X{invokeNo} %logger{40} %msg%n&lt:51; &#47.logback.j;pattern&gt:(beans节点省略) Xml代码 &&#47.classic.qos.839 [main] DEBUG c.class);
ObligationService service = ctx.rolling:调试.TimeBasedRollingPolicy&quot.john&quot. additivity=&&&#47.;daoAppender&quot.logback.844 [main] DEBUG c.dao.queryObligations();.xml文件.&errorAppender&
&&#47.ObligationDao - An error occurred during the query 15; 新建一个错误日志的). 测试方法:component-scan base-package=&quot.:59;/onMatch&gt、信息.log&lt:59.debug(&quot. 创建不同包下的两个类.log&
&lt.;&#47.d;logger name=&quot.&quot,service和dao的错误日志都打印到appender-ref ref=&fileNamePattern&
&lt.dao和com.j、警告和错误等也要分文件输出.RollingFileAppender&quot:ss.TimeBasedRollingPolicy&quot.j。 一;%d{HH;).john.d;
} } Java代码 package com.obligate();
ObligationDao dao./ 在类路径下创建Spring的DENY&&#47. } 执行测试后.xml文件 serviceAppender和daoAppender都加入以下级别过滤器;An error occurred during the query&obligate end.LevelFilter&An error occurred during the progress&quot.service&ch.j: Xml代码 & &lt、根据包输出;
@Repository public class ObligationDao {
static final Logger log = LoggerFactory.ObligationDao An error occurred during the query 16:
&rollingPolicy class=&daoAppender&
&lt.getLogger(ObligationD%d{HH; /filter class=&quot.,433 main com.844 [main] ERROR c.rolling. &lt. 二.rolling.LevelFilter&level&gt, bribery,通过logger的name属性指定不同的包 1. 修改logback(-test);
&lt./&#47: 15.qos:59.;level&gt.j:filter&gt.
& class=&quot.&
&file&gt.TimeBasedRollingPolicy&
&/)为了方便查看和归档:59.classic.rolling.debug(&
public void queryObligations() { serviceAppender&%d{HH.fileNamePattern&rollingPolicy&&gt.logback:59.ObligationDao - q
dao.getBean(ObligationSpattern&qencoder&&#47..&/&lt:59;encoder&gt.;/
&lt.ObligationService - An error occurred during the progress 15.&appender&onMismatch&
@Service public class ObligationService {
static final Logger log = LoggerFactory. 15;
&ch.844 [main] DEBUG/appender&obligate start.logback.log&queonMismatch&&gt:51;
&onMismatch& &lt: 15;logs/ERROR&lt. /appender name=&quot.log&fileNamePattern&file&
&lt.844 [main] DEBUGappender-ref ref=&quot.core.false&quot.;appender-ref ref=&quot.
&lt.844 [main] ERRORlevel&ACCEPT&/DEBUG&&#47:59;
&pattern&gt. 2:59;);fileNamePattern&gt:59;onMismatch&&gt,这样错误日志就不会在filter class=&onMatch&gt.&file&filter&gt.logger& /&#47.class);&appender&/appender name=&quot. bribery-%d{yyyy-MM-dd}:encoder&gt: Xml代码 &lt.class).;rollingPolicy&&#47.log&file&&/
&lt: 16.qos:59; name为com.getLogger(ObligationService:ss:59;logs/pattern&gt,433
log、根据日志级别输出 这里把所有级别为ERROR的日志输出到一个文件中 1;appender name=&quot.rollingPolicy class=&//file&&onMatch&& level=&quot.ObligationService - obligate end.&#47.debug(&quot.log文件中了.
public void obligate() {
class=&quot.debug(&
&lt.ObligationDao - quefileNamePattern&gt: Xml代码 &);com.xml&quot.qos.pattern&
& additivity=&quot:12;logs/onMatch&
&lt.&ch.john.log.d.
&).dao&// &lt
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号下次自动登录
现在的位置:
& 综合 & 正文
非常详细的logback学习笔记
Logback介绍
Logback 分为三个模块:Core、Classic 和 Access。Core模块是其他两个模块的基础。 Classic模块扩展了core模块。 Classic模块相当于log4j的显著改进版。Logback-classic 直接实现了 SLF4J
要引入logback,由于Logback-classic依赖slf4j-api.jar和logback-core.jar,所以要把slf4j-api.jar、logback-core.jar、logback-classic.jar,添加到要引入Logbac日志管理的项目的class
Logback的配置
Logger、Appender和 Layout
建立于三个主要类之上:Logger、Appender 和 Layout。Logger类是logback-classic模块的一部分,而Appender和Layout接口来自logback-core。作为一个多用途模块,logback-core 不包含任何logger。
Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、MySQL、 PostreSQL、 Oracle和其他数据库、 JMS和远程UNIXSyslog守护进程等。Layout 负责把事件转换成字符串,格式化的日志信息的输出。
各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各logger。
如果 logger的名称带上一个点号后是另外一个 logger的名称的前缀,那么,前者就被称为后者的祖先。如果logger与其后代 logger之间没有其他祖先,那么,前者就被称为子logger 之父。比如,名为"com.foo""的 logger 是名为"com.foo.Bar"之父。root
logger 位于 logger 等级的最顶端,root logger 可以通过其名称取得,如下所示:
Logger rootLogger =LoggerFactory.getLogger();
其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以logger 名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。
有效级别与级别继承
Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于ch.qos.logback.classic.Level类。如果 logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。root
logger 默认级别是 DEBUG。
打印方法与基本选择规则
打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("..")是一条级别为 INFO 的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。
记录请求级别为 p,其 logger的有效级别为 q,只有则当 p&=q时,该请求才会被执行。
该规则是 logback 的核心。级别排序为: TRACE & DEBUG & INFO &WARN & ERROR。
Logger、Appenders及layouts的关系
一个 logger 可以被关联多个 appender。方法 addAppender() 为指定的 logger 添加一个appender。对于 logger 的每个启用了的记录请求,都将被发送到 logger 里的全部 appender 及更高等级的 appender。换句话说,appender叠加性地继承了 logger 的层次等级。
Logger L的记录语句的输出会发送给 L及其祖先的全部 appender。如果 logger
L的某个祖先 P设置叠加性标识为 false,那么,L的输出会发送给L 与 P之间(含P)的所有 appender,但不会发送给P的任何祖先的appender。
Logger 的叠加性默认为 true。如果希望定制输出格式。这时为 appender 关联一个 layout 即可。Layout负责根据用户意愿对记录请求进行格式化,appender 负责将格式化化后的输出发送到目的地。
例如,转换模式"%-4relative[%thread] %-5level %logger{32} - %msg%n"在 PatternLayout里会输出形如:
176 [main] DEBUGmanual.architecture.HelloWorld2 - Hello world.
第一个字段是自启动以来的逝去时间,单位是毫秒。
第二个地段发出记录请求的线程。
第三个字段是记录请求的级别。
第四个字段是与记录请求关联的 logger 的名称。
"-"之后是请求的消息文字。
Logback的默认配置
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender组成。输出用模式为%d{HH:mm:ss.SSS}
[%thread] %-5level %logger{36} - %msg%n 的PatternLayoutEncoder 进行格式化。rootlogger 默认级别是 DEBUG。
logback配置文件
Logback 配置文件的语法非常灵活。正因为灵活,所以无法用 DTD 或 XML schema 进行定义。尽管如此,可以这样描述配置文件的基本结构:以&configuration&开头,后面有零个或多个&appender&元素,有零个或多个&logger&元素,有最多一个&root&元素。
Logback默认配置的采用的步骤
1. 尝试在 classpath 下查找文件 logback-test.xml;
2. 如果文件不存在,则查找文件 logback.xml;
3. 如果两个文件都不存在,logback 用 Bas icConfigurator 自动对自己进行配置,这会导致记录输出到控制台。
假设配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender组成。输出用模式为%d{HH:mm:ss.SSS}
[%thread] %-5level %logger{36} - %msg%n 的PatternLayoutEncoder 进行格式化。还有,根 logger 默认级别是 DEBUG。
最简单的配置方法就是使用默认配置。以下是logback用BasicConfigurator 配置的简单例子:
package com.ttpod.chapters.
import org.slf4j.L
import org.slf4j.LoggerF
publicclass MyApp1 {
finalstatic Logger logger = LoggerFactory.getLogger(MyApp1.class);
publicstaticvoid main(String[] args) {
logger.info("Entering application.");
//进行另一个application中
Foo foo = new Foo();
foo.doIt();
//执行其它中的日志输出方法
logger.info("Exiting application.");
//退出另一个application
该类定义了一个静态变量 logger,然后实例化一个 Foo 对象。Foo 类如下
package com.ttpod.chapters.
import org.slf4j.L
import org.slf4j.LoggerF
publicclass Foo {
staticfinal Logger logger = LoggerFactory.getLogger(Foo.class);
publicvoid doIt() {
logger.debug("Did it again!");
//定义一个debug级别的日志输出
自动打印警告和错误消息
当解析配置文件有警告或出错时,logback 会在控制台上自动打印状态数据。如果没有警告或错误,还是想检查logback 的内部状态的话,可以调用 StatusPrinter 的 print()方法。示例如下:
finalstatic Logger logger = LoggerFactory.getLogger(MyApp2.class);
publicstaticvoid main(String[] args) {
// 在当前环境中假设 SLF4J 已经被绑定到logback
LoggerContextlc = (LoggerContext) LoggerFactory.getILoggerFactory();
// 打印logback的内部状态
StatusPrinter.print(lc);
对应的配置文件:
&?xmlversion="1.0"encoding="UTF-8"?&
&configuration&
&!--定义一个名为STDOUT的appender,并将其关联到ch.qos.logback.core.ConsoleAppender--&
&appendername="STDOUT"
class="ch.qos.logback.core.ConsoleAppender"&
&!-- encoders 作用是将logger事件转换成字节数组,并将字节数组写入到输出流--&
&!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符--&
&pattern&%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&/pattern&
&/encoder&
&/appender&
&rootlevel="debug"&
root logger,定义级别为debug--&
&appender-refref="STDOUT"/&
&!--将名为STDOUT的appender添加到root
logger下--&
&/configuration&
控制台输出结果如下:
20:12:33,359|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT findresource [logback.groovy]
20:12:33,359|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT findresource [logback-test.xml]
20:12:33,359|-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource[logback.xml] at
20:12:33,484|-INFO in ch.qos.logback.core.joran.action.AppenderAction - About toinstantiate appender of type [ch.qos.logback.core.ConsoleAppender]
20:12:33,484|-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as[STDOUT]
20:12:33,500|-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assumingdefault type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for[encoder] property
20:12:33,593|-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting levelof ROOT logger to DEBUG
20:12:33,593|-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attachingappender named [STDOUT] to Logger[ROOT]
20:12:33,593|-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End ofconfiguration.
20:12:33,593|-INFO in ch.qos.logback.classic.joran.JoranConfigurator@cb6009 - Registeringcurrent configuration as safe fallback point
Logback自定义配置
配置root logger
&root&元素配置根 logger。该元素有一个 level属性。没有 name 属性,因为已经被命名为"ROOT"。Level 属性的值大小写无关,其值为下面其中一个字符串:TRACE、DEBUG、INFO、WARN、ERROR、ALL和OFF。注意不能设置为"INHERITED" 或"NULL"。 &logger&元素可以包含零个或多个&appender-ref&元素。与&logger&元素类似,声明&root&元素后,会先关闭然后移除全部当前 appender,只引用声明了的appender。如果 root 元素没有引用任何 appender,就会失去所有 appender。
假设我们不想看到"com.ttpod.file"包里的任何组件的任何 DEBUG 信息,可以设置如下:
&?xmlversion="1.0"encoding="UTF-8"?&
&configuration&
&appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"&
%d{HH:mm:ss.SSS}[%thread] %-5level %logger{36} - %msg%n
&/pattern&
&/encoder&
&/appender&
&!-- 设置configuration下的logger的级别为INFO,默认是继承root
logger的debug级别 --&
&loggername="chapters.configuration"level="INFO"/&
&!-- 严格来说, root logger 的level属性没有必要设置,因为 --&
&!-- root logger的级别被默认设置为DEBUG --&
&rootlevel="DEBUG"&
在root标签内没有引入chapters.configuration,所有在此包下不会
显示任何组件的任何 DEBUG 信息
&appender-refref="STDOUT"/&
&!-- 将appender引入到root
&/configuration&
注意:由名为"chapters.configuration.Foo"的 logger 生成的 DEBUG 级别的信息都被屏蔽了.同样,也可以为任意数量的 logger 设置级别。
Appender 用&appender&元素配置,该元素必要属性 name 和 class。 name 属性指定 appender 的名称,class 属性指定 appender 类的全限定名。 &appender&元素可以包含零个或多个&layout&元素、零个或多个&encoder&元素和零个或多个&filter&元素。除了这三个常用元素之外,还可以包含 appender 类的任意数量的 javabean
属性。下图演示了常用结构,注意对 javabean 属性的支持在图中不可见。
记录输出到多个 appender 很简单,先定义各种 appender,然后在 logger 里进行引用,就行了。如下面的配置文件所示:
&configuration&
&appendername="FILE"class="ch.qos.logback.core.FileAppender"&
&file&myApp.log&/file&
&!-- encodersare assigned by default the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder--&
&pattern&%date %level [%thread] %logger{10} [%file:%line] %msg%n&/pattern&
&/encoder&
&/appender&
&appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender"&
&pattern&%msg%n&/pattern&
&/encoder&
&/appender&
&rootlevel="debug"&
&appender-refref="FILE"/&
&appender-refref="STDOUT"/&
&/configuration&
该配置文件定义了两个 appender,分别是"FILE"和"STDOUT"。"FILE"这个 appender 把记录输出到文件"myapp.log ",它的 encoder 是PatternLayoutEncoder,输出了日期、级别、线程名、logger 名、文件名及记录请求的行号、消息和行分隔符。"STDOUT"这个 appender 把记录输出到控制台,它的 encoder 只是输出消息和行分隔符。 myApp.log文件内容如下:
6:56:48,593 INFO [main] c.t.c.c.MyApp3 [MyApp3.java:48] Entering application.
6:56:48,593 DEBUG [main] c.t.c.c.Foo [Foo.java:24] Did it again!
6:56:48,593 INFO [main] c.t.c.c.MyApp3 [MyApp3.java:52] Exiting application.
注意每个 appender 都有自己的 encoder。Encoder 通常不能被多个 appender 共享,layout也是。所以,logback 的配置文件里没有共享 encoder 或 layout 的语法。
Appender累积
默认情况下,appender 是可累积的:logger 会把记录输出到它自身的 appender 和它所有祖先的appender。因此,把同一 appender 关联到多个 logger 会导致重复输出,如下面的配置文件会导致重复的输出:
&configuration&
&appendername="STDOUT"
class="ch.qos.logback.core.ConsoleAppender"&
%d{HH:mm:ss.SSS}[%thread] %-5level %logger{36} - %msg%n
&/pattern&
&/encoder&
&/appender&
&loggername="chapters.configuration"&
&appender-refref="STDOUT"/&
&rootlevel="debug"&
&appender-refref="STDOUT"/& &!—这会导致重复输出--&
&/configuration&
输出结果如下:
20:53:29.328[main] INFO c.t.chapters.configuration.MyApp2 - Entering application.
20:53:29.328[main] INFO c.t.chapters.configuration.MyApp2 - Entering application.
20:53:29.328[main] DEBUG com.ttpod.chapters.configuration.Foo - Did it again!
20:53:29.328[main] DEBUG com.ttpod.chapters.configuration.Foo - Did it again!
20:53:29.328[main] INFO c.t.chapters.configuration.MyApp2 - Exiting application.
20:53:29.328[main] INFO c.t.chapters.configuration.MyApp2 - Exiting application.
覆盖默认的累积行为
如果你觉得默认的累积行为不合适,可以设置叠加性标识为 false 以关闭它。这样的话,logger 树里的某个分支可以输出到与其他 logger 不同的 appender。
示例:叠加性标识
&configuration&
&loggername="com.ttpod.chapters.configuration.Foo"additivity="false"&
&appender-refref="FILE"/&
&rootlevel="debug"&
&appender-refref="STDOUT"/&
&/configuration&
输出结果:
Enteringapplication.
Exitingapplication.
此例中,logger"chapters.configuration.Foo"关联 appender"FILE",它的叠加性标记为false,这样它的记录输出仅会被发送到 appender"FILE",不会被发送到更高 logger 等级关联的 appender。其他logger 不受此影响。用 additivityFlag.xml 配置 MyApp3,运行后,控制台上由输出由"chapters.configuration.MyApp3"产生的记录。而 logger"chapters.configuration.Foo"将且仅仅将输出到文件 foo.log。
Layout格式化输出日志
配置自定义 layout
配置自定义layout与配置其他layout是一样的。 FileAppender和其子类需要一个<span style="color:rgb(49,
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 logback logger 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信