把logback或者log4j放在src/main/resources下,Spring容器就能够自动加载日志文件。
java
Logback是由log4j创始人设计的又一个开源日志组件, 比log4j的性能好.api
<!--这个依赖直接包含了 logback-core 以及 slf4j-api的依赖--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
logback在启动的时候,会按照下面的顺序加载配置文件:app
logback.configurationFile
属性,就用该属性指定的配置文件。java -Dlogback.configurationFile=/path/to/mylogback.xml Test
,这样执行Test类的时候就会加载/path/to/mylogback.xml
配置.logback.groovy
文件logback-test.xml
文件logback.xml
文件com.qos.logback.classic.spi.Configurator
接口的第一个实现类,ch.qos.logback.classic.BasicConfigurator
,在控制台输出日志.设置日志上下文名称,后面输出格式中能够经过定义%contextName
来打印日志上下文名称性能
用来设置相关变量,经过key-value的
方式配置,而后在后面的配置文件中经过${key}
来访问this
appender
ConsoleAppender
:向控制台输出日志内容的组件,只要定义好encoder
节点就可使用。
<encoder>
:对记录事件进行格式化。filter
:定义了一个过滤器,在LEVEL
之下的日志输出不会被打印出来FileAppender
:向文件输出日志内容的组件,用法也很简单,不过因为没有日志滚动策略,通常不多使用RollingFileAppender
:向文件输出日志内容的组件,同时能够配置日志文件滚动策略,在日志达到必定条件后生成一个新的日志文件. 它有下面几个子节点:
<file>
:被写入的文件名,能够是相对目录,也能够是绝对目录,若是上级目录不存在会自动建立,没有默认值。<append>
:若是是 true,日志被追加到文件结尾,若是是 false,清空现存文件,默认是true。<encoder>
:对记录事件进行格式化。Policy
:两个经常使用热门的策略,TimeBaseRollingPolicy
, SizeBasedTriggeringPolicy
TimeBaseRollingPolicy
:根据fileNamePattern
标签来表示什么周期触发一次,生成新的日志文件SizeBasedTriggeringPolicy
:表示基于文件大小进行滚动<rollingPolicy>
:当发生滚动时,决定RollingFileAppender
的行为,涉及文件移动和重命名。<triggeringPolicy>
: 告知RollingFileAppender
什么时候激活滚动。<prudent>
:当为true时,不支持FixedWindowRollingPolicy
。支持TimeBasedRollingPolicy
,可是有两个限制,1不支持也不容许文件压缩,2不能设置file属性,必须留空。filter
:定义了一个过滤器,在LEVEL之
下的日志输出不会被打印出来name
:用来指定受此loger约束的某一个包或者具体的某一个类。level
:用来设置打印级别(日志级别),大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,表明强制执行上级的级别。若是上面的logger没有设置level属性, 会继承root的属性addtivity
:是否向上级loger传递打印信息。默认是true。咱们可使用logger节点的additivity="false"属性来屏蔽rootLogger的appender。这样就能够不使用rootLogger的appender输出日志了。<logger>
能够包含零个或多个<appender-ref>
元素,标识这个appender将会添加到这个loger。spa
root
与logger
同时引入同一个appender
,而且additivity="true"
,则这个appender
会输出多份
。level
默认是以覆盖的方式继承的,若是父亲
的级别是DEBUG
,若是在这个logger
中设置了INFO
,最终这个logger的级别就是INFO
。logger
标签没有指定level
的话,就会继承离他最近的祖先的级别
。appender
指定了filter
,logger
不用写level属性。<?xml version="1.0" encoding="utf-8"?> <!--scan:当此属性设置为true时,配置文件若是发生改变,将会被从新加载,默认值为true。--> <!--scanPeriod:设置监测配置文件是否有修改的时间间隔,若是没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。--> <!--debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。--> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!--日志上下文名称--> <contextName>logback</contextName> <!--定义参数常量--> <property name="log.level" value="debug"></property> <property name="log.maxHistory" value="30"></property> <property name="log.filePath" value="/"></property> <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"> </property> <!--级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL--> <!--日志输出规则:根据当前ROOT级别,日志输出时,级别高于root默认的级别时会输出--> <!--控制台设置--> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <!--记录事件进行格式化--> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!--日志文件--> <!--滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其余文件RollingFileAppender--> <!--debug--> <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--文件路径--> <file>${log.filePath}/debug.log</file> <!--当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。--> <!--最经常使用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动。根据<fileNamePattern>肯定滚动时间--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--文件名称--> <fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.zip</fileNamePattern> <!--文件最大保存历史 30天--> <maxHistory>${log.maxHistory}</maxHistory> <!--日志文件最大的大小--> <MaxFileSize>5M</MaxFileSize> </rollingPolicy> <!--记录事件进行格式化--> <encoder> <pattern>${log.pattern}</pattern> </encoder> <!--定义了一个过滤器,在level之下的日志输出不会被打印出来--> <!--这里定义了DEBUG,也就是控制台不会输出比DEBUG级别小的日志--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 设置过滤级别 --> <level>DEBUG</level> <!--ACCEPT–打印 DENY– 不打印 NEUTRAL–中立--> <!-- 用于配置符合过滤条件的操做 --> <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> <!--按照固定窗口模式生成日志文件,当文件大于5MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最先的日志。--> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>3</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!--设置一个向上传递的appender,全部级别的日志都会输出--> <appender name="appender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.filePath}/all.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.filePath}/all/all.%d{yyyy-MM-dd}.log.zip</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>5M</MaxFileSize> </rollingPolicy> <encoder> <pattern>${log.pattern}</pattern> </encoder> </appender> <!--设置某一个包或者具体的某一个类的打印级别,name表明包名。会屏蔽rootLogger的appender--> <logger name="com.Logger" additivity="false"> <appender-ref ref="consoleAppender"/> <!--分级别分别输出(debugAppender和infoAppender),屏蔽root的appender--> <appender-ref ref="debugAppender"/> <appender-ref ref="infoAppender"/> </logger> <!-- 打印debug级别日志及以上级别日志 --> <root level="DEBUG"> <!-- 控制台输出 --> <appender-ref ref="consoleAppender"/> <!-- 无论什么包下的日志都输出到文件,全部级别的日志分级别输出--> <!--<appender-ref ref="ERROR"/>--> <!--<appender-ref ref="INFO"/>--> <!--<appender-ref ref="WARN"/>--> <!--<appender-ref ref="DEBUG"/>--> <!--<appender-ref ref="TRACE"/>--> </root> </configuration>
private static final Logger log= LoggerFactory.getLogger(this.class);
log.info("I am fine.");