??xml version="1.0" encoding="utf-8" standalone="yes"?>2020天堂在线亚洲精品专区,亚洲妇女熟BBW,久久91亚洲精品中文字幕http://www.tkk7.com/watchzerg/zh-cnSun, 11 May 2025 14:07:36 GMTSun, 11 May 2025 14:07:36 GMT60logback_doc_manual_01_introduction_to_logbackhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415757.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 11:04:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415757.htmlhttp://www.tkk7.com/watchzerg/comments/415757.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415757.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415757.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415757.html最q把logback的文翻了一遍,弄了些半W记半翻译的文字出来Q本来打仅仅存在evernote里的Q但q是费点功夫发出来吧Q可能ؓ别h提供些参考?/div>
看我q文章标题v的,Ҏ索引擎拆词极端的不友好,哇哈哈哈?#8230;…
链接Q?/div>
slf4jW记
logback_doc_manual_01_introduction_to_logback
logback_doc_manual_02_architecture
logback_doc_manual_03_configuration
logback_doc_manual_04_appenders
logback_doc_manual_05_encoders
logback_doc_manual_06_layouts
logback_doc_manual_07_filters
logback_doc_manual_08_mapped_diagnostic_contexts
logback_doc_manual_09_logging_separation
logback_eclipse_plugin_beagle
logback_config_demo
logback-demo目Q?/div>
     http://logback.qos.ch/demo.html
     遇到有问题的Q就把这个项目拔下来看看?/div>
     例如CyclicBufferAppenderQ在文里貌似没有描q过Q在appenderq一章也找不到?/div>
     CZ目里,实现“在web面上查看最q?12条日?#8221;Q是手写的ServletQViewLastLog.java
logback-access:
     http://logback.qos.ch/access.html 
     可以集成到jetty或者tomcat中,提供强大的http-access日志?/div>
     依赖于logback-coreQ不依赖slf4j和logback-classicQ?/div>
     如果与tomcat6.x集成Q可能会崩溃哦~Q徏议用tomcat7.x。实在想用tomcat6.xQ可以用logback-access版本0.9.30
     可以拦截和打印每个http的request和response?/div>
     Apache Tomcat中的日志是通过借助Apache Commons Logging库实现的Q这个库对不同的日志框架做了一个简单包装。Tomcat有能力记录跨日志U别的多层次日志Q而且不需要依赖特定的日志框架?/div>
     从Tomcat 6.0开始,Tomcat引入一个对Apache Commons Logging重命名包后的U有实现Q从而允许web应用使用他们自己独立的原Apache Commons Logging库的lib包。在默认的发布包中,Apache Commons LoggingU有实现是简单被编码到java.util.logging框架?/div>
     实际使用中,通过配置org.apache.catalina.valves.AccessLogValve可以让tomcat打印讉K日志Q默认禁用掉的)


]]>logback_config_demohttp://www.tkk7.com/watchzerg/archive/2014/07/13/415756.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 11:03:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415756.htmlhttp://www.tkk7.com/watchzerg/comments/415756.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415756.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415756.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415756.html
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- <configuration scan="true" scanPeriod="60 seconds">  -->
 3 <configuration>
 4     <!-- print configuration status on console -->
 5     <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>
 6     
 7     <!-- Beagle: eclipse plugin -->
 8     <consolePlugin />
 9     
10     <!-- log path -->
11     <property name="LOG_PATH" value="d:/log" />
12     <!-- <property resource="resource1.properties" /> -->
13     
14     <!-- console appender -->
15     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
16         <encoder>
17             <pattern>
18                 %d{HH:mm:ss.SSS} [%t] %-5p  %c{1} - %m%n
19             </pattern>
20         </encoder>
21     </appender>
22     
23     <!-- default appender -->
24     <appender name="COMMON-DEFAULT-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
25         <File>${LOG_PATH}/common-default.log</File>
26         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
27             <FileNamePattern>
28                 ${LOG_PATH}/common-default.%d.log.gz
29                 <!-- ${LOG_PATH}/%d{yyyy-MM,aux}/common-default.%d.log.gz -->
30             </FileNamePattern>
31         </rollingPolicy>
32         <encoder>
33             <Pattern>
34                 %d [%t] %-5p  %c{1} - %m%n
35             </Pattern>
36         </encoder>
37         <!-- <immediateFlush>false</immediateFlush>  -->
38     </appender>
39     
40     <!-- error appender -->
41     <appender name="COMMON-ERROR-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
42         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
43             <level>ERROR</level>
44         </filter>
45         <File>${LOG_PATH}/common-error.log</File>
46         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
47             <FileNamePattern>
48                 ${LOG_PATH}/common-error.%d.log.gz
49                 <!-- ${LOG_PATH}/%d{yyyy-MM,aux}/common-error.%d.log.gz -->
50             </FileNamePattern>
51         </rollingPolicy>
52         <encoder>
53             <Pattern>
54                 %d [%t] %-5p  %c{1} - %m%n
55             </Pattern>
56         </encoder>
57         <!-- <immediateFlush>false</immediateFlush>  -->
58     </appender>
59 
60     <!-- root logger -->
61     <root>
62         <level value="DEBUG"/>
63         <appender-ref ref="STDOUT"/>
64         <appender-ref ref="COMMON-DEFAULT-APPENDER"/>
65         <appender-ref ref="COMMON-ERROR-APPENDER"/>
66     </root>
67 
68 </configuration>
69 


]]>
logback_eclipse_plugin_beaglehttp://www.tkk7.com/watchzerg/archive/2014/07/13/415755.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 11:01:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415755.htmlhttp://www.tkk7.com/watchzerg/comments/415755.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415755.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415755.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415755.html
先安装依赖插Ӟ
http://download.eclipse.org/technology/nebula/snapshot    (注意q个是稳定的release版的地址Q只需要安?#8220;Nubula Release Individual Widgets”中的“Nebula Grid Feature”卛_)
再安装logback-beagle插gQ?/div>
http://logback.qos.ch/p2/ ( "Logback" "Logback Beagle" "SLF4J"q三个都得?
完成后按“alt-shift-Q,Q”弹出view选择框,扑ֈbeagle打开卛_Q之后需要在logback-test.xml里配|?lt;consolePlugin />Q参见logback文Q?/div>
在logback-test.xml里加上配|?lt;consolePlugin />卛_
     <configuration debug="true">
       <!-- sends logs to logback-beagle -->
       <consolePlugin />
     </configuration>
     ——实际上这个配|会自动创徏一个SocketAppenderQƈ把日志发到本机的4321端口?/div>
