logback日志详解

来源:互联网 发布:好吃的白巧克力 知乎 编辑:程序博客网 时间:2024/05/17 02:38
logback日志配置
一、日志级别已经输出规则:
日志级别从高到低:OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL 
日志输出规则:根据当前ROOT 级别,日志输出时,级别高于root默认的级别时会输出。 
二、根节点<configuration>包含的属性
scan:当此属性设置为true时,配置文件如果发生改变,将会被从新加载,默认为true。
scanPeriod:设置监测文件是否有修改的时间间隔,如果没有给出时间单位,默认单位为毫秒。当scan为true时,此属性生效。默认为1分钟。
debug:当此属性设置成true时,将打印出logback内部的日志信息,实时查看logback运行状态。默认值为false。
例如:
<configuration scan="true" scanPeriod="60 seconds" debug="false><!--其他配置省略--></configuration>
三、根节点<configuraion>的子节点
该根节点一功有三个子节点,appender、logger、root。
下面详细说明各个子节点的用处:
(1)<contextName>
设置上下文名称。每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用<contextName>修改成其他名字,用于区分不同应用程序的记录。一旦设置,不能够修改。
<configuration scan="true" scanPeriod="60 seconds" debug="false><contextName>myAppname</contextName><!--其他配置省略--></configuration>

(2)<property>
设置变量值的标签。该标签设置的值会被插入到logger的应用上下文中,到后面可以通过${}来访问。该标签中有两个属性,name和value,前者是标签的名字,后者是标签的值。
<configuration scan="true" scanPeriod="60 seconds" debug="false><property name="APP_NAME" value="myAppname"/><contextName>${APP_NAME}</contextName><!--其他配置省略--></configuration>


(3)<timestamp>

获取时间戳字符串。
此标签有两个属性,key和datePattern。前者是标签的名字,后者是设置当前时间转换成字符串的模式。
<configuration scan="true" scanPeriod="60 seconds" debug="false><timestamp key="bySecond" value="yyyyMMdd'T'HHmmss"/><contextName>${bySecond}</contextName><!--其他配置省略--></configuration>

(4)<logger>
设置某一个包或者类的日志打印级别、以及指定相应的<appender>。该标签有把三个属性。name、level和addtivity。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置日志的打印级别,大小写无关。这个属性可以没有,如果没有则继承上级的级别,如果设置成INHERITED或者同义词NULL,代表强制执行上级的级别。
addtivity:是否向上级logger传递打印信息,默认是true。
注意:<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个log中。
(5)<root>
<root>元素也是logger元素,不同的是他是根logger。只有一个level属性,因为已经被命名为“root”。
三、应用实例
(1)只配置root
logback.xml
<?xml version="1.0" encoding="UTF-8"?><configuration>    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        <!-- encoder 默认配置为PatternLayoutEncoder -->        <encoder>            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>        </encoder>    </appender>    <root level="INFO">        <appender-ref ref="STDOUT" />    </root></configuration>

测试方法

  @Test    public void testLogback(){        logger.debug("debug");        logger.info("info");        logger.warn("warn");        logger.error("error");    }

输出内容
23:14:42.697 [main] INFO  com.liutao.userTest.UserTest - info
23:14:42.697 [main] WARN  com.liutao.userTest.UserTest - warn
23:14:42.697 [main] ERROR com.liutao.userTest.UserTest - error


(2)带有logger的配置,不指定级别,不指定appender
logback.xml
<?xml version="1.0" encoding="UTF-8"?><configuration>    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        <!-- encoder 默认配置为PatternLayoutEncoder -->        <encoder>            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>        </encoder>    </appender>    <!-- logback为java中的包 -->    <logger name="com.liutao.userTest"/>    <root level="INFO">        <appender-ref ref="STDOUT" />    </root></configuration>

测试方法
  @Test    public void testLogback(){        logger.debug("debug");        logger.info("info");        logger.warn("warn");        logger.error("error");    }
输出内容
23:14:42.697 [main] INFO  com.liutao.userTest.UserTest - info
23:14:42.697 [main] WARN  com.liutao.userTest.UserTest - warn
23:14:42.697 [main] ERROR com.liutao.userTest.UserTest - error


注意:
该<logger>标签将控制com.liutao.userTest包下所有类的日志的打印,但是并没有设置日志打印的级别,从而继承上级<root>的日志打印级别“DEBUG”。
没有设置addtivity,默认为true,将此logger打印信息向上级传递。
没有设置appender,此logger本身不打印任何日志。
<root level="DEBUG">将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。
(3)带有多个logger的配置,指定级别,指定appender。
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        <!-- encoder 默认配置为PatternLayoutEncoder -->        <encoder>            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>        </encoder>    </appender>    <!-- logback为java中的包 -->    <logger name="com.liutao.userTest"/>    <!--指定类的全路径名-->    <logger name="com.liutao.userTest.UserTest" level="INFO" additivity="false">        <appender-ref ref="STDOUT"/>    </logger>    <root level="ERROR">        <appender-ref ref="STDOUT" />    </root></configuration>
测试方法
  @Test    public void testLogback(){        logger.debug("debug");        logger.info("info");        logger.warn("warn");        logger.error("error");    }


输出内容
23:14:42.697 [main] INFO  com.liutao.userTest.UserTest - info
23:14:42.697 [main] WARN  com.liutao.userTest.UserTest - warn
23:14:42.697 [main] ERROR com.liutao.userTest.UserTest - error


注意:


<logger name="com.liutao.userTest" />将控制logback包下的所有类的日志的打印,但是并没用设置打印级别,所以继承他的上级<root>的日志级别“DEBUG”;
没有设置addtivity,默认为true,将此loger的打印信息向上级传递;
没有设置appender,此loger本身不打印任何信息。
 
<logger name="com.liutao.userTest.UserTest" level="INFO" additivity="false">控制com.liutao.userTest.UserTest类的日志打印,打印级别为“INFO”;
additivity属性为false,表示此loger的打印信息不再向上级传递,
指定了名字为“STDOUT”的appender。
 
<root level="DEBUG">将root的打印级别设置为“ERROR”,指定了名字为“STDOUT”的appender。
 
当执行com.liutao.userTest.UserTest方法时,先执行<logger name="com.liutao.userTest.UserTest" level="INFO" additivity="false">,将级别为“INFO”及大于“INFO”的日志信息交给此loger指定的名为“STDOUT”的appender处理,在控制台中打出日志,不再向次loger的上级 <logger name="com.liutao.userTest"/> 传递打印信息;
<logger name="com.liutao.userTest"/>未接到任何打印信息,当然也不会给它的上级root传递任何打印信息;
但是,这里如果将additivity设置成true,日志将打印两次。

1 0
原创粉丝点击