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>