单击停止滚动Q双d始滚?/div>
右键菜单可以跌{到调用行Q也可以查看最?行调用栈
配置Q?/div>
eclipse的preference?
     Run/Debug - Beagle
          在这里可以自定义控制台输出的pattern
     General - Appearance - Colors and Fonts
          可以单独对Beagle讄字体


]]>logback_doc_manual_09_logging_separationhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415754.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 11:00:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415754.htmlhttp://www.tkk7.com/watchzerg/comments/415754.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415754.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415754.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415754.html
主要处理多个应用E序q行在同一个web容器Qƈ且每个应用用各自独立的日志环境?/div>
——x一个tomcatq行了多个项?#8212;—也就?#8220;一个JVMQ多个ClassLoaderQ每个ClassLoader拥有自己独立的Logger Context”的问题?/div>
Context Selectors
     调用LoggerFactory.getLogger("foo")的时候,会要求SLF4Jl定一个ILoggerFactoryQ如果SLF4J使用的是logbackQ那?#8220;l定ILoggerFactory”的方法,会代理给一个ContextSelector实例Q该实例会根据情况返回最合适的LoggerContext对象——q个对象实现了ILoggerFactory接口?/div>
     默认Lq回DefaultContextSelectorQ可以在pȝ属性里通过logback.ContextSelector属性指定自qcR?/div>
ContextJNDISelector
     ҎJNDI查找Selector——q样可以在各个项目的web.xml里配|自qJNDI环境变量?/div>
     Z在单个web目重启和关闭的时候,对应的logger Context可以被回Ӟ最好配|ContextDetachingSCL监听?/div>
     不过每次获取logger都查找JNDI太慢Q可以配|LoggerContextFilterqo器来避免——会在每个httph到来的时候把logger context攑֜U程内部Q从而允怹后蟩qJNDI搜烦?/div>
     此时最好把logger全声明成static的,减少logger的获取L数?/div>
Taming static references in shared libraries
     如果有一个类属于׃n包,被两个web目同时引用
          1Q当q个cM用非静态loggerӞ一切良好,来自两个web目的调用,会返回各自的logger context?/div>
          2Q当q个cM用静态loggerӞ会错误的q回首次调用它的web目的logger context——对这个问题ContextJNDISelector无能为力Qeluded a solution for eons... 哈哈哈哈Q?/div>
     对于上述?#8220;来自q的静态loggerQ获取不同的logger context”的问题,有几个的办法Q?/div>
          1Q共享类Ҏ非静态logger——一般不现实Q因为共享类的源码往往不受目控制?/div>
          2Q把׃ncL到web目?#8212;—也够呛,一个两个类q好Q那么多W三方依赖咋弄?
          3Q所以还有一U取巧的办法Q用SiftingAppenderQ根据JNDI信息把不同的日志分别输出C同的文g里去Qlogback提供了JNDIBasedContextDiscriminator帮助做这事儿Q?#8212;—也就是说Q两个项目分享同一个loggerQ等到其兌的appender需要把event输出到文件时Q再临时军_输出到哪个文件?/div>
     上述W?U方法有一个问题:
               假如目A和项目B都用共享包S?/div>
                    目A启动q调用S的时候,已l把S的logger context讄为A了,日志会写入A.log中?/div>
                    B启动q调用S的时候logger contex依然是AQ不q因为配|了SiftingAppender的存在,B的日志依然可以写到正的B.log中)
               ——也就是说Q共享logger的问题ƈ没有实质解决Q这个loggerq是只能属于A或者B其中之一Q只不过logger在写日志前根据MDC里的JNDI可以日志写到正的文g中去?/div>
               而初始化了两个不同的logger context都指向B.logQ存在多个线E写同一个文件的不安全问?#8212;—需要对appender配置prudent参数来解冻I会媄响性能Q?/div>
     Q正怋用都是一个web container部v一个web目Q很遇Cq情c这部分文档看的很蛋?#8230;…Q?/div>


]]>logback_doc_manual_07_filtershttp://www.tkk7.com/watchzerg/archive/2014/07/13/415752.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 10:59:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415752.htmlhttp://www.tkk7.com/watchzerg/comments/415752.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415752.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415752.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415752.htmlhttp://logback.qos.ch/manual/filters.html
logback-classic有两UfilterQRegular filters和turbo filtersQ挂在appender?/div>
Regular filters
     只有一个decide()ҎQ返回DENY, NEUTRAL or ACCEPT
LevelFilter
     <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
     </filter>
ThresholdFilter
     高于或等于指定日志别的记录Q会q回NEUTRAL
     <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
     </filter>     
