`
zhouchaofei2010
  • 浏览: 1102947 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SLF4J, Apache Common-Logging, Log4J和Logback

 
阅读更多

【转】Java日志框架:SLF4J, Apache Common-Logging, Log4J和Logback

Log4jApache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。 LOGBack
Logback是由log4j创始人设计的又一个开源日记组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。 Log4J vs. LOGBack
LOGBack作为一个通用可靠、快速灵活的日志框架,将作为Log4j的替代和SLF4J组成新的日志系统的完整实现。LOGBack声称具有极佳的性能,“ 某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。 LogBack创建记录器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。


另外,LOGBack的所有文档是全面免费提供的,不象Log4J那样只提供部分免费文档而需要用户去购买付费文档。


SLF4J
简单日记门面(Facade)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。 Apache Common-Logging 目前广泛使用的Java日志门面库。通过动态查找的机制,在程序运行时自动找出真正使用的日志库。但由于它使用了ClassLoader寻找和载入底层的日志库, 导致了象OSGI这样的框架无法正常工作,由于其不同的插件使用自己的ClassLoader。 OSGI的这种机制保证了插件互相独立,然而确使Apache Common-Logging无法工作。
SLF4J vs. Apache Common-Logging
SLF4J库类似于Apache Common-Logging。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合。 如此便可以在OSGI中使用了。
另外,SLF4J 支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“current user is: {}”, user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。同时,日志中的参数若超过三个,则需要将参数以数组的形式传入,如:

Object[] params = {value1, value2, value3};

logger.debug(“first value: {}, second value: {} and third value: {}.”, params);


现在,Hibernate、Jetty、Spring-OSGi、Wicket和MINA等项目都已经迁移到了SLF4J,由此可见SLF4J的影响力不可忽视。

 


使用CommonLog接口而实际由SLF4J和Log4j实现的过程

1、项目中照常使用
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
编写日志。

2、仍然在src下使用log4j.properties文件进行配置。

3、使用的所有jar文件:
    1)log4j-1.2.15.jar 这是log4j的库。 SLF4J并不改变这个底层实现库。
2)slf4j-api-1.5.2.jar 这是SLF4J库。
3)slf4j-log4j12-1.5.2.jar 这包含Log4j的适配器和静态绑定log4j底层实现。
    4)jcl-over-slf4j-1.5.2.jar 这提供了Commons-Logging接口,以及使用common-loggin的接口,底层还是由SLF4J来决定哪种实现机制 。

这里,我们需要使用Log4j的原生库,但是不需要Commons-Logging的原生库。
一切就绪,把上面这4个jar包复制到lib下,导入项目中,就可以像以往一样继续使用Apache Common-Logging编写日志了。 看一看logback.xml的配置

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <substitutionProperty name="log.base" value="../logs/hzg" />

    <jmxConfigurator />

    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">

        <layout class="ch.qos.logback.classic.PatternLayout">

            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>

        </layout>

    </appender>

    <!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份)-->

    <appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <Encoding>UTF-8</Encoding>

        <File>${log.base}.log</File>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern>

        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

            <MaxFileSize>2MB</MaxFileSize>

        </triggeringPolicy>

        <layout class="ch.qos.logback.classic.PatternLayout">

            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>

        </layout>

    </appender>

   

    <!-- 需要记录日志的包 -->

 

    <logger name="org.springframework">

 

        <level value="WARN" />

    </logger>

    <logger name="org.hibernate">

        <level value="WARN" />

    </logger>

    <logger name="org.hibernate.SQL">

        <level value="WARN" />

    </logger>

        <logger name="org.hibernate.cache">

        <level value="ERROR" />

    </logger>

    <root>

        <level value="INFO" />

        <appender-ref ref="stdout" />

        <appender-ref ref="logfile" />

    </root>

</configuration>

 

 

使用slf4j+logback的优势:

 

  • 支持按文件大小或基于时间的切分方式,可自定义命名模式
  • 支持文件打包(触发器方式)
  • 支持OSGI环境
如果在单纯的logging环境中,使用SLF4J意义不大。如果想在各种logger API中切换,SELF4J是理想选择,另外在新的项目中,使用SLF4J+Logback是比较好的日志框架选型。
分享到:
评论

相关推荐

    slf4j+logback 于log4j+commons-logging大PK

    今天我们将聚焦两个流行的日志框架——SLF4J(Simple Logging Facade for Java)和Logback,以及它们与Log4j和Commons-Logging的对比。 SLF4J是一个接口层的日志框架,它提供一个统一的API,允许用户在运行时插入...

    slf4j-jcl-1.7.7.zip

    总的来说,SLF4J和Jakson API在Java开发中是不可或缺的工具。SLF4J提供了日志抽象,使得项目可以选择最适合自己的日志实现,而Jakson API则简化了JSON数据的序列化和反序列化。在开源项目中,这两个库的结合使用可以...

    slf4j-all-log4j12-1.4.3.jar.zip CXF整合SSH你可能需要它

    1. **引入依赖**:首先,在项目的构建配置文件(如Maven的pom.xml或Gradle的build.gradle)中添加CXF、SLF4J和Log4j的相关依赖。 2. **配置Log4j**:在项目中创建log4j.properties或log4j.xml配置文件,设置日志...

    common-log

    因此,一些现代的日志框架,如SLF4J和Logback,更受推崇,它们提供了静态绑定和更高的性能。 总的来说,Apache Commons Logging是Java开发中一个重要的日志抽象层,它简化了日志框架的切换,提高了代码的可移植性。...

    logback日志记录写入kafka

    总结来说,通过结合Logback、SLF4J和Kafka,我们可以构建一个强大的日志记录和分发系统。日志会被实时地发送到Kafka队列,然后可以进一步处理,例如存储到数据库、实时分析或触发警报。同时,通过自定义解析器和过滤...

    Jakarta common logging 简介 以及和其它日志系统结合使用

    它提供了一种统一的方式来管理和记录应用程序的日志信息,允许开发者选择自己喜欢的日志实现,如Log4j、Java Util Logging (JUL) 或者 Logback等,而无需修改代码。JCL通过API抽象了各种日志框架,使得应用可以在...

    spring-cxf 日志记录配置.zip

    CXF支持多种日志实现,包括Java Util Logging、Log4j和SLF4J(Simple Logging Facade for Java)。SLF4J提供了一个接口层,允许用户在运行时插入任何日志框架,如Logback或Log4j,使得日志配置更加灵活。 1. **SLF4...

    common-log:通用日志界面

    Java社区中有许多知名的日志库,如Log4j、Logback和java.util.logging等,这些库都提供了方便的日志记录功能,但它们的API和配置方式各有差异。通用日志界面的目的就是为开发者提供一个统一的接口,简化日志处理的...

    elasticsearch-5.5客户端JAVA开发需要的57个jar包

    9. **slf4j-api**: Simple Logging Facade for Java,提供日志记录接口,可以与其他日志框架(如Logback、Log4j)集成。 10. **netty**: 用于网络I/O,Elasticsearch的网络通信层依赖于Netty。 除此之外,还有其他...

    Java常用工具类.zip

    更强大的有Log4j、SLF4J(Simple Logging Facade for Java)和Logback,它们提供了更灵活的日志配置和更丰富的日志级别控制,便于调试和监控应用。 这些工具类大大提升了Java开发的效率,使得开发者能专注于业务...

Global site tag (gtag.js) - Google Analytics