Logback 是一个稳定、高效、快速的 Java 日志框架,做为 log4j 的改良版,它与 log4j 相比拥有更多特性,也带来了很大的性能提高,具体改进能够查看官方文档。html
Logback 主要分为三个模块java
Logback 启动加载时会按一下顺序查找配置文件bash
当查找到任意一项配置存在后就不进行后续扫描了,会使用该配置文件进行初始化,若是没有查找到配置文件,Logback会建立一个向控制台输出日志的配置。app
configuration 是配置文件的根节点,有三个属性:框架
配置代码:异步
<configuration scan="true" scanPeriod="60 second" debug="true">
</configuration>
复制代码
每一个 logger 都关联到 logger 上下文,默认上下文名称为 “default”。但可使用<contextName>设置成其余名字,用于区分不一样应用程序的记录。一旦设置,不能修改。性能
配置代码:ui
<contextName>new context name</contextName>
复制代码
property 是用来定义变量的标签,设置以后能够用 ${变量名} 访问,有三个属性:spa
配置代码:debug
<!-- 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>
复制代码