EvaluatorFilter
     EventEvaluator的实现判断某个条件是否满?/div>
     
     GEventEvaluator
          接受groovy语法的布表辑ּ作ؓ判断条gQ需要依赖Groovyq行Ӟ表达式语句在配置的时候完成编译?/div>
          logback会自动将目标事g作ؓ一个变量传q来Q可以用“event”或?#8220;e”来引用?/div>
          TRACE, DEBUG, INFO, WARN and ERRORq些U别也引入了Q所以可以这样判断相{: "event.level == DEBUG" ?/div>
          其他比较W,大于于Q需要{换成int再比较?/div>
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
      <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
        <expression>
           e.level.toInt() >= WARN.toInt() &amp;&amp;  <!-- Stands for && in XML -->
           !(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
        </expression>
      </evaluator>
      <OnMismatch>DENY</OnMismatch>
      <OnMatch>NEUTRAL</OnMatch>
    </filter>
     JaninoEventEvaluator
          使用java表达式,使用上比Zgroovy的GEventEvaluatorJ琐Q但执行速度更快?/div>
          详情略?/div>
          
Matchers
     执行上面的过滤器Ӟ可以调用String.matches()ҎQ但代h是每ơ需要重~译一个正则Pattern对象?/div>
     所以可以预先定义和~译一个,以便复用?/div>
     详情略?/div>
TurboFilters
     跟普通过滤器功能一P但是Q?/div>
          1QTurboFilter是跟logging context兌的,而不是跟appender兌。作用域更大。不仅在指定appender使用Ӟ而且在每ơloggingh旉会被调用?/div>
          2Q他们是在LoggingEvent对象创徏之前被调用,qo时不需要event实例做参敎ͼ所以性能更高Q因为在event创徏之前已l执行过滤了Q?/div>
     内置了一些TurboFilterQ?/div>
          MDCFilter     试指定的值是否存在于MDC?/div>
          DynamicThresholdFilter     ZMDC的key和level来限?/div>
          MarkerFilter     试指定的marker是否出现在请求中
          DuplicateMessageFilter
               自动qo相同的消息?/div>
                    使用单的字符串比?#8212;—即两个字符串基本相同,相差一两个字母Q也会被认ؓ不同?/div>
                    仅比较raw字符Ԍ用{}转义q的字符串不L较?/div>
                    可以通过AllowedRepetitions讄允许的重复上限,过上限的会被抛弃。默认大ؓ5
                    需要通过一个内部cache来保存老的消息以便判断Q可以通过CacheSize讄~存大小Q默?00.
          
在evaluator的expression里,logging旉与项目启动时间对比,可以控制仅输?#8220;目启动?0U内的某cd日志”——q个对于“认某个定时d在启动时是运行状?#8221;很有用,例如Q?/div>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
  <evaluator name="loggingTaskEval">
    <expression>
      logger.getName().contains("LoggingTask") &amp;&amp;
      message.contains("Howdydy-diddly-ho") &amp;&amp;
      (timeStamp - event.getStartTime()) >= 20000
    </expression>
  </evaluator>
  <OnMatch>DENY</OnMatch>
</filter>


]]>logback_doc_manual_08_mapped_diagnostic_contextshttp://www.tkk7.com/watchzerg/archive/2014/07/13/415753.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 10:59:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415753.htmlhttp://www.tkk7.com/watchzerg/comments/415753.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415753.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415753.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415753.htmlhttp://logback.qos.ch/manual/mdc.html
MDCQ注意这个类在org.slf4j包里Q?/div>
     Z“多个U程同步处理多个h”的假设来设计的,上下文信息记录?/div>
          ——子线E会自动拯双亲U程的这cM息?/div>
          ——如果没有附加处理的话Q放入线E池处理的Q务会丢失MDC上下文?/div>
          该设计假定向MDC放数据的速度不会太快?/div>
最常用的web场景Q是集成在一个servlet的Filter中,在请求时载入MDC信息QdoFilter处理完成后卸载MDC信息?/div>
——最好在“验证用户”q个Filter之后Q或者之中)q行Q这样可以把用户验证信息Q包括但不限于用户名Q写入MDC?/div>
交给U程池处?submit)之前QMDC.getCopyOfContextMap()Q把q回的map当作参数传给dU程
U程池处理代码的W一行:MDC.setContextMapValues()Q把接到的map参数讄到本U程的MDC中(别忘了最后清除掉Q?/div>
MDCInsertingServletFilter
     webh常用信息讄到MDC中:
          req.remoteHost as returned by the getRemoteHost() method
          req.xForwardedFor value of the "X-Forwarded-For" header
          req.requestURI       as returned by getRequestURI() method
          req.requestURL as returned by getRequestURL() method
          req.queryString as returned by getQueryString() method
          req.userAgent      value of the "User-Agent" header
     web.xml中的配置
<filter>
  <filter-name>MDCInsertingServletFilter</filter-name>
  <filter-class>
    ch.qos.logback.classic.helpers.MDCInsertingServletFilter
  </filter-class>
</filter>
<filter-mapping>
  <filter-name>MDCInsertingServletFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping> 
     注意filter序Q经q该filterqo之后Q其它filter才能打印出MDC信息Q特别是struts之类依赖filter处理主逻辑的)
     使用例子Q?/div>
     %X{req.remoteHost} %X{req.requestURI}%n%d - %m%n
     ——其实没多大意义,q是自己写这个filterQ挑选自q有效信息比较好?/div>


]]>logback_doc_manual_05_encodershttp://www.tkk7.com/watchzerg/archive/2014/07/13/415750.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 10:58:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415750.htmlhttp://www.tkk7.com/watchzerg/comments/415750.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415750.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415750.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415750.htmlhttp://logback.qos.ch/manual/encoders.html
Encoder
     负责事件对象{换ؓ字节数组.
     目前只有PatternLayoutEncoder是唯一有用的Encoder?/div>
LayoutWrappingEncoder
     兼容的包装器Q因版本的logback是蟩qEncoder直接依赖Layout的)
PatternLayoutEncoder
     针对PatternLayoutQ最常用的layoutQ定制的兼容包装器?/div>
     immediateFlush属性:是否日志立d入磁盘,默认为true。将q个选项设ؓfalse可以N4?倍的吞吐量?/div>
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
  <file>foo.log</file>
  <encoder>
    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
    <!-- this quadruples logging throughput -->
    <immediateFlush>false</immediateFlush>
  </encoder> 
</appender>
     outputPatternAsHeader属性:在日志文件的剙输出一行字W串样式Q默认flase?/div>
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
  <file>foo.log</file>
  <encoder>
    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
    <outputPatternAsHeader>true</outputPatternAsHeader>
  </encoder> 
</appender>
     输出l果Q?/div>
#logback.classic pattern: %d [%thread] %-5level %logger{36} - %msg%n
2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hello world
2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hi again


]]>logback_doc_manual_06_layoutshttp://www.tkk7.com/watchzerg/archive/2014/07/13/415751.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 10:58:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415751.htmlhttp://www.tkk7.com/watchzerg/comments/415751.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415751.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415751.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415751.htmlhttp://logback.qos.ch/manual/layouts.html
PatternLayout
     转换模式cM于C语言里的printf()?/div>
