目录
配置文件的优先级
- 优先找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。