logbak日志级别TRACE < DEBUG < INFO < WARN < ERROR
<?xml version="1.0" encoding="UTF-8"?>
<configuration scanPeriod="60 seconds" debug="false">
<property resource="application.properties" />
<property name="logging.path" value="${logging.path}" />
<!-- 控制台输出 -->
<appender name="console-appender" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d] [%p] [%C{0}.%M{0}] - %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="root-appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch> <!--命中日志此级别不打印--!>
<onMismatch>ACCEPT</onMismatch> <!--打印非此级别日志--!>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logging.path}/demo/root.log.%d{yyyy-MM-dd}</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d] [%p] [%C{0}.%M{0}] - %m%n</pattern>
</encoder>
</appender>
<!--指定日志的保存点-->
<!--滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件-->
<appender name="controller-appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动–>-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logging.path}/demo/controller.log.%d{yyyy-MM-dd}</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d] [%p] [%C{0}.%M{0}] - %m%n</pattern>
</encoder>
</appender>
<appender name="service-appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logging.path}/demo/service.log.%d{yyyy-MM-dd}</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d] [%p] [%C{0}.%M{0}] - %m%n</pattern>
</encoder>
</appender>
<appender name="dao-appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logging.path}/demo/dao.log.%d{yyyy-MM-dd}</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d] [%p] [%C{0}.%M{0}] - %m%n</pattern>
</encoder>
</appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level> <!--打印此级别的日志--!>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logging.path}/demo/error.log.%d{yyyy-MM-dd}</FileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d] [%p] [%C{0}.%M{0}] - %m%n</pattern>
</encoder>
</appender>
<!--指定日志的输出点(controller包中)-->
<logger name="com.edu.controller" level="INFO" additivity="true">
<appender-ref ref="controller-appender"/>
</logger>
<logger name="com.edu.service" level="INFO" additivity="false">
<appender-ref ref="service-appender"/>
</logger>
<!--dao层日志-->
<logger name="com.edu.dao" level="INFO" additivity="false">
<appender-ref ref="dao-appender"/>
</logger>
<logger name="java.sql" level="DEBUG" additivity="false">
<appender-ref ref="dao-appender"/>
</logger>
<root level="INFO">
<appender-ref ref="console-appender" />
<appender-ref ref="root-appender" />
<appender-ref ref="ERROR" />
</root>
</configuration>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>//默认为NEUTRAL
<onMismatch>ACCEPT</onMismatch>//默认为NEUTRAL
</filter>
表示:(deny)拒绝error级别的日志。
public class LevelFilter extends AbstractMatcherFilter<ILoggingEvent> {
Level level;
public LevelFilter() {
}
public FilterReply decide(ILoggingEvent event) {
if (!this.isStarted()) {
return FilterReply.NEUTRAL;
} else {
//比对设置的level与在行的日志level。
return event.getLevel().equals(this.level) ? this.onMatch : this.onMismatch;
}
}
public void setLevel(Level level) {
this.level = level;
}
public void start() {
if (this.level != null) {
super.start();
}
}
}
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
表示:打印级别>=level的日志
public class ThresholdFilter extends Filter<ILoggingEvent> {
Level level;
public ThresholdFilter() {
}
public FilterReply decide(ILoggingEvent event) {
if (!this.isStarted()) {
return FilterReply.NEUTRAL;
} else {
//比对当前在行日志与设置的level级别,打印>=level级别的日志
return event.getLevel().isGreaterOrEqual(this.level) ? FilterReply.NEUTRAL : FilterReply.DENY;
}
}
public void setLevel(String level) {
this.level = Level.toLevel(level);
}
public void start() {
if (this.level != null) {
super.start();
}
}
public boolean isGreaterOrEqual(Level r) {
return this.levelInt >= r.levelInt;
}
}