转移字符Q?/div>
     c{length}
     lo{length}
     logger{length}
          其中的length代表输出的logger长度?/div>
          设ؓ0的话例外Q仅输出最双的logger名?/div>
          其余情况会自动计,量使得输出的dW串长度于指定长度——但是Q最双的logger名称无论如何会完整保留,同时前面的每一UloggerQ最会被精?个字W?/div>
          ——%c{1}
     C{length}
     class{length}
          打印调用者的cdUͼ讄Ҏ与上面一栗?/div>
          性能不高?/div>
     contextName
     cn
          打印logger在event最初绑定的logger context的名U?/div>
     d{pattern}
     date{pattern}
     d{pattern, timezone}
     date{pattern, timezone}
          输入日志旉Q用java.text.SimpleDateFormat的日期格式化Ҏ?/div>
          如果不指定日期格式,默认使用ISO8601Q也是2006-10-20 14:06:49,812q种形式?/div>
          ——%d
     F / file
          输出java源文件的名称?/div>
          性能不高?/div>
     caller{depth}
     caller{depth, evaluator-1, ... evaluator-n}
          打印日志事g的调用堆栈?/div>
          使用评估器evaluator军_是否打印?/div>
     L
     line
          输出日志记录h发v的行数?/div>
          性能不高?/div>
     m
     msg
     message
          日志正文
          ——%m
     M
     method
          日志调用Ҏ名?/div>
          性能不高
     n
          操作pȝ对应的换行符
          ——%n
     p
     le
     level
          日志{
     r
     relative
          应用E序启动到日志创建的相对旉
     t
     thread
          U程?/div>
          ——%t
     X{key:-defaultVal}
     mdc{key:-defaultVal}
          MDC信息
     ex{depth} 
     exception{depth} 
     throwable{depth} 
     ex{depth, evaluator-1, ..., evaluator-n} 
     exception{depth, evaluator-1, ..., evaluator-n} 
     throwable{depth, evaluator-1, ..., evaluator-n}
          输出异常堆栈深度Q如果有的话Q,默认full全部输出?/div>
          可以指定的参数|
               shortQ打印堆栈的W一?/div>
               fullQ打印所有行
               M数字Q指定行?/div>
          使用评估器evaluator军_是否打印?/div>
     xEx{depth} 
     xException{depth} 
     xThrowable{depth} 
     xEx{depth, evaluator-1, ..., evaluator-n} 
     xException{depth, evaluator-1, ..., evaluator-n} 
     xThrowable{depth, evaluator-1, ..., evaluator-n}
          跟上面的cMQ但是附加了包信息?/div>
          如果包信息不准确Q是猜测的)Q那么会自动在包信息前面附加一?#8220;~”字符?/div>
          如果在日志信息模式里Q未指定M异常格式Q那么系l会自动在末֊上一?xEx?/div>
          如果不想打印包信息(例如netbean里会出问题)Q那么在日志模式的末明指?ex卛_Q就会输Z包含包信息的堆栈?/div>
          如果想不打印M异常堆栈信息Q可以?nopex?/div>
          ——%xEx
     nopex 
     nopexception          
          加上%nopex可以Lpȝ自动在日志模式末添?xEx——也就是完全禁止异常堆栈打印?/div>
     marker
          输出兌的marker信息Q如果marker多兌Q会都打印出来?/div>
     property{key}
          输出key兌的属?#8212;—定义在logger context或者system properties里面?/div>
     replace(p){r, t}
          p中的所有符合r正则的字W串Q都替换成t?/div>
          例如%replace(%logger%msg){'\.', '/'}Q会输出的logger和msg信息中的点号都替换成斜杠?/div>
     rEx{depth} 
     rootException{depth} 
     rEx{depth, evaluator-1, ..., evaluator-n} 
     rootException{depth, evaluator-1, ..., evaluator-n}
          cM于xExQ也会打印异常的包信息,但是会将root exception打印到前面,跟普通的异常打印序是反着的?/div>
     转义癑ֈP \%
     正常情况下{义字W会被正分Ԍ但有些时候例外,例如%date%nHelloQ系l会解析%nHellop|。如果真的需要在%n后紧跟一个HelloQ可以这P%date%n{}Hello
     我一般用q个Q?/div>
     %d [%t] %-5p  %c{1} - %m%n
------------------------------------------------------------------
Format modifiers
     控制数据D늚补齐?br />      例如 %20.30logger 
          如果logger长度于20Q则从左边用I格补齐Q如果logger长度大于30Q则从开?左边)切去多余字符?/div>
          如果20或?0前面有负P则左右颠倒?/div>
     假如想给日志U别只输?个字W(T,D,W,I,EQ,不需要自己写一个ConverterQ而只需要配|一下即可:%.-1level
转义选项Q?/div>
     如果转义选项里面包含Ҏ字符Q特别是在用正则表辑ּ的时候)Q例如大括受逗号、空|那么可以用单引号或双引号括v来,例如Q?/div>
          <pattern>%-5level - %replace(%msg){'\d{14,16}', 'XXXX'}%n</pattern>
     ——q个可以?4?6位的数字Q信用卡P转换为XXXX?/div>
------------------------------------------------------------------
括号的特D作用:
     %-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{32} - %msg%n
     可以让括号里的两个表辑ּ联合h按照30个字W补齐?/div>
     括号可以用反斜杠转义Q\(%d{HH:mm:ss.SSS} [%thread]\)
------------------------------------------------------------------
Coloring
     着Ԍwindow需要引其它包,linux和mac os本n支持着艌Ӏ?/div>
     样例Q?lt;pattern>[%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
          %highlight会将ERROR设ؓU色加粗QWARN设ؓU色QINFO设ؓ蓝色Q其余默认?/div>
          %cyan会将logger名称设ؓ蓝绿艌Ӏ?/div>
------------------------------------------------------------------
Evaluators
     EventEvaluatorcȝ实现Q用来评C个事件是否符合打印条件?/div>
  <evaluator name="DISP_CALLER_EVAL">
    <expression>logger.contains("chapters.layouts") &amp;&amp; \
      message.contains("who calls thee")</expression>
  </evaluator>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder>
      <pattern>
        %-4relative [%thread] %-5level - %msg%n%caller{2, DISP_CALLER_EVAL}
      </pattern>
    </encoder>
  </appender>
     注意因ؓxml的关p,要用&amp;转义&
     应用场景Q?/div>
          例如Q如果日志别是WARN以上Qƈ且logger是来自一个胦务模?#8212;—那么打印caller信息?/div>
     注意Q?/div>
          ?caller转义模式中,当Evaluatorsq回true的时候才输出?/div>
          ?ex转义模式中,当Evaluatorstrue的时候不输出?/div>
     例如下面的配|,当异常对象ؓTestExceptionӞ不输出?/div>
  <evaluator name="DISPLAY_EX_EVAL">
    <expression>throwable != null &amp;&amp; throwable instanceof  \
      chapters.layouts.TestException</expression>
  </evaluator>
        
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n%ex{full, DISPLAY_EX_EVAL}</pattern>
    </encoder>
  </appender>
------------------------------------------------------------------
Creating a custom conversion specifier
     ?/div>
------------------------------------------------------------------
HTMLLayout
     使用html表格来布局日志信息?/div>
     可以使用普通的pattern转义W,但{义字W之前,不许用包括空格在内的M字符分隔?/div>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.classic.html.HTMLLayout">
        <pattern>%relative%thread%mdc%level%logger%msg</pattern>
      </layout>
    </encoder>
    <file>test.html</file>
  </appender>
     HTMLLayout会自动创Z个DefaultThrowableRendererQ将异常信息打印到完整的一行里。如果不惌P可以指定一个NOPThrowableRenderer?/div>
用CSS指定表格的样式:?/div>
该Layout最常见的用法是配合SMTPAppenderQ发送html格式的日志邮件?/div>
------------------------------------------------------------------
Logback access
     ?/div>


]]>logback_doc_manual_04_appendershttp://www.tkk7.com/watchzerg/archive/2014/07/13/415749.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 10:57:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415749.htmlhttp://www.tkk7.com/watchzerg/comments/415749.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415749.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415749.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415749.htmlhttp://logback.qos.ch/manual/appenders.html
Appender都集成ch.qos.logback.core.Appender接口?/div>
每个Appender可以l定若干个Filter?/div>
每个Appender可以Q务代理给Layout或者Encoder?/div>
每个Layout或者Encoder只能属于1个Appender?/div>
Appener也可以不包含Layout或者encoderQ例如SocketAppenderQ直接把Event序列化传输?/div>
ch.qos.logback.core.AppenderBaseq是一个抽象类Q对Appender接口提供了骨架实玎ͼU程安全?/div>
ch.qos.logback.core.UnsynchronizedAppenderBase是对应的U程不安全的c,但是可以线E安全性委托给下一层的c(例如OutputStreamQ?/div>
OutputStreamAppender是文件输出和控制台输出Appender的父c,cdơ结构如下:


ConsoleAppender
     输出到System.out or System.err
可配|属性:
     encoder
     target:     默认是System.out
     withJansiQ?    默认falseQ用来在windows中支持控制台色彩?/div>
样例Q?/div>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>
----------------------------------------------------------
FileAppender
     写入到文Ӟ新消息到来,写入前,才会判断是否该分割文件等Q?/div>
可配|属性:
     appendQ?    文gq加Q默认ؓtrue
     encoderQ?    
     fileQ?    文g路径和名词(如果windows下,记得分隔W{义)
     prudentQ?    谨慎模式Q不同JVMQ甚臛_在于不同L上)安全的写入同一个文件。默认关闭?/div>
默认每行都flush到磁盘,可以修改Encoder的immediateFlush属性来改变q一行ؓ?/div>
样例Q?/div>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>testFile.log</file>
    <append>true</append>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
唯一名词的记录文Ӟ通过启动旉戻IQ?/div>
  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>log-${bySecond}.txt</file>
    <encoder>
      <pattern>%logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
——q样可以在每次目启动时生成一个新的文件?/div>
默认是用xml解析的时_也可以指定用log context的创建时_
     <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" 
             timeReference="contextBirth"/>
----------------------------------------------------------
RollingFileAppender
     滚动记录日志文g
     有两个子lgQ?/div>
          RollingPolicy ——接管“滚动”操作Q控制该操作如何发生
          TriggeringPolicy ——军_滚动操作是否发生Q何时发?/div>
     默认情况下,必须同时含有上述两个lg。不q有的RollingPolicy也实C后者的接口Q那么可以n?职?/div>
可配|属性:
     fileQ?/div>
     appendQ?/div>
     encoderQ?/div>
     rollingPolicyQ?/div>
     triggeringPolicyQ?/div>
     prudentQ?/div>
RollingPolicy
     包含的操作:当前的日志文g归档Qƈ重命名)Q压~(如果需要)
