zoukankan      html  css  js  c++  java
  • slf4j

     

    转自:http://www.tuicool.com/articles/IfeUfq

    slf4j(simple logging facade for java)

    slf4j(simple logging facade for java)是Java的简单的日志门面,它 不是具体的日志解决方案,它只服务于各种各样 slf4j-logo

    的日志系统。这里的slf4j-logo可以是log4j,可以是jdk的日志,可以是logback,还可以是slf4j-simple等等。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。这里其实用到了一种设计模式(Facade设计模式,门面设计模式)。如下图:

    实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算用那个具体的日志系统。只需要在项目中加入定的slf4j-logo.jar包就可以。这个和Spring的IOC思想有点像,想用哪个就用哪个,随意切换。

    使用slf4j这种记录日志的方式的特点很明显:1、如果我们需要记录的是底层类库或者组件这种东西,就可以不影响或强制要求用户选择哪种日志系统。2、如果我们用特定的日志系统写了代码,但是有一天要求换另一种日志系统,如果之前就用slf4j的api写的,那就很简单,但是如果用具体的一种方式写了以后,那在切换就很麻烦。

    在代码中的使用示例:

    import org.slf4j.Logger;
    
    import org.slf4j.LoggerFactory;
    
    public class Slf4jTest {
    
    // 首先获得日志记录这个对象
    
    static private Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
    
    public static void main(String[] args) {
    
    // 记录error信息
    
    logger.error("[info message]");
    
    // 记录info,还可以传入参数
    
    logger.info("[info message]{},{},{},{}", "abc", false, 123,new Slf4jTest());
    
    // 记录deubg信息
    
    logger.debug("[debug message]");
    
    // 记录trace信息
    
    logger.trace("[trace message]");
    
    System.out.println("hello world");
    
    }
    
    }

    具体使用哪种日志系统,这个可以随意切换,演示如下:

    1、使用slf4j的simple日志系统:

    在classpath中加入:slf4j-simple.jar,运行程序输入如下:

    [main] ERROR com.swu.gusi.Slf4jTest - [info message]

    [main] INFO com.swu.gusi.Slf4jTest - [info message]abc,false,123,com.swu.gusi.Slf4jTest@503f0b70

    hello world

    2、切换成jdk的日志系统:

    在classpath中将 slf4j-logo.jar 换成slf4j-jdk.jar,运行程序如下:

    九月 20, 2014 12:33:52 下午 com.swu.gusi.Slf4jTest main

    严重: [info message]

    九月 20, 2014 12:33:52 下午 com.swu.gusi.Slf4jTest main

    信息: [info message]abc,false,123,com.swu.gusi.Slf4jTest@400da341

    hello world

    3、切换成log4j的日志系统:

    在classpath中将slf4j-logo.jar换成slf4j-log4j.jar,注意这在使用log4j的时候,需要自己配置log4j.properites文件或者log4j.xml。至于log4j的使用查阅其他文档。

    4、切换成其他的日志系统和上面相同。

    5、如果classpath中有多种日志系统,会怎么样呢。会提示类似如下信息(最好别这样搞):

    SLF4J: Class path contains multiple SLF4J bindings.

    SLF4J: Found binding in [jar:file:/E:/Repository/org/slf4j/slf4j-simple/1.7.7/slf4j-simple-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]

    SLF4J: Found binding in [jar:file:/E:/Repository/org/slf4j/slf4j-jdk14/1.7.7/slf4j-jdk14-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]

    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

    SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]

    [main] ERROR com.swu.gusi.Slf4jTest - [info message]

    [main] INFO com.swu.gusi.Slf4jTest - [info message]abc,false,123,com.swu.gusi.Slf4jTest@10e80317

    hello world

    金丝燕  http://swiftlet.net/archives/704

    slf4j全称是:simple logging facade for java,可以理解为简单日记门面。准确的说,slf4j并不是一种具体的日志系统,而是一个用户日志系统的facade,它允许用户在部署最终应用时方便的变更其日志系统。
    在系统开发中,统一按照slf4j的API进行开发,在部署时,选择不同的日志系统包,即可自动转换到不同的日志系统上。
    比如:选择JDK自带的日志系统,则只需要将slf4j-api-1.5.10.jar和slf4j-jdk14-1.5.10.jar放置到classpath中即可,如果中途无法忍受JDK自带的日志系统了,想换成log4j的日志系统,仅需要用slf4j-log4j12-1.5.10.jar替换slf4j-jdk14-1.5.10.jar即可(当然也需要log4j的jar及配置文件)
    slf4j最吸引我的地方是:占位符(place  holder)的使用。占位符在代码中表示为“{}”的特性。占位符是一个非常类似于在String的format()方法中的%s,因为它会在运行时被某个提供的实际字符串所替换。这不仅降低了代码中字符串连接次数,而且还节省了新建的String对象。
    下面是在Log4j中使用的方案,但这样做降低了代码可读性因为增加了不必要的繁琐重复代码(boiler-plate code):
    if (logger.isDebugEnabled())
    {
        logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
    }
    但是如果你使用slf4j的话,你可以得到在极简洁的格式的结果,就像以下展示的一样:
    logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);

  • 相关阅读:
    hinge loss
    KL散度
    pygame 学习
    pytorch 反向传播
    在线画数学函数图
    recover deleted files
    98个关键点的人脸
    Pytorch详解BCELoss和BCEWithLogitsLoss
    one hot vector
    Effective C++
  • 原文地址:https://www.cnblogs.com/mrxiaohe/p/6100850.html
Copyright © 2011-2022 走看看