logback的架构
logback-core:基础模块, 为其它的两个模块提供支持
logback-classic:是log4j的改进版本, 并且此模块实现了slf4j api, 所以可以很容易切换至其它日志框架。
如何使用
logback-classic模块所需的依赖:slf4j-api.jar, logback-core.jar, logback-classic.jar
日志级别
TRACE < DEBUG < INFO < WARN < ERROR
方法打印以及基本选择原则
根据定义,打印的方法决定的日志的级别。例如:L 是一个 logger 实例,L.info("...")
的日志级别就是 INFO。
如果一条的日志的打印级别大于 logger 的有效级别,该条日志才可以被打印出来。这条规则总结如下:
- 日志的打印级别为 p,Logger 实例的级别为 q,如果 p >= q,则该条日志可以打印出来。
- 日志的实例级别:对于一个给定名为L的logger,它的有效层级为从自身一直回溯到root logger, 直到找到第一个不为空的层级作为自己的层级。root logger的默认级别为 debug
logback 的配置
配置文件中使用变量
直接定义
<configuration>
<property name="USER_NAME" value="/data/logs" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_NAME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
将多个变量配置在一个文件中
<configuration>
<property file="F:projectlogback-examplessrcmain
esourcesvariables1.properties"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
variables1.properties:
USER_HOME=/data/logs
使用classpath中的文件
<configuration>
<property resource="resource1.properties" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
变量的默认名
在某些情况下,如果某个变量没有被声明,或者为空,默认值则非常有用。在 bash shell 中,默认值可以通过 ":-" 来指定。例如:假设变量 aName 没有被定义,"${aNme:-golden}" 会被解释成 "golden" 。
filter过滤器
-
使用情况1:我只想把
info
级别的日志写入到名为logFile-info.log
文件中:<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logFile-info.log</file> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 按天轮转 --> <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 保存 30 天的历史记录,最大大小为 30GB --> <maxHistory>30</maxHistory> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> <encoder> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern> </encoder> </appender>
在此情况下,文件中只有
info
级别的日志,即使warn、error级别高于info也不会打印 -
使用情况2:我想把
info
级别以上的日志都写入到文件中:<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>logFile-info.log</file> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 按天轮转 --> <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 保存 30 天的历史记录,最大大小为 30GB --> <maxHistory>30</maxHistory> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> <encoder> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</Pattern> </encoder> </appender>
在此情况下,高于info级别的日志信息会保存在文件中。它们之间的区别在于
标签中的class