TimeBasedRollingPolicy
     最常用的,Z旉滚动Q同时实CRollingPolicy和TriggeringPolicy
     可配|属性:
          fileNamePatternQ?    文g名匹配格?/div>
               文g?日期定义?#8220;%d”
               日期定义器的格式在SimpleDateFormat中定?/div>
               滚动周期是通过日期定义器推断出来的
               其父元素RollingFileAppender中file属性可以省略(因ؓ可以用fileNamePattern猜测出当前时间的日志名)
                    也可以不省略Q这样可以ؓ“当前日志文g”?#8220;归档日志文g”分别制定不同的\?/div>
               日志定义器中的正反斜杠都会被认ؓ是目录分隔符
               可以指定多个日期定义器,但只能有1个是主要的,其余的必LCؓauxQ辅助的Q?/div>
          maxHistoryQ?    最大文件数
          cleanHistoryOnStartQ?    启动时清除历史归档日?/div>
     对fileNamePattern的更详细的解释和CZQ?/div>
          /wombat/foo.%d   
               按天分隔日志
               未指定格式,所以默认ؓyyyy-MM-ddQ按天滚动)
               如果在RollingFileAppender中指定了fileQ默认日志文件名Q:
                    今天日志?/wombat/foo.2006-11-24
                    昨天日志?/wombat/foo.2006-11-23
               如果没有在RollingFileAppender中指定file?#8220;/wombat/foo.txt”Q?/div>
                    今天日志?/wombat/foo.txt
                    昨天日志?/wombat/foo.2006-11-23
               ——其实不指定默认日志文件名的方式更好,因ؓ避免了滚动时重命名操作,也就避免了潜在异常?/div>
          /wombat/%d{yyyy/MM}/foo.txt
               ?#8220;q??#8221;分两U文件夹Q文件名固定?#8220;foo.txt”
               如果在RollingFileAppender中指定了fileQ默认日志文件名Q:
                    2006q?0月日志ؓ /wombat/2006/10/foo.txt
                    2006q?1月日志ؓ /wombat/2006/11/foo.txt
               如果没有在RollingFileAppender中指定file?#8220;/wombat/foo.txt”Q?/div>
                    当前正在写的日志永远?nbsp;/wombat/foo.txt
                    归的日志格式ؓ /wombat/2006/10/foo.txt
          /wombat/foo.%d{yyyy-ww}.log
               每个星期归档一个新文gQ注意具?#8220;哪天是一个星期的W一?#8221;取决于系llocale属性)
          /wombat/foo%d{yyyy-MM-dd_HH}.log
               每小时一ơ归?/div>
          /wombat/foo%d{yyyy-MM-dd_HH-mm}.log
               每分钟一ơ归?/div>
          /foo/%d{yyyy-MM,aux}/%d.log
               每天一ơ归档,但每个月一个新文g?/div>
               
     如果fileNamePattern文g名是?gz或?zipl尾的,那么TimeBasedRollingPolicy会自动压~:
          /wombat/foo.%d.gz
     日志归?#8220;记录日志的事?#8221;触发的,所以有一定gq。例如第二天的第一条日志是临晨01:00才过来,那么q个时候才会归前一天的日志?/div>
配置样例Q?/div>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
----------------------------------------------------------
FixedWindowRollingPolicy
     可配|属性:
          minIndex:
          maxIndex:
          fileNamePattern:     
               必须包含“%i”占位W,用来表示当前烦引值插入什么位|?/div>
               例如“MyLogFile%i.log”配合“最?Q最?”Q表C文件名为:MyLogFile1.log, MyLogFile2.log, MyLogFile3.log
               同样加上zip或gz后缀可以启用压羃
     因ؓ每次需要很多重命名操作Q重命名ơ数{于window sizeQ,所以如果设|size过20Q会被强制指定ؓ20.
     配置样例Q?/div>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
----------------------------------------------------------
SizeAndTimeBasedFNATPQFile Naming And Triggering PolicyQ?#8212;—是TimeBasedRollingPolicy的一个子lg
     配置样例Q?/div>
  <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>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>
     ——每天滚动一个文Ӟ如果文g体积辑ֈ100MQ则也拆分?/div>
     ——也支持自动删除老文Ӟ可以通过maxHistory指定保存的最多文件数Q每天最多这么多Q还是一共最多这么多Q)
