1. Java_LogBack 用法简介

来源:互联网 发布:淘宝卖家未发货骗术 编辑:程序博客网 时间:2024/06/05 19:16

  • 概述
    • LogBackSlf4j和Log4j之间的关系
    • LogBack的结构
    • 配置详解
    • 1 根节点包含的属性
    • 2 根节点 的子节点
      • 21 logger
      • 22 root

1 概述

LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手。(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)

2 LogBack、Slf4j和Log4j之间的关系

Slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog…)。

LogBack和Log4j都是开源日记工具库,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。详细数据可参照下面地址:Reasons to prefer logback over log4j。

3 LogBack的结构

LogBack被分为3个组件,logback-core, logback-classic 和 logback-access。

其中logback-core提供了LogBack的核心功能,是另外两个组件的基础。

logback-classic则实现了Slf4j的API,所以当想配合Slf4j使用时,需要将logback-classic加入classpath。

logback-access是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。

4 配置详解

4.1 根节点包含的属性

  • scan:当此属性设置为 true 时,配置文件如果发生变化,将会被重新加载,默认值为 true。
  • scanPeriod:设置监测配置文件是否修改的时间间隔,当 scan 为 true 时,此配置生效,默认时间为 1 分钟
  • debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false

XML代码

<configuration scan="true" scanPeriod="60 second" debug="false">...</configuration>

4.2 根节点 的子节点

LogBack 的配置大概包括 3 部分:appender、logger 和 root

这里写图片描述

设置上下文名称 <contextName>

每个 logger 都关联到 logger 上下文,默认上下文名称为 “default”。但可以使用 <contextName> 设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

<configuration scan="true" scanPeriod="60 second" debug="false">    <contextName>myAppName</contextName>    ...</configuration>

设置变量 <property>

用来定义变量值的标签,<property> 有两个属性,name 和 value;其中 name 值是变量的名称,value 是值。通过 <property> 定义的值会被插入到 logger 上下文中,定义变量后,可以使用 “${}” 来使用变量。

<configuration scan="true" scanPeriod="60 second" debug="false">        <property name="APP_Name" value="myAppName" />         <contextName>${APP_Name}</contextName>        <!-- 其他配置省略-->  </configuration>

获取时间戳字符串 timestamp

4.2.1 logger

用来设置某一个包或者具体的类的日志打印级别,以及指定 <appender><logger> 仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。

  • name:用来指定受此 logger 约束的某一个包或者具体的某一个类
  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前 logger 将会继承上级的级别。
  • addtivity:是否向上级 logger 传递打印信息。默认值为 true

<logger> 可以包含零个或多个 <appender-ref> 元素,标识这个 appender 将会添加到这个 logger。

4.2.2 root

只有一个 level 属性

  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。

<root> 可以包含零个或多个 <appender-ref> 元素,标识这个 appender 将会添加到这个 logger

案例介绍

首先是 java 类如下:

package logback;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory;  public class LogbackDemo {      private static Logger log = LoggerFactory.getLogger(LogbackDemo.class);      public static void main(String[] args) {          log.trace("======trace");          log.debug("======debug");          log.info("======info");          log.warn("======warn");          log.error("======error");      }  }

logback.xml 配置文件

只配置root

<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>

其中 appender 的配置表示打印到控制台(稍后详细讲解appender )。<root level="INFO"> 将root的打印级别设置为 “INFO”,指定了名字为 “STDOUT” 的 appender。

当执行logback.LogbackDemo类的main方法时,root将级别为 “INFO” 及大于 INFO 的日志信息交给已经配置好的名为 STDOUT 的appender处理,STDOUT appender将信息打印到控制台;

输出结果:

13:30:38.484 [main] INFO  logback.LogbackDemo - ======info  13:30:38.500 [main] WARN  logback.LogbackDemo - ======warn  13:30:38.500 [main] ERROR logback.LogbackDemo - ======error

带有logger的配置,不指定级别,不指定appender

<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="logback"/>     <root level="DEBUG">                 <appender-ref ref="STDOUT" />     </root>      </configuration>

输出结果:

13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug  13:19:15.406 [main] INFO  logback.LogbackDemo - ======info  13:19:15.406 [main] WARN  logback.LogbackDemo - ======warn  13:19:15.406 [main] ERROR logback.LogbackDemo - ======error

<logger name="logback" /> 将控制logback包下的所有类的日志的打印,但是并没有设置打印级别,所以继承他的上级的日志级别“DEBUG”。

没有设置addtivity,默认为true,将此logger的打印信息向上级传递。

没有设置appender,此logger本身不打印任何信息。

<root level="DEBUG">将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行 <logger name="logback" />,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印。

root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台。

带有多个logger的配置,指定级别,指定appender

<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="logback"/>     <!--logback.LogbackDemo:类的全路径 -->     <logger name="logback.LogbackDemo" level="INFO" additivity="false">      <appender-ref ref="STDOUT"/>    </logger>     <root level="ERROR">                 <appender-ref ref="STDOUT" />     </root>     </configuration>
原创粉丝点击