Logback 是一个稳定、高效、快速的 Java 日志框架,作为 log4j 的改良版,它与 log4j 相比拥有更多特性,也带来了很大的性能提升,具体改进可以查看官方文档。
Logback 主要分为三个模块
Logback 启动加载时会按一下顺序查找配置文件
当查找到任意一项配置存在后就不进行后续扫描了,会使用该配置文件进行初始化,如果没有查找到配置文件,Logback会创建一个向控制台输出日志的配置。
configuration 是配置文件的根节点,有三个属性:
配置代码:
<configuration scan="true" scanPeriod="60 second" debug="true"> </configuration>
每个 logger 都关联到 logger 上下文,默认上下文名称为 “default”。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
配置代码:
<contextName>new context name</contextName>
property 是用来定义变量的标签,设置之后可以用 ${变量名} 访问,有三个属性:
配置代码:
<!-- name value 形式 -->
<property name="APP_Name" value="MyApp"/>
<contextName>${APP_Name}</contextName>
<!-- file 形式 -->
variables.properties:
APP_Name=MyApp
LOG_PATH=logs
<property file="src/main/java/config/variables.properties" />
<contextName>${APP_Name}</contextName>
<!-- resource 形式 -->
variables.properties:
APP_Name=MyApp
LOG_PATH=logs
<property resource="variables.properties" />
<contextName>${APP_Name}</contextName>
logger 用来设置某一个类或者某个包的日志输出级别、以及输出位置(指定 appender),有三个属性:
logger 通过设置子节点 appender-ref 来指定日志输出位置,一个 logger 可以设置多个 appender-ref
配置代码:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>[%d{HH:mm:ss.SSS}] [%5level] [%thread] %logger{36} %msg%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="X" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<logger name="X.Y" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
root 是一个特殊的 logger , 是所有 logger 的根节点,因为已经被命名为 root 同时也没有父级别,所以只有一个属性 level,默认为 DEBUG
配置代码:
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC"/>
</root>
level 继承示例1:
| logger name | level | 实际 level |
|---|---|---|
| root | DEBUG | DEBUG |
| X | 未设置 | DEBUG |
| X.Y | 未设置 | DEBUG |
| X.Y.Z | 未设置 | DEBUG |
示例1只有 root 设置了一个级别,X,X.Y 和 X.Y.Z 这三个 logger 未设置日志输出级别,因此向上继承 root 的级别,即 DEBUG
level 继承示例2:
| logger name | level | 实际 level |
|---|---|---|
| root | ERROR | ERROR |
| X | INFO | INFO |
| X.Y | DEBUG | DEBUG |
| X.Y.Z | WARN | WARN |
示例2所有 logger 都设置了一个日志级别,等级继承不起作用。
level 继承示例3:
| logger name | level | 实际 level |
|---|---|---|
| root | DEBUG | DEBUG |
| X | INFO | INFO |
| X.Y | 未设置 | INFO |
| X.Y.Z | WARN | WARN |
示例3 X.Y 没有设置日志级别,向上继承最近一个有日志级别的 logger X 的值。
level 继承示例4:
| logger name | level | 实际 level |
|---|---|---|
| root | DEBUG | DEBUG |
| X | INFO | INFO |
| X.Y | 未设置 | INFO |
| X.Y.Z | 未设置 | INFO |
示例4 X.Y 和 X.Y.Z 没有设置日志级别,向上继承最近一个有日志级别的 logger X 的值。
appender 是负责写日志的组件,有两个属性(使用时都必须配置):
appender 可以包含零个或一个 layout ,零个或多个 encoder 元素以及零个或多个 filter 元素。除了这三个元素之外,还可以包含与 appender 类的 JavaBean 属性相对应的任意数量的元素,如: file 指定日志文件名称。
appender 常用的有以下几种:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
<target>
System.err
</target>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<!-- set immediateFlush to false for much higher logging throughput -->
<immediateFlush>true</immediateFlush>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<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>
<!-- 保留最近30天的日志文件 -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<!-- 基于文件大小和时间的滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 每天生成日志文件 -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- 每个日志文件最多 100MB, 保留 60 天, 最多 20 GB-->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<!-- 异步输出 -->
<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref ="FILE"/>
</appender>
<logger name="X" level="DEBUG">
<appender-ref ref="ASYNC" />
</logger>