----------------------------------------------------------
SizeBasedTriggeringPolicy——一般配合FixedWindowRollingPolicy使用
     指定文g过“maxFileSize”指定大小Ӟ上层RollingFileAppender触发滚动操作?/div>
     默认“10MB”Q可以指定各U后~QKB,MB,GB
----------------------------------------------------------
----------------------------------------------------------
SocketAppender and SSLSocketAppender
以及后面关于|络Q数据库Q远E日志服务器QJNDI{?#8230;…省略……
----------------------------------------------------------
SiftingAppender
     可以Ҏ指定的变量分割文件。例如根据用户IDQ则每个用户一个日志文件?/div>
     
     可配|参敎ͼ
          timeoutQ如果一个关联的appender如果过默认30分钟没有被访问,则被SiftingAppender卸蝲掉?/div>
          maxAppenderCountQ可以最大追t的兌appender数量Q默认int最大倹{?/div>
     q个Appener会把日志记录动作代理l关联的appender?/div>
     选择条g由Discriminator指定Q默认ؓMDCBasedDiscriminator?/div>
     CZQ假讑ֺ用程序这栯|了MDC信息Q?/div>
logger.debug("Application started");
MDC.put("userid", "Alice");
logger.debug("Alice says hello"); 
     然后q样配置Q?/div>
  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <!-- in the absence of the class attribute, it is assumed that the
         desired discriminator type is
         ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
    <discriminator>
      <key>userid</key>
      <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
      <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender">
        <file>${userid}.log</file>
        <append>false</append>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
        </layout>
      </appender>
    </sift>
  </appender>          
     因ؓ定timeout和maxAppenderCount比较困难Q所以如果程序可以知?#8220;执行到某个地方很可能应该关闭对应的appender”Q那么可以明指定一个FINALIZE_SESSION的marker。这样siftingAppender兌的对应appenderQ会在接到这个marker的几U钟后关闭。例如:
import static ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;
  void job(String jobId) {
    MDC.put("jobId", jobId);
    logger.info("Starting job.");
    
    // will cause the nested appender reach end-of-life. It will
    // linger for a few seconds.
    logger.info(FINALIZE_SESSION_MARKER, "About to end the job");
    try {
      .. perform clean up
    } catch(Exception e);  
      // This log statement will be handled by the lingering appender. 
      // No new appender will be created.
      logger.error("unexpected error while cleaning up", e);
    }
  }
----------------------------------------------------------
SMTPAppender
     日志事件缓存指定的数量Q被特定事g触发后,异步发送邮件?/div>
          smtpHost     
          smtpPort     默认25
          to          发送目标,多个联系人可以用逗号隔开Q也可以用多?lt;to>元素
          from      发送者邮,如果惛_含名字,可以用特定格?#8220;Adam Smith &lt;smith@moral.org&gt;”
          subject     邮g标题Q可以用PatternLayout的{义字W,会用“触发该邮件的日志事g”的信息替换{义字W?/div>
          discriminator     默认只有一个缓存。通过指定该属性,可以有多个缓存,q样可以Ҏ事g信息发给不同的h或者ip
          evaluator     声明一?lt;EventEvaluator/>元素Q通过class属性指定类型。默认ؓOnErrorEvaluatorQ也可以自己指定OnMarkerEvaluator,JaninoEventEvaluator,GEventEvaluator
          cyclicBufferTracker     环Ş~存跟踪器,Zdiscriminator的返回值工作。默认保存缓存大ؓ256
          username     
          password     
          STARTTLS     如果开启,会发起STARTTLS命oQ导致连接{换ؓSSL。连接默认是不用加密的。默认ؓfalse
          SSL          如果开启,那么使用SSLq接。默认false?/div>
          charsetEncoding     默认UTF-8
          localhost     如果SMTP发送方的hostname没配|好Q邮件服务器可能拒绝hQ这个时候可以设|这个gؓ客户端全名?/div>
          asynchronousSending     异步发送,默认true。特定情况下需要设|ؓfalseQ例如应用程序发送完邮g׃立即关闭?/div>
          includeCallerData     包含调用者信息,默认为false?/div>
          sessionViaJNDI     logback依赖javax.mail.Session来发送邮件。该属性默认ؓfalseQSMTPAppender会根据配|构建新的Session。如果设为trueQ会去web容器LSession对象Q此时应用程序不应该再依赖mail.jar{?/div>
          jndiLocation     查找JNDI的\径,例如"java:comp/env/mail/Session"
     最多保?56条日志事Ӟ否则内存消耗太大(不徏议自己指定其它|?/div>
     发邮件依赖JavaMail API (mail.jar)和JavaBeans Activation Framework (activation.jar) ——maven里引入前者会自动依赖后者?/div>
     发送者和接收者都可以是动态属性:
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
  <smtpHost>${smtpHost}</smtpHost>
  <to>${to}</to>
  <from>${from}</from>
  <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
</appender>
     注意上面的layout也可以用patternLayoutQ?/div>
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>%date %-5level %logger{35} - %message%n</pattern>
    </layout>
触发事gQ?/div>
     默认是OnErrorEvaluatorQ但可以自己定制。SMTPAppender仅维护一个EvaluatorQ这个Evaluator可以自己l护状态,例如可以实现一个CounterBasedEvaluator?/div>
     
Z标记Marker的事件触发:
Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
logger.error(notifyAdmin,
  "This is a serious an error requiring the admin's attention",
   new Exception("Just testing"));
  <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
      <marker>NOTIFY_ADMIN</marker>
      <!-- you specify add as many markers as you want -->
      <marker>TRANSACTION_FAILURE</marker>
    </evaluator>
  </appender>
q可以用更加通用的JaninoEventEvaluator或者GEventEvaluatorQ他们提供更复杂更强大的甄别功能Q也包含了OnMarkerEvaluator的功能)?/div>
w䆾验证/STARTTLS/SSL
     SMTPAppender支持用户名和密码的加密验证?/div>
     STARTTLS方式是先使用非加密方式徏立连接,然后切换到SSLQ常用于server-server交互Q?/div>
     SSL方式是直接徏立SSLq接Q一般用于client-sever交互Q?/div>
Appender configuration for Gmail (SSL)
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    <smtpHost>smtp.gmail.com</smtpHost>
    <smtpPort>465</smtpPort>
    <SSL>true</SSL>
    <username>YOUR_USERNAME@gmail.com</username>
    <password>YOUR_GMAIL_PASSWORD</password>   
  </appender>
SMTPAppender for Gmail (STARTTLS)
  <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    <smtpHost>smtp.gmail.com</smtpHost>
    <smtpPort>587</smtpPort>
    <STARTTLS>true</STARTTLS>
    <username>YOUR_USERNAME@gmail.com</username>
    <password>YOUR_GMAIL_xPASSWORD</password>    
  </appender>
Discriminator
     用MDCBasedDiscriminator做示例,ҎMDC的|l护多个~存
  <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    <discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
      <key>req.remoteHost</key>
      <defaultValue>default</defaultValue>
    </discriminator>
    <subject>${HOSTNAME} -- %X{req.remoteHost} %msg"</subject>
    <layout class="ch.qos.logback.classic.html.HTMLLayout">
      <pattern>%date%level%thread%X{req.remoteHost}%X{req.requestURL}%logger%msg</pattern>
    </layout>
  </appender>
     上面的例子先利用了MDCInsertingServletFilter把请求方的hostname或ip讄到MDC中?/div>
     每一个remoteHost都有一个自qbufferQ一旦某个remoteHost触发了发送邮件的hQ那么该buffer里的256条信息会被发送出厅R?/div>
Buffer理Q?/div>
     上面的例子,每一个远E地址都有自己的bufferQ会极大的消耗内存?/div>
     默认情况下,logback内部最多允?4个buffer同时存在QLRU法换出。超q?0分钟未用的buffer也会被换出。该值可以通过maxNumberOfBuffers来设|?br />
          q里有问题,通过各种手段都无法设|此|貌似是个bugQ我在尽我所能查遍所有资料后Q在stackoverflowh和官方jira上提了这个问题:
     在高强度pȝ中,上面?个保护机制不够,需要加入手工管理:通过明确指定“FINALIZE_SESSION”q个MarkerQ来告诉logback去释攑֯应的bufferQ这样就可以安全的将maxNumberOfBuffers讄?12乃至1024。(具体讄办法参照SiftingAppender里描q的Q?/div>
q里是官方的一个SMTPAppender的例子:
注意Marker可以叠加Q所以如果有必要Q可以把“发送邮件的Marker”?#8220;l结SessionQ以便清理bufferQ的Marker”兌在一赗?/div>
     Marker SMTP_TRIGGER = MarkerFactory.getMarker("SMTP_TRIGGER");
     SMTP_TRIGGER.add(FINALIZE_SESSION_MARKER);
----------------------------------------------------------
AsyncAppender
     cM于单独的一个事件分发器Q所以必d用另一个appender?/div>
     用一个BlockingQueue~冲事gQ然后创Z个线E,从队列里获取事gq分发给引用的appender?/div>
     默认情况下,如果队列辑ֈ80%的容量,则丢弃TRACE,DEBUG,INFOU别的日志?/div>
     应用E序停止的时候,会通知LoggerContext停止Q在停止各个AppenderӞAsyncAppender会停止接收日志,q将信息flush到磁盘?/div>
     配置参数Q?/div>
          queueSizeQ默?56
          discardingThresholdQ默认队?0%可用的时候开始选择性抛弃信息,设ؓ0表示不抛?/div>
          includeCallerDataQ是否包括调用者信息(重开销Q,默认只复制线E名和MDC信息Q因为切换了U程Q其余信息会丢失Q?/div>
     队列全满的时候,写日志动作会被blockQ直到队列有可用I间?/div>
----------------------------------------------------------
自定义Appender
     ?/div>
----------------------------------------------------------          
----------------------------------------------------------
Logback Access
     大部分AppenderQ在logback-classic与logback-access中用方式类伹{?/div>




]]>logback_doc_manual_03_configurationhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415748.html王星?/dc:creator>王星?/author>Sun, 13 Jul 2014 10:56:00 GMThttp://www.tkk7.com/watchzerg/archive/2014/07/13/415748.htmlhttp://www.tkk7.com/watchzerg/comments/415748.htmlhttp://www.tkk7.com/watchzerg/archive/2014/07/13/415748.html#Feedback0http://www.tkk7.com/watchzerg/comments/commentRss/415748.htmlhttp://www.tkk7.com/watchzerg/services/trackbacks/415748.html
-------------------------------------------------------
与spring的配|:
貌似官网上没有介l,但是作者在github上徏立了一个扩展项目用于logback与springl合?/div>
目前最新版本是0.1.2Q很多maven公开库里已经有了?/div>
maven配置Q?/div>
<dependency>  
     <groupId>org.logback-extensions</groupId>  
     <artifactId>logback-ext-spring</artifactId>  
     <version>0.1.2</version>  
</dependency>
web.xml配置日志框架启动监听器:
<!-- logback配置文g -->
<context-param>
     <param-name>logbackConfigLocation</param-name>
     <param-value>/WEB-INF/classes/logback.xml</param-value>
</context-param>
<!-- logback加蝲监听?-->
<listener>
     <listener-class>
          ch.qos.logback.ext.spring.web.LogbackConfigListener
     </listener-class>
</listener>
-------------------------------------------------------
logback中的配置Q?/div>
可以用javaE序配置Q也可以用xml或者groovy脚本配置?/div>
使用 http://logback.qos.ch/translator/ 可以把log4j的配|自动{换过来?/div>
logback内部查找配置的过E:
     1Q在classpath查找“logback.groovy”
     2Q在classpath查找“logback-test.xml”
     3Q在classpath查找“logback.xml”
     4Q用自w的BasicConfigurator做基本配|,所有日志被输出到控制台?/div>
     —— 一般把“logback-test.xml”攑ֈmaven的测试\径,?#8220;logback.xml”攑ֈmaven的正式\径,前者优先更高?/div>
logback的状态,加蝲配置文g的过E:
     代码打印Q?/div>
          LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
          StatusPrinter.print(lc);
     配置文g形式打印Q?/div>
          <configuration debug="true">
            ... 
          </configuration>
     也可以通过讄StatusListener来监听logback的启动和打印状?#8212;—在生产环境挺有用Q因为配|文件\径挺深?/div>
通过在系l变量里加入"logback.configurationFile"指定logback配置文g路径Q?/div>
     java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1
讄自动扫描和遇到变更时重新加蝲配置文gQ不指定周期的话默认?分钟Q:
     <configuration scan="true" scanPeriod="30 seconds"> 
       ... 
     </configuration> 
     每当N个(logback会自动调节)日志hQlogback会检查一下扫描周期是否已l到达,如到辑ֆ查配|文件?/div>
通过web讉K状态信息:
在web.xml配置Q?/div>
     <servlet>
         <servlet-name>ViewStatusMessages</servlet-name>
         <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>
      </servlet>
      <servlet-mapping>
         <servlet-name>ViewStatusMessages</servlet-name>
         <url-pattern>/lbClassicStatus</url-pattern>
      </servlet-mapping>
然后讉KQhttp://host/yourWebapp/lbClassicStatus
注册控制台状态监听器Q?/div>
     java代码方式Q?/div>
          LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
          StatusManager statusManager = lc.getStatusManager();
          OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener();
          statusManager.add(onConsoleListener);
     用配|文件方式:
          <configuration>
            <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
            ...
          </configuration>
     pȝ变量方式Q?/div>
          java -Dlogback.statusListenerClass=ch.qos.logback.core.status.OnConsoleStatusListener
停止logbackQ?/div>
     java代码方式Q?/div>
          LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
          loggerContext.stop();
     web应用Q?/div>
          ServletContextListener.contextDestroyed()会自动调用上面的stopҎ?/div>
-------------------------------------------------------
配置文g格式Q?/div>
     最外层?lt;configuration>元素Q里面有<appender><logger><root>元素
<logger>元素Q?/div>
     level属性可以这些|TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFFQ也可以明确指定l承QINHERITED或者NULL
     包含若干<appender-ref>元素Q指定appender的名字?/div>
从DEBUG改ؓINFOU别Q?/div>
<configuration>
  <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} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <logger name="chapters.configuration" level="INFO"/>
  <!-- Strictly speaking, the level attribute is not necessary since -->
  <!-- the level of the root level is set to DEBUG by default.       -->
  <root level="DEBUG">          
    <appender-ref ref="STDOUT" />
  </root>  
</configuration>
-------------------------------------------------------
配置AppenderQ?/div>
     name和class属?/div>
     内嵌0个或1个layout元素Q?个或多个encoder元素Q?个或多个filter元素。还可以内嵌L数量的appdentercȝ属性(例如自定义的appenderc)?/div>
     layout元素应该内嵌具体的layoutc,但是默认是PatternLayoutEncoder?/div>
Appender的篏加性:
     logger会记录在所有绑定在它自w的appenderQ同时也会记录在该logger先的appender上,所以有可能重复记录Q?/div>
配置Logger ContextQ可以用?#8220;多个目写入同一个日志文?#8221;q种情况Q:
<configuration>
  <contextName>myAppName</contextName>
  ...
</configuration>
-------------------------------------------------------
变量替换Q?/div>
<configuration>
  <property name="USER_HOME" value="/home/sebastien" />
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${USER_HOME}/myApp.log</file>
    ...
  </appender>
   ...
</configuration>
——上面的变量定义在pȝ属性里也可以:java -DUSER_HOME="/home/sebastien" MyApp2
变量也可以定义在文g里:
<configuration>
  <property file="src/main/java/chapters/configuration/variables1.properties" />
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
     <file>${USER_HOME}/myApp.log</file>
     ...
   </appender>
   ...
</configuration>
——对应路径的文仉应该加入“USER_HOME=/home/sebastien”
Q这路径异啊Q是maven的结构,那打包后岂不是不能用了?Q?/div>
像这样引用classpath的还靠谱些:
<property resource="resource1.properties" />
变量可以指定作用域:localQcontextQsystem
变量可以怺引用Q?/div>
     USER_HOME=/home/sebastien
     fileName=myApp.log
     destination=${USER_HOME}/${fileName}
命名引用Q如?userid"会被替换?alice"Q那?${${userid}.password}"会被替换?alice.password"对应的倹{?/div>
变量可以指定默认|${aName:-golden}  ——q就指定了默认值golden
变量的默认g可以引用变量Q?nbsp;"${id:-${userid}}
预置变量QHOSTNAME,CONTEXT_NAME
可以通过timestamp元素定义一个当前的日期和时间的动态元素?/div>
可以自己l承PropertyDefiner实现动态生成属性,现在内置?个动态属性生成器Q?/div>
     FileExistsPropertyDefiner     如果指定路径文g存在Q则指定属性设?#8220;true”Q反之亦?/div>
     ResourceExistsPropertyDefiner     如果指定资源存在Q则指定属性设?#8220;true”Q反之亦?/div>
条g语句Q?/div>
   <!-- if-then form -->
   <if condition="some conditional expression">
    <then>
      ...
    </then>
  </if>
  <!-- if-then-else form -->
  <if condition="some conditional expression">
    <then>
      ...
    </then>
    <else>
      ...
    </else>    
  </if>
判断条g只支持context变量和system变量Q用property()或者p()来引?#8212;—如果没有讑֮对应变量Q这两个Ҏ会返回空Ԍ而不是nullQ?/div>
isDefine()和isNull()分别判断变量是否讄和变量是否ؓI?/div>
     <if condition='property("HOSTNAME").contains("torino")'>
     ...
     </if>
可以从JNDId变量|作用域ؓlocalQ。也可以从JNDId的变量存入另一个不同作用域的变量?/div>
     <configuration>
       <insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />
       ...
     </configuration>
-------------------------------------------------------
文g包含Q可以用相对\径。当前\径已l在当前目中定义,所以没必要与配|文件\径关联)Q?/div>
<configuration>
  <include file="src/main/java/chapters/configuration/includedConfig.xml"/>
  ...
</configuration>     
被包含的文g必须?lt;include>标签包裹Q?/div>
<included>
  <appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>"%d - %m%n"</pattern>
    </encoder>
  </appender>
</included>
q可以关联资源(例如classpath下的某个文gQ:
     <include resource="includedConfig.xml"/>
q可以关联URLQ?/div>
     <include url="http://some.host.com/includedConfig.xml"/>
可以指定此次文g包含?#8220;可选的”Q?/div>
     <include optional="true" ..../>
-------------------------------------------------------
LoggerContextListener
其中一个实现LevelChangePropagator会监听日志环境的合适的生命周期Qƈ把日志别的变化传播lJULQ这样JUL关闭的日志不会再传递给slf4jQ用q种方式Ҏ能冲击较小Q适合jul-to-slf4j的桥接包?/div>


]]> վ֩ģ壺 ߿Ƭ˳Ƶڵ| AV뾫Ʒ| ûվɫƵѹۿ| þô | Ʒѹۿ| þòþüӰԺwwwձ| ۺһ| ޾Ʒר| һAV| ҹŮëƬѹۿ| Ĺѹۿ߲| ɫҹƵѲ| ҹػaëƬѲ| ձþþҹƷ| Ƶ߹ۿվ| VA߹ۿ| Ļ| պVAĻ| avtt| www޾Ʒþþ | 18ҹ˿| ۺһպ| avһ| ޹˾žۺ| ۺۺ| ɫһ| þþƷa޹v岻| VAĻëƬ| ޹պƵ| ۺϾþϵ| ۺ޹һҳ| ٸ| Ļֻ | ƵƷһ| ҹƬ69| һa| ŮҰbbwbbw| պaƵ| 99þѾƷɫƬ| Ů˸߳Ƶ߹ۿ| 99ѹۿ|