slf4j结合logback管理日志的简单应用

来源:互联网 发布:sql的聚合函数 编辑:程序博客网 时间:2024/06/09 00:00

管理程序中日志的常见方式有ACL+Log4j、slf4j+log4j、slf4j+logback,本文讲述的是用slf4j+logback在项目日志管理上的简单应用。

一、所需jar包的maven依赖

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.11</version></dependency>
引入此依赖后,会同时将logback-classic.jar、logback-core.jar、slf4j-api.jar三个JAR包下载到项目类路径下

二、项目的代码结构

为了简单起见,项目中只有3个类,分别是

1)cn.cjc.log.test.a.TestA

package cn.cjc.log.test.a;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TestA {private static final Logger LOGGER = LoggerFactory.getLogger(TestA.class);public void log() {LOGGER.error("TestA---error");LOGGER.warn("TestA---warn");LOGGER.info("TestA---info");LOGGER.debug("TestA---debug");}}
2)cn.cjc.log.test.b.TestB

package cn.cjc.log.test.b;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class TestB {private static final Logger LOGGER = LoggerFactory.getLogger(TestB.class);public void log() {LOGGER.error("TestB---error");LOGGER.warn("TestB---warn");LOGGER.info("TestB---info");LOGGER.debug("TestB---debug");}}
3)cn.cjc.log.test.Test

package cn.cjc.log.test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import cn.cjc.log.test.a.TestA;import cn.cjc.log.test.b.TestB;public class Test {private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);public static void main(String[] args) {LOGGER.error("Test---error");LOGGER.warn("Test---warn");LOGGER.info("Test---info");LOGGER.debug("Test---debug");new TestA().log();new TestB().log();}}
三、需要为logback日志管理框架设置一个名为logback.xml的配置文件,只要将该文件放在项目的classpath类路径下,该框架就能自动读取配置文件中的配置信息。常见的logback.xml配置文件信息如下

<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 输出到控制台 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss}[%t]%-5p %c{36}.%M\(%L\) %m%n</pattern></encoder></appender><!-- 输出到文件 --><appender name="file" class="ch.qos.logback.core.FileAppender"><file>${user.home}/logs/file_log.log</file><!-- 默认是true --><append>true</append><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss}[%t]%-5p %c{36}.%M\(%L\) %m%n</pattern></encoder></appender><!-- additivity默认是true --><logger name="cn.cjc.log.test.a" level="ERROR" additivity="false"><appender-ref ref="file" /></logger><!-- 根logger的level默认值是DEBUG --><root level="INFO"><appender-ref ref="console" /></root></configuration>
第一个name=console的appender表示的是将日志输出到控制台,且使用<encoder>节点定义的信息格式化方式来输出。第二个name=file的appender表示的是将日志保存到文件中,此处保存的文件路径为${user.home}/logs/file_log.log,其下的<append>节点值为true表示如果file_log.log文件存在,则追加日志到文件末尾,如果为false则每次启动项目时都会新建file_log.log日志文件。

光定义了appender,而没有logger来引用它,那么这个定义的appender就是废柴一个,所以下面定义了一个name=cn.cjc.log.test.a的logger来引用name=file的appender,意思就是将cn.cjc.log.test.a包中所有类的日志都输出到file_log.log文件中。logger的name如果为包名,则将该包下产生的日志输出到<appender-ref>引用的appender,logger的name如果为全限定类名,则只将该类中产生的日志输出到<appender-ref>引用的appender。当然,可以在一个logger下定义多个<appender-ref>节点,甚至不定义<appender-ref>节点,如果未定义<appender-ref>节点且additivity=false,则什么也不做,对于此例就是cn.cjc.log.test.a包下的所有日志得不到任何方式的呈现(既不输出到控制台,也不保存到文件)。如果未定义<appender-ref>节点但additivity=true的话,则结合当前logger定义的level(如果当前logger有定义level属性的话),并使用此logger的上级logger引用的appender来处理此包中的日志。

注意到logger节点的level=ERROR(或error,大小写不敏感),表示什么呢?常用的日志级别有error、warn、info、debug,优先级由高到低排列为error>warn>info>debug,如果level=info,表示所有优先级等于或高于info级别的日志能得到输出,也就是error、warn、info三个级别的日志能输出,此处level=error,则只有error级别的日志能得到输出。

logger还有一个additivity属性,这个单词的中文意思是添加,怎么理解?其实意思是用此logger处理了cn.cjc.log.test.a包中的日志后,是否还需要此logger的上级logger"添加"处理此包中的日志。此处的additivity=false,则cn.cjc.log.test.a包中的日志只使用此logger来处理。如果additivity=true,则不仅此logger会处理该包中ERROR级别的日志,上级logger也会处理该包中ERROR级别的日志。(当下级logger没有定义level时,使用此级level来处理下级logger包中的日志)

最后一个节点是<root>,其实这个节点也是logger,只不过它很特殊,<logger>节点可以有零到多个,但是<root>节点只能有一个,它是所有已定义logger的父logger。谁是谁的子logger,谁又是谁的父logger,怎么理解?是这样的,<logger name="cn.cjc.test.a.TestA">的父logger是<logger name="cn.cjc.test.a">,父父logger是<logger name="cn.cjc.test">,父父父logger是。。。知道了吧!

上面的logback.xml配置文件的意思是:cn.cjc.log.test.a包中有许多类,也有许多级别的日志输出,但只记录ERROR级别的日志,且把日志保存到file_log.log文件中;剩下的其他包其他类中的日志也有许多,都用<root>根logger处理,也就是将error、warn、info三个级别的日志输出到控制台。

如果将name=cn.cjc.log.test.a的logger的additivity设置为true,则整个logback.xml配置文件的意思就是:将cn.cjc.log.test.a包中的error级别的日志保存到file_log.log文件中,同时使用父logger(此处为根logger),也就是将cn.cjc.log.test.a包中的error级别的日志输出到控制台;剩下的其他包其他类中的日志都用根logger处理,也就是将error、warn、info三个级别的日志输出到控制台。

四、运行cn.cjc.log.test.Test类来验证以上两个结论吧!

五、贴两个不常用但很实用的appender配置

<!-- 每天生成一个日志文件,保存30天的日志文件 --><appender name="daily_rolling" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${user.home}/logs/daily_log.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${user.home}/logs/daily_log_%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss}[%t]%-5p %c{36}.%M\(%L\) %m%n</pattern></encoder></appender><!-- 当文件大于20MB时,生成新的日志文件。窗口大小是1到3,当保存了3个日志后,将覆盖最早的日志 --><appender name="fixed_rolling" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${user.home}/logs/fixed_log.log</file><rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"><fileNamePattern>${user.home}/logs/fixed_log_%i.log</fileNamePattern><minIndex>1</minIndex><maxIndex>3</maxIndex></rollingPolicy><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><maxFileSize>20MB</maxFileSize></triggeringPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss}[%t]%-5p %c{36}.%M\(%L\) %m%n</pattern></encoder></appender>


0 0
原创粉丝点击