首先,看一段真实的配置html
1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration debug="true"> 3 <springProperty scope="context" name="logLevel" source="log.level"/> 4 <springProperty scope="context" name="logPath" source="log.path"/> 5 6 <!-- 输出格式 --> 7 <property name="out.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t] [%c][%L] - %m%n" /> 8 <!-- 活动文件的大小 --> 9 <property name="max.file.size" value="500MB"/> 10 <!-- 保留的归档文件的最大数量 --> 11 <property name="max.history" value="30"/> 12 <!-- 控制全部归档日志文件的总大小 --> 13 <property name="total.size.cap" value="30GB"/> 14 15 <!-- 控制台 --> 16 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 17 <withJansi>true</withJansi> 18 <encoder> 19 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%highlight(%-5p)] [%t] [%cyan(%c)][%L] - %m%n</pattern> 20 </encoder> 21 </appender> 22 23 <!-- DEBUG日志 --> 24 <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 25 <file>${logPath}/debug.log</file> 26 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 27 <level>DEBUG</level> 28 <onMatch>ACCEPT</onMatch> 29 <onMismatch>DENY</onMismatch> 30 </filter> 31 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 32 <fileNamePattern>${logPath}/debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 33 <maxFileSize>${max.file.size}</maxFileSize> 34 <maxHistory>${max.history}</maxHistory> 35 <totalSizeCap>${total.size.cap}</totalSizeCap> 36 </rollingPolicy> 37 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 38 <pattern>${out.pattern}</pattern> 39 <charset>UTF-8</charset> 40 </encoder> 41 </appender> 42 43 <!-- INFO日志 --> 44 <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 45 <file>${logPath}/info.log</file> 46 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 47 <level>INFO</level> 48 <onMatch>ACCEPT</onMatch> 49 <onMismatch>DENY</onMismatch> 50 </filter> 51 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 52 <fileNamePattern>${logPath}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 53 <maxFileSize>${max.file.size}</maxFileSize> 54 <maxHistory>${max.history}</maxHistory> 55 <totalSizeCap>${total.size.cap}</totalSizeCap> 56 </rollingPolicy> 57 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 58 <pattern>${out.pattern}</pattern> 59 <charset>UTF-8</charset> 60 </encoder> 61 </appender> 62 63 <!-- ERROR日志 --> 64 <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 65 <file>${logPath}/error.log</file> 66 <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 67 <level>ERROR</level> 68 </filter> 69 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 70 <fileNamePattern>${logPath}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 71 <maxFileSize>${max.file.size}</maxFileSize> 72 <maxHistory>${max.history}</maxHistory> 73 <totalSizeCap>${total.size.cap}</totalSizeCap> 74 </rollingPolicy> 75 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 76 <pattern>${out.pattern}</pattern> 77 <charset>UTF-8</charset> 78 </encoder> 79 </appender> 80 81 <!-- logger命中中包含Mapper的单独输出到一个文件 --> 82 <appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 83 <file>${logPath}/sql.log</file> 84 <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> 85 <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"> 86 <expression>logger.contains("Mapper")</expression> 87 </evaluator> 88 <onMatch>ACCEPT</onMatch> 89 <onMismatch>DENY</onMismatch> 90 </filter> 91 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 92 <fileNamePattern>${logPath}/sql.%d{yyyy-MM-dd}.log</fileNamePattern> 93 <maxHistory>${max.history}</maxHistory> 94 <totalSizeCap>${total.size.cap}</totalSizeCap> 95 </rollingPolicy> 96 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 97 <pattern>${out.pattern}</pattern> 98 </encoder> 99 </appender> 100 101 <appender name="OTHER_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 102 <file>logFile.log</file> 103 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 104 <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> 105 <maxHistory>${max.history}</maxHistory> 106 <totalSizeCap>${total.size.cap}</totalSizeCap> 107 </rollingPolicy> 108 <encoder> 109 <pattern>${out.pattern}</pattern> 110 </encoder> 111 </appender> 112 113 <!-- com.ourhours.coupon.service包下的日志都输出到单独一个文件 --> 114 <logger name="com.ourhours.coupon.service" level="INFO"> 115 <appender-ref ref="OTHER_FILE" /> 116 </logger> 117 118 <root level="${logLevel}"> 119 <appender-ref ref="STDOUT" /> 120 <appender-ref ref="DEBUG_FILE" /> 121 <appender-ref ref="INFO_FILE" /> 122 <appender-ref ref="ERROR_FILE" /> 123 <appender-ref ref="SQL_FILE" /> 124 </root> 125 126 </configuration>
输出到控制台spring
输出到文件sql
RollingFileAppender继承自FileAppender,并有滚动日志文件的能力。express
RollingFileAppender有两个重要的组件。第一个组件是RollingPolicy,它决定怎样滚动;第二个组件是TriggeringPolicy,它决定何时执行滚动。app
从字面上也很好理解,触发策略决定何时发生滚动,而滚动策略则定义当滚动发生的时候作什么。所以,RollingPolicy就是what,TriggeringPolicy就是when。ide
Thus, RollingPolicy is responsible for the what and TriggeringPolicy is responsible for the when. flex
TimeBasedRollingPolicy是最受欢迎的rolling策略。它是基于时间的,例如:按天或者按月。ui
有时候你可能但愿按天归档文件,与此同时还想限制每一个日志文件的大小。为了达到这个目的,可使用SizeAndTimeBasedRollingPolicylua
注意,TimeBasedRollingPolicy已经运行你限制总的日志文件大小。经过设置totalSizeCap。spa
Both the %i and %d tokens are mandatory.
注意,%i和%d是强制的。每次当前日志达到maxFileSize时将被归档,而且带一个自增的从0开始的index。
SizeBasedTriggeringPolicy只接受一个参数,参数的名字是maxFileSize,它的默认值是10MB。
SizeBasedTriggeringPolicy accepts only one parameter, namely maxFileSize, with a default value of 10 MB.
maxFileSize的单位能够是字节,KB,MB,GB
例如:5000000,5000KB,5MB,2GB这些都是有效的值,并且它们等价的。
Filter有三种回复,分别是ACCEPT(接受)、NEUTRAL(不接受也不拒绝)、DENY(拒绝)。
LevelFilter是基于事件的级别来过滤的,若是事件的级别与配置的级别相等,接受或者拒绝这个事件取决于onMatch和onMismatch配置。
ThresholdFilter过滤器是基于threshold(阈值)过滤的。对于级别等于或者高于threshold的事件,当它的decide()方法被调用的时候ThresholdFilter过滤器将回复NEUTRAL。
级别低于threshold的事件将被拒绝。
EvaluatorFilter是EventEvaluator的一个封装。EventEvaluator会计算给定的事件是否知足指定的条件。
经过指定onMatch和onMismatch属性,EvaluatorFilter将返回匹配仍是不匹配。
注意,EventEvaluator是一个抽象类,你能够实现本身的逻辑。
JaninoEventEvaluator
JaninoEventEvaluator是EventEvaluator的一个具体实现。
JaninoEventEvaluator用任意的Java代码块返回的一个boolean值做为条件计算的结果。咱们把这种Java语音的boolean表达式称之为“计算表达式”。计算表达式在计算过程当中很是灵活。
JaninoEventEvaluator须要Janino库。所以,为了使用JaninoEventEvaluator。咱们须要引入一个jar包。
JaninoEventEvaluator taking an arbitrary Java language block returning a boolean value as the evaluation criteria.
We refer to such Java language boolean expressions as "evaluation expressions".
Evaluation expressions enable great flexibility in event filtering.
JaninoEventEvaluator requires the Janino library.
计算表达式在当前的日志事件中被计算。为了可以在计算表达式中访问当前事件的属性,Logback-classic自动将日志事件的各类字段导出并做为变量以供计算表达式使用。
上面的计算表达式return message.contains("billing");返回一个boolean值。而且,给定的onMathch为DENY,onMismatch为NEUTRAL,那么这个过滤器会丢弃全部message中包含billing的事件。
我发现,向上面这种貌似不用写return也能够,就像下面这样:
计算表达式能够是Java代码块。例如,下面是一个有效的表达式:
PatternLayout识别如下颜色:
"%black", "%red", "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray", "%boldRed",
"%boldGreen", "%boldYellow", "%boldBlue", "%boldMagenta""%boldCyan", "%boldWhite","%highlight"
输出效果以下
参考
https://logback.qos.ch/manual/layouts.html
https://logback.qos.ch/manual/appenders.html
https://logback.qos.ch/manual/filters.html