目录
    
    
    
    
     配置文件的优先级
    
   
- 优先找classPath下的logback-test.xml文件。
- 如果找不到,再找classPath下的logback.groovy文件。
- 如果找不到,再找classPath下的logback.xml 文件。
- 
     如果找不到,再找SPI机制下
 
 com.qos.logback.classic.spi.Configurator
 
 接口的实现类。
- 
     如果没有SPI机制下
 
 com.qos.logback.classic.spi.Configurator
 
 接口的实现类,使用logback中的默认实现类
 
 BasicConfigurator
 
 。它将日志内容输出到控制台上。
     
   
    这里再额外说明下,如果你使用
    
     java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1
    
    这种
    
     方式启动
    
    ,则可以使用你想要的任意配置文件创建logContext,这在帮助你学习logback时是非常有用的。
   
    
    
    configuration的debug属性
   
<configuration debug="true"> 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are  by default assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
    debug属性,会使应用启动时在控制台上打印出 context上下文的加载处置情况。等效于代码
    
     StatusPrinter.print(logContext)
    
    , 也等效于配置文件中配置
    
     statusListener
    
    标签,如下
   
<configuration>
  <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
  ... the rest of the configuration file  
</configuration>
    
    
    当然,
    
     logback.debug
    
    系统属性生效优先级高于配置文件debug属性,但是这是基于存在配置文件的前提下的, 参考一下
    
     logback历史上一个修复的issue
    
    。我们看看logback内部加载行为状态是什么样的。
   
21:28:23,474 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
21:28:23,474 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
21:28:23,475 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/Users/ruchen/IdeaProjects/java-framework/java-logback/target/classes/logback.xml]
21:28:23,547 |-INFO in ch.qos.logback.core.joran.action.ImplicitModelAction - Assuming default class name [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for tag [encoder]
21:28:23,548 |-INFO in ch.qos.logback.core.joran.action.ImplicitModelAction - Assuming default class name [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for tag [encoder]
21:28:23,548 |-INFO in ch.qos.logback.core.joran.action.ImplicitModelAction - Assuming default class name [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for tag [encoder]
21:28:23,625 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler@17ed40e0 - Setting level of logger [CONSOLE_LOGGER] to DEBUG
21:28:23,625 |-INFO in ch.qos.logback.classic.model.processor.LoggerModelHandler@50675690 - Setting level of logger [CONSOLE_LOGGER1] to DEBUG
21:28:23,625 |-INFO in ch.qos.logback.classic.model.processor.RootLoggerModelHandler@31b7dea0 - Setting level of ROOT logger to DEBUG
21:28:23,626 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@47d384ee - Processing appender named [ROOT]
21:28:23,626 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@47d384ee - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
21:28:23,649 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1784662007 - No compression will be used
21:28:23,651 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@1784662007 - Will use the pattern logback.log.%d{yyyy-MM-dd} for the active file
21:28:23,654 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'logback.log.%d{yyyy-MM-dd}'.
21:28:23,654 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
21:28:23,656 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Sat Dec 05 21:18:32 CST 2020
21:28:23,669 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROOT] - Active log file name: logback.log
21:28:23,669 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROOT] - File property is set to [logback.log]
21:28:23,669 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@47d384ee - Attaching appender [ROOT] to Logger[ROOT]
21:28:23,670 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@13c78c0b - Processing appender named [CONSOLE]
21:28:23,670 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@13c78c0b - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
21:28:23,672 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@13c78c0b - Attaching appender [CONSOLE] to Logger[CONSOLE_LOGGER]
21:28:23,672 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@337d0578 - Processing appender named [CONSOLE1]
21:28:23,672 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@337d0578 - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
21:28:23,672 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler@337d0578 - Attaching appender [CONSOLE1] to Logger[CONSOLE_LOGGER1]
21:28:23,675 |-INFO in ch.qos.logback.core.model.processor.DefaultProcessor@6276ae34 - End of configuration.
21:28:23,675 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@5cc7c2a6 - Registering current configuration as safe fallback point
    
    
    configuration的scan属性
   
    logback配置文件一旦发生变化,logback支持重新加载文件,这是基于logback框架中一个后台
    
     线程
    
    实现的。默认情况下,logback一分钟加载一次,你可以改写,比如通过下面的方式
   
<configuration scan="true" scanPeriod="30 seconds" > 
</configuration> 
    
    
    appender累积规则
   
     
   
    
    
    level继承规则
   
     
   
     
   
    
    
    
     logger的additivity属性
    
   
<configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>foo.log</file>
    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
    </encoder>
  </appender>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>
  <logger name="chapters.configuration.Foo" additivity="false">
    <appender-ref ref="FILE" />
  </logger>
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
    默认情况下,logger的
    
     additivity
    
    属性为true。就图中这个配置文件,如果不配置该属性为false,会导致 name声明为
    
     chapters.configuration.Foo
    
    的logger在输出日志时 控制台 和 文件各输出一份,因为logger存在继承行为。
   
    当该属性为false时,直接阻断了logger中appender的累加行为(cumulative behaviour),声明 name声明为
    
     chapters.configuration.Foo
    
    的logger不再输出到console,只有文件。
   
    
    
    
     变量替代&作用域
    
   
    变量替代比较常见,不再赘述。作用域提一下,scope主要有
    
     local
    
    ,
    
     context
    
    ,
    
     system
    
    。
    
    优先级 local > context > system, 也就是说优先取local中的变量值,找不到才找context,最后找system。
   
 
