看了很多logback的资料,自己总结了一套模板供大家使用!
该文件应放在classpath:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 默认为 <configuration scan="true" scanPeriod="60 seconds" debug="false"> -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false -->
<configuration>
<!-- appender是指输出的形式或位置,name和class是两个必备属性 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。 -->
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件 -->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>log/file.log</file>
<!-- 默认append=true,即可追加而非覆盖 -->
<append>true</append>
<encoder>
<!-- pattern部分见我的博客 -->
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- prudent=true表示日志写入线程安全,会降低效率,默认为false -->
<prudent>false</prudent>
</appender>
<!-- 这个appender是每天生成一个日志文件,并且只保留30天 -->
<!-- 滚动输出到文件,达到一定条件时,会将日志记录到其他文件 -->
<appender name="timeFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 滚动策略。具体策略由class指定。 -->
<!-- TimeBasedRollingPolicy是最常用的滚动策略,根据时间滚动,当达到一定时间时,自动重新开辟一个日志文件 -->
<!-- FixedWindowRollingPolicy根据固定窗口算法重命名文件的滚动策略 -->
<!-- triggeringPolicy根据当前活动文件大小来决定是否滚动的策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 由于表达式中最小单位为天,所以每天生成一个日志文件,且以此命名 -->
<fileNamePattern>log/logFile%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留归档文件的最大数量。 -->
<!-- 本例中由于使用了时间作为滚动策略,且fileNamePattern中最小单位为天,所以归档文件保存30天,超过30天将被删除 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 这个appender生成的日志文件满足5MB时会新建日志文件继续生成,只生成3个,当超过3个时将覆盖最早的日志 -->
<appender name="fixedFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/fixedFile.log</file>
<!-- 根据固定窗口模式生成日志文件,结合triggeringPolicy(当日志文件达到5MB时触发滚动,生成新的日志文件) -->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<!-- 日志文件命名,%i代表从minIndex到maxIndex,即 fixedFile1.log.zip fixedFile2.log.zip
fixedFile3.log.zip -->
<!-- 当生成了3个归档文件后,若继续生成,将覆盖最早的日志 -->
<fileNamePattern>log/fixedFile%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<!-- maxIndex若过大,会被设为12 -->
<maxIndex>3</maxIndex>
</rollingPolicy>
<!-- 触发策略,达到一定条件时将通知appender,触发滚动 -->
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- appender与过滤器整合,一个appender可含一个或多个filter,有多个filter时,按照配置先后顺序执行 -->
<appender name="filter" class="ch.qos.logback.core.FileAppender">
<file>log/filter.log</file>
<!-- 默认append=true,即可追加而非覆盖 -->
<append>true</append>
<!-- levelfilter:级别过滤器。根据日志级别进行过滤。如果日志级别等于配置级别level,则执行onMatch的;否则执行onMismatch -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!-- onMatch、onMismatch里内容要大写 -->
<!-- DENY:日志将立即被抛弃,不再经过其他过滤器,本appender也不进行处理 -->
<!-- ACCEPT:日志被立即处理,不再经过其他过滤器-->
<!-- NEUTRAL:下一个过滤器继续过滤,若为最后一个过滤器且通过,则appender进行处理-->
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- ThresholdFilter临界值过滤器,过滤掉低于指定临界值的日志-->
<!-- 当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<!-- pattern部分见我的博客 -->
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- prudent=true表示日志写入线程安全,会降低效率,默认为false -->
<prudent>false</prudent>
</appender>
<!-- logger是用于输出的对象,java文件中getLogger("app")即获得的该name=app的logger -->
<!-- logger的name属性可指定为包名或类名。app是app.*的父亲,所有没有声明level的app.*都将继承app的level -->
<!-- addtivity属性表明是否向上级logger传递打印信息,即上级logger又重新打了一遍。默认为true -->
<logger name="app" level="debug" addtivity="false">
<appender-ref ref="file" />
<appender-ref ref="timeFile" />
<appender-ref ref="fixedFile" />
</logger>
<!-- 根logger,level表示输出的level级别,从下到上为:TRACE, DEBUG, INFO, WARN, ERROR, ALL
和 OFF,低于这里设定级别的不显示 -->
<root level="debug">
<!-- 表示该appender被引入到该logger中,一个logger可含多个appender,即多个输出位置或形式 -->
<!-- ref引用的是appender的name -->
<appender-ref ref="stdout" />
</root>
</configuration>
上面有详细的注释,有需要的可以根据实际情况进行修改。
同时附上<pattern>的转换符说明: (这部分引用自http://aub.iteye.com/blog/1103685)
转换符 作用
c {length } lo {length } logger {length } | 输出日志的logger名,可有一个整形参数,功能是缩短logger名,设置为0表示只输入logger最右边点符号之后的字符串。 Conversion specifier Logger name Result
| |||||||||||||||||||||
C {length } class {length } | 输出执行记录请求的调用者的全限定名。参数与上面的一样。尽量避免使用,除非执行速度不造成任何问题。 | |||||||||||||||||||||
contextName cn | 输出上下文名称。 | |||||||||||||||||||||
d {pattern } date {pattern } | 输出日志的打印日志,模式语法与java.text.SimpleDateFormat 兼容。 Conversion Pattern Result
| |||||||||||||||||||||
F / file | 输出执行记录请求的java源文件名。尽量避免使用,除非执行速度不造成任何问题。 | |||||||||||||||||||||
caller{depth}caller{depth, evaluator-1, ... evaluator-n} | 输出生成日志的调用者的位置信息,整数选项表示输出信息深度。 例如, %caller{2} 输出为: 0 [main] DEBUG - logging statement
Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17) 例如, %caller{3} 输出为: 16 [main] DEBUG - logging statement
Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
Caller+2 at mainPackage.ConfigTester.main(ConfigTester.java:38) | |||||||||||||||||||||
L / line | 输出执行日志请求的行号。尽量避免使用,除非执行速度不造成任何问题。 | |||||||||||||||||||||
m / msg / message | 输出应用程序提供的信息。 | |||||||||||||||||||||
M / method | 输出执行日志请求的方法名。尽量避免使用,除非执行速度不造成任何问题。 | |||||||||||||||||||||
n | 输出平台先关的分行符“\n”或者“\r\n”。 | |||||||||||||||||||||
p / le / level | 输出日志级别。 | |||||||||||||||||||||
r / relative | 输出从程序启动到创建日志记录的时间,单位是毫秒 | |||||||||||||||||||||
t / thread | 输出产生日志的线程名。 | |||||||||||||||||||||
replace(p ){r, t} | p 为日志内容,r 是正则表达式,将p 中符合r 的内容替换为t 。 例如, "%replace(%msg){'\s', ''}" |
格式修饰符,与转换符共同使用:
可选的格式修饰符位于“%”和转换符之间。
第一个可选修饰符是左对齐 标志,符号是减号“-”;接着是可选的最小宽度 修饰符,用十进制数表示。如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。如果字符大于最小宽度,字符永远不会被截断。最大宽度 修饰符,符号是点号"."后面加十进制数。如果字符大于最大宽度,则从前面截断。点符号“.”后面加减号“-”在加数字,表示从尾部截断。
例如:%-4relative 表示,将输出从程序启动到创建日志记录的时间 进行左对齐 且最小宽度为4。