SLF4J

来源:互联网 发布:2005数据库图标 编辑:程序博客网 时间:2024/04/30 15:32

 

SLF4J服务于各种各样的日志API,并允许最终用户在部署时加入所希望的实施(logging API),以展现Log不同的风格、布局,并且灵活的切换以得到高效率无耦合的结果。

Logging API实现既可以选择直接实现SLF4J接口的logging APIs如: logbackSimpleLogger,当然它也可以构造SLF4J适配器来应用所提供的API,例如Log4jLoggerAdapterJDK14LoggerAdapter.因此SLF4J所提供的针对LOG的多方面应用及开发,能够为我们在软件开发中的LOG表现提供更灵活,更多样化的展现。

    SLF4J是一个Log的表现,其并不能提供完全的日志应用。对于配置及日志的级别都不能通过SLF4J得到体现。另一方面,独立的应用程序过余依赖logging systemAPI,然而SLF4J则可以使依赖性降低到近乎最低的程度。假设有一个使用log4jCRM应用程序。当用户要求通过JDK 1.4 logging来表现日志的时候,面对成千上万的log4j的直接调用,转换成JDK1.4将成为一个很长错误频频的处理过程。当我们调用SLF4J来代替log4j的时候,这样的转变将成为一件十分轻松的事。还有一个值得提及的问题就是,SLF4J 不依赖任何特殊的class loader机制,实际上,SLF4J 和已有日志实现的绑定是在编译时静态执行的,具体绑定工作是通过一个jar包实现的。因此对于SLF4J的应用不需要对应用程序进行重新编译,而只需要对classpathjar进行设置。在部署的时候,终端用户可以通过插入相应的jar包文件来选择日志的描述形式。slf4j-api.jar必须在classpath下设置路径以提供函数(方法)使用,以配合classpah下的SLF4J包的应用,也就是说SLF4J提供多用户日志系统,包括NOPSimplelog4j 1.2JDK 1.4JCLlogback.并响应的发布一些包slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-log4j13.jar, slf4j-jdk14.jar and slf4j-jcl.jar,切都依赖于slf4j-api.jar

提供从JCLSLF4J的转变。当然对于log4j也提供了相应的log4j-over-slf4j.jar包。

jcl104-over-slf4j.jarslf4j-jcl.jar包,前者建立在SLF4J基础上的JCL API提供完整的逆兼容性,并且在替换以后不存在class loader装载的问题,而且在logging system以下能够通过classpath的配置替换使用NOP, simple, jdk14 logging, log4j 或者 logback。后者则应用的SLF4J API,并在需要JCL应用时提供JCL Binding,这也是以提供用户以灵活便捷的使用。当然二者不能同时使用,否则会导致对SLF4JJCL的混乱使用。

以下是一些应用上面的基础:

debug(String msg, Throwable t)

可以保证每个异常与日志描述信息相联系。

logger.error("some accompanying message", e);

e作为一个异常,在处理的时候应当关联一个相应的信息。

SLF4J 1.0beta4中,打印输出方法被修改成只能接受String类型消息来替代Object类型,例如debug().info().warn().error().,这些都是日志级别的具体方法。

debug(String msg);

debug(String format, Object arg);

debug(String format, Object arg1, Object arg2);

debug(String msg, Throwable t);

早先第一个参变量是Object类型,现在成为一种格式化的String类型。例:

Object entry = new SomeObject();

logger.debug("The entry is {}.", entry);

entry替代{}

logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);

entryoldEntry替代前后两个{}

logger.debug("Value {} was inserted between {} and {}.", new Object[] {newVal, below, above});

加强效率~避免debug在无效的时候执行。主要针对效率不高的情况下。

if(logger.isDebugEnabled())

 { logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); }

总的来说,按照SLF4J的中文翻译,及站点上所提供的介绍,其构建的初衷就是为了为用户的各种log表现需求提供更加便捷,更加灵活高效的应用方式,无论是从JCLlog4j的转换,还是自身的独立应用,都表现出了一种开发与维护使用的分离,加强了log的自由应用。

 

一些基本应用:

package slf4jDemo;

 

import java.io.*;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.lang.*;

 

 

class slf4j extends Exception{

    Logger t=LoggerFactory.getLogger(slf4j.class);

   

    public void setMessage(String a)

    {

       t.error("异常种类为{}",a);

    }

    }

 

public class slf4jtest {

    private int i;

    public  void f1() throws FileNotFoundException

    {

       FileInputStream f=new FileInputStream(new File("E://JAVA//slf4j//slf4jDemo//test11"));

       throw new FileNotFoundException("test not found");

    }

    public void f2() throws FileNotFoundException

    {

       FileInputStream f=new FileInputStream(new File("E://JAVA//slf4j//slf4jDemo//test22"));

       throw new FileNotFoundException("test1 not found");

    }

    public static void main(String []args){

       slf4j basin=new slf4j();

       slf4jtest test=new slf4jtest();

       try{

           test.f1();   

                  }

       catch(FileNotFoundException n){

                         basin.setMessage(n.getMessage());

                     }

       try{

           test.f2();

           }

       catch(FileNotFoundException m){

                  basin.setMessage(m.getMessage()); 

                         }

    }

原创粉丝点击