zoukankan      html  css  js  c++  java
  • 捕获异常之使用SLF4J和Logback

    前面介绍了Commons Logging和Log4j这一对好基友,它们一个负责充当日志API,一个负责实现日志底层,搭配使用非常便于开发。

    有的童鞋可能还听说过SLF4J和Logback。这两个东东看上去也像日志,它们又是啥?

    其实SLF4J类似于Commons Logging,也是一个日志接口,而Logback类似于Log4j,是一个日志的实现。

    为什么有了Commons Logging和Log4j,又会蹦出来SLF4J和Logback?这是因为Java有着非常悠久的开源历史,不但OpenJDK本身是开源的,而且我们用到的第三方库,几乎全部都是开源的。开源生态丰富的一个特定就是,同一个功能,可以找到若干种互相竞争的开源库。

    因为对Commons Logging的接口不满意,有人就搞了SLF4J。因为对Log4j的性能不满意,有人就搞了Logback。

    我们先来看看SLF4J对Commons Logging的接口有何改进。在Commons Logging中,我们要打印日志,有时候得这么写:

    int score = 99;
    p.setScore(score);
    log.info("Set score " + score + " for Person " + p.getName() + " ok.");
    

    拼字符串是一个非常麻烦的事情,所以SLF4J的日志接口改进成这样了:

    int score = 99;
    p.setScore(score);
    logger.info("Set score {} for Person {} ok.", score, p.getName());
    

    我们靠猜也能猜出来,SLF4J的日志接口传入的是一个带占位符的字符串,用后面的变量自动替换占位符,所以看起来更加自然。

    如何使用SLF4J?它的接口实际上和Commons Logging几乎一模一样:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    class Main {
        final Logger logger = LoggerFactory.getLogger(getClass());
    }
    

    对比一下Commons Logging和SLF4J的接口:

    Commons LoggingSLF4J
    org.apache.commons.logging.Log org.slf4j.Logger
    org.apache.commons.logging.LogFactory org.slf4j.LoggerFactory

    不同之处就是Log变成了Logger,LogFactory变成了LoggerFactory。

    使用SLF4J和Logback和前面讲到的使用Commons Logging加Log4j是类似的,先分别下载SLF4JLogback,然后把以下jar包放到classpath下:

    • slf4j-api-1.7.x.jar
    • logback-classic-1.2.x.jar
    • logback-core-1.2.x.jar

    然后使用SLF4J的Logger和LoggerFactory即可。和Log4j类似,我们仍然需要一个Logback的配置文件,把logback.xml放到classpath下,配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    
    	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    		<encoder>
    			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    		</encoder>
    	</appender>
    
    	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<encoder>
    			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    			<charset>utf-8</charset>
    		</encoder>
    		<file>log/output.log</file>
    		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    			<fileNamePattern>log/output.log.%i</fileNamePattern>
    		</rollingPolicy>
    		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    			<MaxFileSize>1MB</MaxFileSize>
    		</triggeringPolicy>
    	</appender>
    
    	<root level="INFO">
    		<appender-ref ref="CONSOLE" />
    		<appender-ref ref="FILE" />
    	</root>
    </configuration>
    

    运行即可获得类似如下的输出:

    13:15:25.328 [main] INFO  com.itranswarp.learnjava.Main - Start process...
    

    从目前的趋势来看,越来越多的开源项目从Commons Logging加Log4j转向了SLF4J加Logback。

    练习

    根据配置文件,观察Logback写入的日志文件。

    下载练习:slf4j+logback (推荐使用IDE练习插件快速下载)

    小结

    SLF4J和Logback可以取代Commons Logging和Log4j;

    始终使用SLF4J的接口写入日志,使用Logback只需要配置,不需要修改代码。

  • 相关阅读:
    Java8系列之重新认识HashMap(转)
    kafka 消费者和生产者测试类
    zookeeper配置
    JNLP应用程序无法打开的解决办法
    Functional Programming 资料收集
    Python的问题解决: IOError: [Errno 32] Broken pipe
    python的subprocess的简单使用和注意事项
    Python tricks(7) -- new-style class的__slots__属性
    Python tricks(6) -- python代码执行的效率
    Python tricks(5) -- string和integer的comparison操作
  • 原文地址:https://www.cnblogs.com/shsxt/p/12173331.html
Copyright © 2011-2022 走看看