SLF4J和log4j的使用

SLF4J的使用和Log4j的配置

SLF4J 简介

完整用户手册请异步:SLF4J 使用手册
SLF4J是Simple Logging Facade for Java的简写,即Java简单日志门面,用来服务于各类各样的日志框架,好比java.util.logging、logback和log4j。SLF4J容许最终用户在部署时集成本身想要的日志框架。
须要注意的是,你的应用启用SLF4J意味着须要一个额外的依赖:slf4j-api-1.7.19.jar。
从1.6.0开始:若是在class path没有找到绑定,SLF4J将默认一个无操做的实现。
从1.7.0开始:Logger接口中的打印方法如今提供variants取代了Object[]用来接收可变长参数。这个改变意味着SLF4J须要JDK 1.5或更高的版本。Java编译器在底层把方法中的可变参数部分转换成Object[]。所以,编译器生成的Logger接口在1.7.x版本中和它对应的的1.6.x版本中是没有区别的。所以SLF4J得1.7.x版本和1.6.x版本是 彻底兼容的。
从1.7.5开始:日志的检索时间有了一个显著的改善,鉴于这个改善,很是鼓励用户迁移到SLF4J 1.7.5或更高的版本。
从1.7.9开始: 经过设置 slf4j.detectLoggerNameMismatch 系统属性为true,SLF4J能自动的 spot incorrectly named loggers.html

Hello World

按照惯例,下面的示例说明最简单的方法使用SLF4J输出”hello world“。他首先获取一个名为”HelloWorld“的记录器,这个记录器用来记录”HelloWorld“。java

public class HelloWorld {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
    }
}

编译运行HelloWorld,控制台将有一下输出:编程

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
 SLF4J: Defaulting to no-operation (NOP) logger implementation
 SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

这个警告会被打印是由于在class path下没有找到绑定的slf4j。api

一旦你添加一个绑定在你的class path下,这个警告将会消失。假设你添加了 slf4j-simple-1.7.19.jar,你的class path包含:app

  • slf4j-api-1.7.19.jar
  • slf4j-simple-1.7.19.jar

编译并运行HelloWorld程序,如今在控制台会有下列输出:框架

0 [main] INFO HelloWorld - Hello World

典型使用模式

下面的示例代码代表了SLF4J的典型使用模式。注意15行”{}“的使用,查看 “What is the fastest way of logging?”获取更多细节。异步

public class Wombat {
    final Logger logger = LoggerFactory.getLogger(Wombat.class);
    Integer t;
    Integer oldT;
    public void setTemperature(Integer temperature) {
        oldT = t;
        t = temperature;
        logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
        if(temperature.intValue() > 50) {
            logger.info("Temperature has risen above 50 degrees.");
        }
    }
    
    public static void main(String[] args) {
        new Wombat().setTemperature(60);
    }
}

在部署时绑定一个日志框架
像在以前提到过的,SLF4J支持各类各样的日志框架。SLF4J的发行版附带的几个jar被称为” SLF4J bindings“ ,每一个绑定都对应一个支持的框架。
切换日志框架,只须要替换class path中的slf4j绑定。好比说,从 java.util.logging切换到 log4j,仅仅把 slf4j-jdk14-1.7.19.jar替换成 slf4j-log4j12-1.7.19.jar。
SLF4J不依赖于特定的类加载机制。事实上,每一个SLF4J绑定在编译时硬链接来使用一个指定的日志框架。好比说, slf4j-log4j12-1.7.19.jar在编译时绑定使用log4j。在你的代码中,除 slf4j-api-1.7.19.jar以外,只能有一个你选择的绑定 到正确的class path 路径上。不要在class path 放置多个绑定。下面是一个图表来讲明通常的想法。
concrete-bindings.png测试

为了不给他们的终端用户强加一个日志框架 ,一些组件和库的做者可能会针对SLF4J接口进行编程。所以,终端用户在部署时能够经过在classpath插入对应的slf4j绑定来选择他们指望的日志框架。而且,能够把在classpath存在的绑定替 换到另一个,而后重启应用,从而达到切换日志框架的目的,这个方法被证实是很是简单和健壮的。网站

SLF4J的1.6.0版本,若是在class path 没有发现绑定,slf4j-api将默认一个无操做的实现来忽略全部的日志请求。所以,SLF4J从1.6.0版开始发出一个缺乏绑定的警告,而后丢弃全部的打印日志请求,而不是抛出 NoClassDefFoundError异 常由于缺乏 org.slf4j.impl.StaticLoggerBinder 类 。好比说: Wombat 一些基础框架依赖于SLF4J来打印日志。为了不强加一个日志框架给终端用户,Wombat 包含 slf4j-api.jar可是没有绑定。在class path 没有SLF4J绑定的情 况下,Wombat的发行版依然能开箱即用,不须要终端用户下载从SLF4J网站下载一个绑定。仅仅当终端用户开启日志的时候,将须要安装他选择的日志框架对应的SLF4J绑定。spa

基本准则:内置的组件好比库和框架不该该声明任何SLF4J的依赖,可是依赖于SLF4J-api。当一个库在一个指定的绑定声明一个传递依赖,这个强加于终端用户的绑定否认了SLF4J的目的。注意,在绑定上声明一个非传递性的依赖,好比说 对测试,不影响终端用户。

内嵌组件中SLF4J的使用也在FAQ中进行讨论。有关系的章节: logging configuration dependency reduction testing

声明项目的日志依赖

鉴于Maven的传递依赖规则,对于”regular“项目(不是库和框架),日志依赖声明 能够经过一个单独的依赖声明来实现。
LOG4J:若是你但愿使用log4j做为底层的日志框架,你须要作的全部事情就是声明” org.slf4j:slf4j-log4j12“依赖到你的pom.xml文件中。除了 slf4j-log4j12-1.7.19.jar以外,它将拉取 slf4j-api-1.7.19.jar和 log4j-1.2.17.jar到你的项目 中。注意,显示地声明一个依赖 log4j-1.2.17.jar或 slf4j-api-1.7.19.jar 没有错。而且可能须要强加一个正确的版本

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.19</version>
</dependency>

经过SLF4J统一日志

一般,一个给定的项目依赖于各类各样的组件,这些组件依赖的日志API不是SLF4J。一个项目依赖于一个JCL、java.util.logging、log4j和SLF4J是很常见的。而后经过一个单独的方式来统一日志变得让人满意。SLF4J经过提供对JCL、

java.util.logging、和slf4j的桥接模块来知足这个普通的用例。更详细的内容,请参考 Bridging legacy APIs.

MDC支持

“Mapped Diagnostic Context”本质上是日志框架包含的一个map,应用程序代码提供了key-value对,这个键值对能被日志框架插入到日志信息中去。MDC数据在过滤信息或触发某些操做时是很是有用的。

SLF4J支持MDC,若是一个底层的日志框架提供了MDC功能,SLF4J将委托给底层日志框架的MDC。注意,如今仅仅只有log4j和logback提供了MDC功能。若是底层日志框架不支持MDC,好比说java.util.loggin,SLF4J将存储MDC数 据,可是里面的数据须要用户经过代码来获取。

所以,做为一个SLF4J使用者,能利用当 log4j和logback存在时的 MDC信息,可是不能强迫用户依赖这些日志框架。

关于MDC的更多信息参见 chapter on MDC

Log4J xml配置

相关文章
相关标签/搜索