Logback 主要由三个模块组成:
- logback-core
- logback-classic
- logback-access
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.0.11</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.11</version> </dependency>
在 logback 里,最重要的三个类分别是
- Logger
- Appender
- Layout
Logger:
logger 的 name 格式决定了多个 logger 能够组成一个树状的结构,为了维护这个分层的树状结构,每个 logger 都被绑定到一个 logger 上下文中,这个上下文负责厘清各个 logger 之间的关系。
可通过以下方式获得这个 logger :
Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
在 logback 中,每个 logger 都是一个单例,调用LoggerFactory.getLogger()方法时,如果传入的 logger name 相同,获取到的 logger 都是同一个实例。l
ogger 有日志打印级别,可以为一个 logger 指定它的日志打印级别。
如果不为一个 logger 指定打印级别,那么它将继承离他最近的一个有指定打印级别的祖先的打印级别,直到它找到 root logger。因此,要使用 logback, 必须为 root logger 指定日志打印级别。
日志打印级别从低级到高级排序的顺序是:
TRACE < DEBUG < INFO < WARN < ERROR
如果一个 logger 允许打印一条具有某个日志级别的信息,那么它也必须允许打印具有比这个日志
级别更高级别的信息,而不允许打印具有比这个日志级别更低级别的信息。
Appender 和 Layout:
日志信息可以打印至 console、文件,输出到网络流中,日志打印的目的地由 Appender 决定,不同的 Appender 能将日志信息打印到不同的目的地去。Appender 是绑定在 logger 上的,同时,一个 logger 可以绑定多个 Appender,意味着一条信息可以同时打印到不同的目的地去。
打印的日志除了有打印的目的地外,还有日志信息的展示格式。在 logback 中,用 Layout 来代表日志打印格式。比如说,PatternLayout 能够识别以下这条格式:%-4relative [%thread] %-5level %logger{32} - %msg%n
然后打印出来的格式效果是:176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.
第一个字段代表从程序启动开始后经过的毫秒数,
第二个字段代表打印出这条日志的线程名字,
第三个字段代表日志信息的日志打印级别,
第四个字段代表 logger name,
第五个字段是日志信息,
第六个字段仅仅是代表一个换行符。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- scan&scanPeriod: 60秒扫一次配置 发生改变重新加载配置 不必重启服务器 -->
<!-- debug:不打印logback内部日志-->
<!--定义参数常量-->
<!--trace < debug < info < warn < error-->
<!--例如:logger.trace("message") logger.debug...-->
<property name="log.level" value="debug"></property><!--日志等级-->
<property name="log.maxHistory" value="30"></property><!--文件保留时间-->
<property name="log.filePath" value="${catalina.base}/logs/webapps"></property><!--定义日志保存路径-->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"></property><!--日志格式-->
<!--控制台设置 定义输出到控制台的信息-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!--debug-->
<appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--存储路径-->
<file>${log.filePath}/debug.log</file>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件名称-->
<fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--文件最大保存历史数量-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!--等级过滤 接收debug级别的信息 过滤非dubug的信息-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--info-->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.filePath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件名称-->
<fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--文件最大保存历史数量-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!--等级过滤 接收info级别的信息 过滤非info的信息-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--error-->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.filePath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件名称-->
<fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--文件最大保存历史数量-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!--定义日志格式-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!--等级过滤 接收ERROR级别的信息 过滤非ERROR的信息-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--logger name:对哪个包生效-->
<logger name="com.imooc.o2o" level="${log.level}" additivity="true">
<!--additivity
false:表示只用当前logger的appender-ref。
true:表示当前logger的appender-ref和rootLogger的appender-ref都有效。-->
<appender-ref ref="debugAppender"></appender-ref>
<appender-ref ref="infoAppender"></appender-ref>
<appender-ref ref="errorAppender"></appender-ref>
</logger>
<!--根logger -->
<root level="info">
<appender-ref ref="consoleAppender"></appender-ref>
</root>
</configuration>