精华内容
下载资源
问答
  • 首先声明一下,我用的 Intellij IDEA 2018.3 版本的,springboot的版本是 2.0.5.RELEASE 版本。 当我喜滋滋的编写完测试代码,点击 Debug 的时候,睁大眼睛看控制台简直是看得一脸懵逼,控制台显示如下...SLF4J: D...

    首先声明一下,我用的 Intellij IDEA 2018.3 版本的,springboot的版本是 2.0.5.RELEASE  版本。

    当我喜滋滋的编写完测试代码,点击 Debug 的时候,睁大眼睛看控制台简直是看得一脸懵逼,控制台显示如下:

    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.
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.0.5.RELEASE)
    
    十二月 13, 2018 4:48:04 下午 org.apache.catalina.core.StandardService startInternal
    信息: Starting service [Tomcat]
    十二月 13, 2018 4:48:04 下午 org.apache.catalina.core.StandardEngine startInternal
    信息: Starting Servlet Engine: Apache Tomcat/8.5.34
    十二月 13, 2018 4:48:04 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [D:\Program Files\java\jdk1.8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\NetSarang;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;D:\Program Files\java\jdk1.7\bin;D:\Program Files\mysql-5.7.17\bin;C:\WINDOWS\System32\OpenSSH\;D:\Program Files\Git\cmd;D:\Program Files\TortoiseSVN\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;.]
    十二月 13, 2018 4:48:05 下午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring embedded WebApplicationContext

    没错,就是这么点日志,但是注意 第一行  SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

    然后去 http://www.slf4j.org/codes.html#StaticLoggerBinder  地址看了下解决方法,这里我就不详细说了,反正大概意思就加上slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar,slf4j-jdk14.jar或 logback-classic.jar中的其中一个jar包就行(只能是一个,多了就会有冲突)。

    于是乎我加了 slf4j-simple  jar包代码如下:(这段代码是我直接从线上maven库中copy出来的,肯定不会有错)

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
        <scope>test</scope>
      </dependency>

    引入依赖后,启动还是报错,一模一样,这TM就有点过分了,官网的解决方法一般是不会出错的,而且之前我也百度过,也是差不多一样的做法,那到底是什么问题呢?

    于是又是一顿找,看看前辈们有没有碰到过类似的错误,终于有所发现,最终修改代码如下:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
        <scope>compile</scope>
      </dependency>
    

    没错,就是毁在这段代码上 <scope>test</scope> ,test表示只有在测试环境下,才可以使用,而我springboot是运行在main方法中,是不属于测试环境,所以这个包就相当于没有加入依赖,也就没有被加载到。改成compile则表示编译的时候就会加载此jar包,那么最后就运行成功了,成功的日志如下:
     

    "D:\Program Files\java\jdk1.8\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51555,suspend=y,server=n -javaagent:C:\Users\Administrator\.IntelliJIdea2018.3\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "D:\Program Files\java\jdk1.8\jre\lib\charsets.jar;D:\Program Files\java\jdk1.8\jre\lib\deploy.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\cldrdata.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\dnsns.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\jaccess.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\jfxrt.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\localedata.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\nashorn.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunec.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\Program Files\java\jdk1.8\jre\lib\ext\zipfs.jar;D:\Program Files\java\jdk1.8\jre\lib\javaws.jar;D:\Program Files\java\jdk1.8\jre\lib\jce.jar;D:\Program Files\java\jdk1.8\jre\lib\jfr.jar;D:\Program Files\java\jdk1.8\jre\lib\jfxswt.jar;D:\Program Files\java\jdk1.8\jre\lib\jsse.jar;D:\Program Files\java\jdk1.8\jre\lib\management-agent.jar;D:\Program Files\java\jdk1.8\jre\lib\plugin.jar;D:\Program Files\java\jdk1.8\jre\lib\resources.jar;D:\Program Files\java\jdk1.8\jre\lib\rt.jar;E:\IdeaProjects\miaosha\target\classes;E:\repository\org\springframework\boot\spring-boot-starter-web\2.0.5.RELEASE\spring-boot-starter-web-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot-starter\2.0.5.RELEASE\spring-boot-starter-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot\2.0.5.RELEASE\spring-boot-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.5.RELEASE\spring-boot-autoconfigure-2.0.5.RELEASE.jar;E:\repository\org\springframework\boot\spring-boot-starter-logging\2.0.5.RELEASE\spring-boot-starter-logging-2.0.5.RELEASE.jar;E:\repository\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;E:\repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;E:\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;E:\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;E:\repository\org\springframework\spring-core\5.0.9.RELEASE\spring-core-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-jcl\5.0.9.RELEASE\spring-jcl-5.0.9.RELEASE.jar;E:\repository\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;E:\repository\org\springframework\boot\spring-boot-starter-json\2.0.5.RELEASE\spring-boot-starter-json-2.0.5.RELEASE.jar;E:\repository\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;E:\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;E:\repository\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;E:\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;E:\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;E:\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;E:\repository\org\springframework\boot\spring-boot-starter-tomcat\2.0.5.RELEASE\spring-boot-starter-tomcat-2.0.5.RELEASE.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.34\tomcat-embed-core-8.5.34.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.34\tomcat-embed-el-8.5.34.jar;E:\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.34\tomcat-embed-websocket-8.5.34.jar;E:\repository\org\hibernate\validator\hibernate-validator\6.0.12.Final\hibernate-validator-6.0.12.Final.jar;E:\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;E:\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;E:\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;E:\repository\org\springframework\spring-web\5.0.9.RELEASE\spring-web-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-beans\5.0.9.RELEASE\spring-beans-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-webmvc\5.0.9.RELEASE\spring-webmvc-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-aop\5.0.9.RELEASE\spring-aop-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-context\5.0.9.RELEASE\spring-context-5.0.9.RELEASE.jar;E:\repository\org\springframework\spring-expression\5.0.9.RELEASE\spring-expression-5.0.9.RELEASE.jar;E:\repository\org\slf4j\slf4j-simple\1.7.25\slf4j-simple-1.7.25.jar;E:\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\Program Files\IntelliJ IDEA 2018.3\lib\idea_rt.jar" cn.com.miaosha.App
    Connected to the target VM, address: '127.0.0.1:51555', transport: 'socket'
    Hello World!
    [background-preinit] INFO org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 6.0.12.Final
     
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.0.5.RELEASE)
     
    [main] INFO cn.com.miaosha.App - Starting App on SC-201806131812 with PID 13188 (E:\IdeaProjects\miaosha\target\classes started by Administrator in E:\IdeaProjects\miaosha)
    [main] INFO cn.com.miaosha.App - No active profile set, falling back to default profiles: default
    [main] INFO org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext - Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@36b4fe2a: startup date [Thu Dec 13 17:07:55 CST 2018]; root of context hierarchy
    [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.StandardService startInternal
    信息: Starting service [Tomcat]
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.StandardEngine startInternal
    信息: Starting Servlet Engine: Apache Tomcat/8.5.34
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
    信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [D:\Program Files\java\jdk1.8\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\NetSarang;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;D:\Program Files\java\jdk1.7\bin;D:\Program Files\mysql-5.7.17\bin;C:\WINDOWS\System32\OpenSSH\;D:\Program Files\Git\cmd;D:\Program Files\TortoiseSVN\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;;.]
    十二月 13, 2018 5:08:02 下午 org.apache.catalina.core.ApplicationContext log
    信息: Initializing Spring embedded WebApplicationContext
    [localhost-startStop-1] INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 7244 ms
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.ServletRegistrationBean - Servlet dispatcherServlet mapped to [/]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'characterEncodingFilter' to: [/*]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'httpPutFormContentFilter' to: [/*]
    [localhost-startStop-1] INFO org.springframework.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'requestContextFilter' to: [/*]
    [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@36b4fe2a: startup date [Thu Dec 13 17:07:55 CST 2018]; root of context hierarchy
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/]}" onto public java.lang.String cn.com.miaosha.App.home(javax.servlet.http.HttpServletRequest)
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    [main] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    [main] INFO org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    [main] INFO org.springframework.jmx.export.annotation.AnnotationMBeanExporter - Registering beans for JMX exposure on startup
    [main] INFO org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
    [main] INFO cn.com.miaosha.App - Started App in 11.308 seconds (JVM running for 14.362)
    

    这日志看上去就正常了。

    当然这只是我的解决方法,也许是我的粗心大意吧!如果你也遇到了这种情况可以不妨一试吧。

    展开全文
  • slf4j

    千次阅读 2019-07-24 10:32:27
    简单的Java日志记录(SLF4J) 官方文档:https://www.slf4j.org/docs.html 一.什么是SLF4JSLF4J是用于日志记录系统的简单外观,允许最终用户在部署时插入所需的日志记录系统。Simple Logging Facade for Java...

    简单的Java日志记录(SLF4J)

    官方文档:https://www.slf4j.org/docs.html

    一.什么是SLF4J?

    SLF4J是用于日志记录系统的简单外观,允许最终用户在部署时插入所需的日志记录系统。Simple Logging Facade for Java(SLF4J)用作各种日志框架(例如java.util.logging,logback,log4j)的简单外观或抽象,允许最终用户在部署 时插入所需的日志记录框架。

    最简单的slf4j示例:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;

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

    要运行此示例,首先需要下载slf4j发行版,然后将其解压缩。完成后,将文件 slf4j-api-1.7.26.jar添加到类路径中。

    https://www.slf4j.org/download.html

    二.什么时候应该使用SLF4J?

    SLF4J只是一个外观,这意味着它不提供完整的日志记录解决方案。使用SLF4J无法执行配置appender或设置日志记录级别等操作。因此,在某个时间点,任何非平凡的应用程序都需要直接调用底层日志记录系统。换句话说,独立应用程序无法完全独立于API底层日志记录系统。然而,SLF4J减少了这种依赖对近乎无痛水平的影响。
    假设您的CRM应用程序使用log4j进行日志记录。但是,您的一个重要客户端要求通过JDK 1.4日志记录执行日志记录。如果您的应用程序充斥着成千上万的直接log4j调用,那么迁移到JDK 1.4将是一个相对冗长且容易出错的过程。更糟糕的是,您可能需要维护两个版本的CRM软件。如果您一直在调用SLF4J API而不是log4j,则可以在几分钟内通过将一个jar文件替换为另一个jar文件来完成迁移。
     

    官方提供的典型使用模式:

     

    Fluent Logging API

    自2.0.0以来, SLF4J API 2.0.0版需要Java 8,并引入了向后兼容的流畅日志API。我们的想法是与LoggingEventBuilder一起构建一个日志记录事件, 并在事件完全构建后记录。所有新的org.slf4j.Logger界面,返回的一个实例LoggingEventBuilder。对于禁用的日志级别,返回的 LoggingEventBuilder实例不执行任何操作,从而保留常规日志记录接口的纳秒级性能。使用下列方法:

    atTrace(),atDebug(),atInfo(),atWarn(),atError()

    以下是一些使用示例:

            int newT = 15;
            int oldT = 16;
    
            // using classical API
            logger.debug("Temperature set to {}. Old temperature was {}.", newT, oldT);
    
            // using fluent API, add arguments one by one and then log message
            logger.atDebug().addArgument(newT).addArgument(oldT).log("Temperature set to {}. Old temperature was {}.");
    
            // using fluent API, log message with arguments
            logger.atDebug().log("Temperature set to {}. Old temperature was {}.", newT, oldT);
    
            // using fluent API, add one argument and then log message providing one more argument
            logger.atDebug().addArgument(newT).log("Temperature set to {}. Old temperature was {}.", oldT);
    
            // using fluent API, add one argument with a Supplier and then log message with one more argument.
            // Assume the method t16() returns 16.
            logger.atDebug().addArgument(() -> t16()).log(msg, "Temperature set to {}. Old temperature was {}.", oldT);
    

    以下日志语句在其输出中是等效的(就默认实现而言):

    int newT = 15;
            int oldT = 16;
    
            //使用经典API
            logger.debug(“oldT = {} newT = {}温度已更改。”,newT,oldT);
    
            //使用流畅的API
            logger.atDebug()。addKeyValue(“oldT”,oldT) .addKeyValue(“newT”,newT).log(“Temperature changed。”);

    SLF4J不依赖于任何特殊的类装载机械。实际上,每个SLF4J绑定在编译时都是硬连线的 以使用一个且只有一个特定的日志记录框架。例如,slf4j-log4j12-1.7.26.jar绑定在编译时绑定以使用log4j。在您的代码中,除了slf4j-api-1.7.26.jar之外,您只需将 您选择的一个且只有一个绑定放到相应的类路径位置。不要在类路径上放置多个绑定。以下是一般概念的图解说明。

    SLF4J接口及其各种适配器非常简单。大多数熟悉Java语言的开发人员应该能够在不到一小时的时间内阅读并完全理解代码。不需要类加载器的知识,因为SLF4J不能使用,也不能直接访问任何类加载器。因此,SLF4J不会遇到使用Jakarta Commons Logging(JCL)观察到的类加载器问题或内存泄漏。

    鉴于SLF4J接口及其部署模型的简单性,新的日志框架的开发人员应该发现编写SLF4J绑定非常容易。

    三.SLF4J API


    在SLF4J 1.0beta4中,修改了Logger接口中的debug(),info(),warn(),error()等打印方法,以便只接受String类型而不是Object类型的消息。

    因此,DEBUG级别的打印方法集合变为:

    debug (String msg );
    debug (String format ,Object arg );
    debug (String format ,Object arg1 ,Object arg2 );             
    debug (String msg ,Throwable t );

    打印错误输出日志:

    logger.error("some accompanying message", e);
    
    
    logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    
    Object entry = new SomeObject();
    logger.debug("The entry is {}.", entry);
    
    logger.debug("The new entry is "+entry+".");
    logger.debug("The new entry is {}.", entry);
    
    logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);
    
    logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);

    如何记录单个(可能是复杂的)对象的字符串内容?

    在要记录的消息是对象的字符串形式的相对罕见的情况下,可以使用适当级别的参数化打印方法。假设complexObject是一个具有某种复杂性的对象,对于级别DEBUG的日志语句,您可以编写:

    logger.debug (“{}”,complexObject );logger.debug (“{}”,complexObject );

    complexObject.toString()只有在确定启用了日志语句后,日志记录系统才会调用 方法。否则,complexObject.toString()将有利地避免转换成本 。

     

    四.实现SLF4J API

    如何使我的日志框架SLF4J兼容?
    增加对SLF4J的支持非常简单。从本质上讲,你应对现有的绑定并稍微调整它(如下所述)就可以了。
    假设您的日志记录系统具有记录器的概念,例如MyLogger,您需要提供适用MyLogger于 org.slf4j.Logger接口的适配器。有关适配器的示例,请参阅slf4j-jcl,slf4j-jdk14和slf4j-log4j12模块。
    一旦编写了适当的适配器,比如说 MyLoggerAdapter,您需要提供一个实现该org.slf4j.ILoggerFactory 接口的工厂类。这个工厂应该返回实例 MyLoggerAdapter。让我们MyLoggerFactory 的工厂类名称。
    一旦你有了适配器,即 MyLoggerAdapter和工厂,即 MyLoggerFactory最后剩下的一步是修改StaticLoggerBinder类,使它返回一个新的实例MyLoggerFactory。您还需要修改loggerFactoryClassStr变量。
    对于Marker或MDC支持,您可以使用现有的NOP实现之一。
    总之,要为日志记录系统创建SLF4J绑定,请按照下列步骤操作:

    1. 从现有模块的副本开始,
    2. 在日志系统和org.slf4j.Logger接口 之间创建适配器
    3. 为上一步创建的适配器创建工厂,
    4. 修改StaticLoggerBinder类以使用您在上一步中创建的工厂


    总之,将logger成员声明为静态变量需要较少的CPU时间并且内存占用量略小。另一方面,将记录器成员声明为实例变量需要更多的CPU时间并且具有稍高的内存开销。但是,实例变量可以为每个应用程序创建不同的记录器环境,即使对于在共享库中声明的记录器也是如此。也许比之前提到的考虑因素更重要的是,实例变量对IOC友好,而静态变量则不然。

     

    声明用法:

    package some.package;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
          
    public class MyClass {
      final (static) Logger logger = LoggerFactory.getLogger(MyClass.class);
      ... etc
    }

    参考文档:https://www.slf4j.org/

    展开全文
  • slf4j-nop-slf4j-api

    2019-12-18 12:33:16
    slf4j\jcl-over-slf4j\1.5.6 slf4j-api\1.5.6 slf4j\slf4j-api\1.7.5 slf4j\slf4j-api\1.7.26 slf4j\slf4j-jdk14\1.5.6 slf4j\slf4j-parent\1.5.6 slf4j\slf4j-nop\1.7.26 slf4j\slf4j-parent\1.7.26
  • log4j-1.2.17; slf4j-api-1.7.12; slf4j-log4j12-1.7.12; slf4j-api-1.7.25; slf4j-log4j12-1.7.25;
  • SLF4J

    千次阅读 2011-08-25 12:46:46
    SLF4J(Simple Logging Facade for Java) SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。  SLF4J 不依赖任何特殊的classloader机制,S
    SLF4J(Simple Logging Facade for Java)
    
    SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 
    SLF4J 不依赖任何特殊的classloader机制,SLF4J和已有日志实现的绑定是在编译时静态执行的,具体绑定工作是通过一个jar包实现的,
    使用时只要把相应的jar包(只有一个)放到类路径上即可。


    使用slf4j尽管很方便,但是让很多人搞不明白slf4j那么多包怎么用。 
    其实slf4j原理很简单,他只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口,并没有实现,
    所以如果要使用就得再给它提供一个实现了些接口的日志包,比 如:log4j,common logging,jdk log日志实现包等,但是这些日志实现又不能通过接口直接调用,实现上他们根本就和slf4j-api不一致,因此slf4j又增加了一层来转换各日志实现包的使 用,当然slf4j-simple除外。
    下面是一段经典的使用SLF4J代码:
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    public class Wombat {
        final Logger logger = LoggerFactory.getLogger(Wombat.class);
        Integer t,oldT;
        public void setTemperature(Integer temperature) {
            oldT = t;
            t = temperature;
            logger.error("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) {
            Wombat wombat = new Wombat();
            wombat.setTemperature(1);
            wombat.setTemperature(55);
        }
    }
    下边介绍一下运行上边程序的过程。
    1,编译上边的程序,需要classpath中加入slf4j-api-1.4.1.jar文件
    2,运行时,需要classpath中加上slf4j-simple-1.4.1.jar
    运行得到结果:
    ----------------------------
    0 [main] ERROR Wombat - Temperature set to 1. Old temperature was null.
    0 [main] ERROR Wombat - Temperature set to 55. Old temperature was 1.
    0 [main] INFO Wombat - Temperature has risen above 50 degrees.
    这个是simple log风格,


    3,切换:如果想切换到jdk14的log的风格,只需要把slf4j-simple-1.4.1.jar
    从classpath中移除,同时classpath中加入slj4j-jdk14-1.4.1.jar
    这时的运行结果:
    ---------------------------------------------------
    2007-7-9 10:40:15 Wombat setTemperature
    严重: Temperature set to 1. Old temperature was null.
    2007-7-9 10:40:16 Wombat setTemperature
    严重: Temperature set to 55. Old temperature was 1.
    2007-7-9 10:40:16 Wombat setTemperature
    信息: Temperature has risen above 50 degrees.
    已经变成jdk14的log风格了。


    4,再次切换到log4j
    同样移除slj4j-jdk14-1.4.1.jar,加入slf4j-log4j12-1.4.1.jar,同时加入log4j-1.2.x.jar
    加入log4j.properties。得到显示结果:
    ---------------------------------------
    10:42:27,328 ERROR Wombat: Temperature set to 1. Old temperature was null.
    10:42:27,328 ERROR Wombat: Temperature set to 55. Old temperature was 1.
    10:42:27,328  INFO Wombat: Temperature has risen above 50 degrees.
    在不同的风格中切换只需要在部署期切换类库就可以了,和开发时无关。
    展开全文
  • liquibase-slf4j 版本4.0.0 由马特·贝托利尼(Matt Bertolini)撰写 直接委托给SLF4J的Liquibase记录器的实现。 Liquibase有一个委托给java.util.logging的日志记录机制。 如果您使用jul-to-slf4j库,它就可以很...
  • log4j+slf4j实现 log4j测试代码,log4j+slf4j实现 log4j测试代码,
  • slf4j-timbre:用于Clojure的Timbre的SLF4J绑定
  • jfinal-slf4j jfinal slf4j log api,查看其他插件-> maven 引用 ${jfinal-slf4j.version}替换为相应的版本如:0.1 <groupId>cn.dreampie</groupId> <artifactId>jfinal-slf4j ${jfinal-slf4j.version} public ...
  • 【问题记录】java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding ...

    【问题记录】java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path

    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/C:/Users/liulei06/.m2/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/C:/Users/liulei06/.m2/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError. 
    SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
    java.lang.ExceptionInInitializerError
    	at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
    	at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
    	at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
    	at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
    	at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
    	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
    	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
    	at com.iqiyi.lego.gaoda.write.LegoMicroserviceApplication.<clinit>(LegoMicroserviceApplication.java:18)
    Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError. See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
    	at org.slf4j.impl.Log4jLoggerFactory.<clinit>(Log4jLoggerFactory.java:54)
    	... 8 more
    Exception in thread "main" 
    

    原因&解决方案:看日志应该是jar包冲突导致堆栈溢出,排除slf4j-log4j12.jar即可,推荐使用mavern helper来查看jar包路径

    展开全文
  • slf4j-log4j12-1.7.7和slf4j-api-1.7.7
  • 1.解决SLF4J报错 我们在自己的项目中使用了SLF4J,或者引入了某开源项目时,他的项目中用了SLF4J,运行时会报如下的错误: SLF4J: No SLF4J providers were found. SLF4J: Defaulting to no-operation (NOP) ...
  • 【解决】SLF4J: Class path contains multiple SLF4J bindings.

    千次阅读 多人点赞 2021-02-19 17:46:56
    【解决】SLF4J: Class path contains multiple SLF4J bindings. 在启动springboot项目时,遇到了这个问题,上网查询多个方案,最终这个方法得到解决 问题描述: SLF4J: Class path contains multiple SLF4J bindings...
  • 让代码飞 ...SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in 异常: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:fi...
  • scalyr-slf4j Scalyr 服务的 SLF4J 绑定。 这完全消除了对 Log4J 或 Logback 的依赖。
  • 主要介绍了详解log4j-over-slf4jslf4j-log4j12共存stack overflow异常分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • slf4j-api和slf4j-nop打包下载,只需解压文件,就能得到slf4j-api.jar和slf4j-nop.jar
  • @Slf4j 注解 lombok.extern.slf4j.Slf4j

    万次阅读 2018-11-20 17:11:53
    @Retention(RetentionPolicy....public @interface Slf4j { String topic() default ""; } 源码中可以看到@Slf4j这个注解是SOURCE级别的,在class文件中被解析成 private static final Logger log ...
  • slf4j-api-1.7.7 ,slf4j-log4j12-1.7.7 ,slf4j-nop-1.7.7 ,slf4j-simple-1.7.7 里面还有其它包
  • Slf4j分析】slf4j-api和slf4j-simple

    万次阅读 2016-09-09 19:17:16
    本来想分析logback源码,可是它太多了~读起来有点吃力,先分析下slf4j和它的简单实现slf4j-simple一 基础使用maven: <groupId>org.slf4j <artifactId>slf4j-api <version>1.7.21 </depe
  • 实用java库-Mysql&Java;_Mail&Slf4j;_Api&Slf4j;_Log4j mysql-connector-java-5.1.47.jar mail.jar activation.jar slf4j-api-1.7.25.jar slf4j-log4j12-1.7.25.jar
  • slf4j-1.6.1.tar.gz slf4j-1.6.1.zip slf4j-1.6.1
  • slf4j-log4j12-1.6.1.jar slf4j-log4j

    热门讨论 2011-06-22 17:31:02
    slf4j-log4j12-1.6.1.jar slf4j-log4j
  • slf4j2elk demo版暂不能在生产中使用 基于slf4j-simple源码修改 Maven中使用在pom.xml <groupId>com.denghb</groupId> <artifactId>slf4j2elk <version>1.0.3 项目classpath创建slf4j2elk.properties并写入一下...
  • 齐奥-slf4j slf4j的参照透明日志记录 不要忘记在类路径中包含slf4j-api的实现(例如logback)。 libraryDependencies += "com.nequissimus" %% "zio-slf4j" % "0.4.1" 用法 有关简单的用法示例,请参见 。 Scala兹...
  • 对于j2ee 开发者来说,难免会引入各种框架,而当需要查看框架打印的日志的时候,你会发现每个框架引用的日志框架又不相同,什么slf4j,logback,log4j… 头都大了,处理的一不小心,轻则日志打印不出来,重则项目起不...
  • 原因 引入了一个第三方 jar 包,里面...SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/C:/Users/tudan/Documents/WorkLearn3/wechat-demo/lib/itchat4j-1.1.0-jar-wi...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 207,249
精华内容 82,899
关键字:

slf4j