zoukankan      html  css  js  c++  java
  • commons-logging log4j slf4j 之间的关系

      最近的一个web项目中要使用到日志,但是对常用的日志记录工具(框架)着实不是很理解,在此mark一下.

    1.commons-logging.jar

      common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着log4j来使用。使用它的好处就是,代码依赖是common-logging而非log4j, 避免了和具体的日志方案直接耦合,在有必要时,可以更改日志实现的第三方库。

      使用方法:

    //在pom.xml文件中引入jar包
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    
    //java中调用
    import org.apache.commons.logging.Log;  
    import org.apache.commons.logging.LogFactory;  
      
    public class A {  
        private static Log logger = LogFactory.getLog(this.getClass());  
    }  

      commons-logging毕竟只是一个对外接口需要指定它的实现类

    #commons-logging.properties文件配置信息,引入相应的jar
     
    # org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
    # Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
     
    #利用log4j为输出介质
    org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
     
    #JDK5 Logger
    #org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger

      同时需要配置log4j.properties文件,将其放在/src目录下面.

      笔者证实,在将commons-logging和log4j搭配使用的时候,无需在web.xml文件中配置<context-param>来加载.同时也无需配置commons-logging.properties 

     1         <!-- log -->
     2         <dependency>
     3             <groupId>commons-logging</groupId>
     4             <artifactId>commons-logging</artifactId>
     5             <version>1.2</version>
     6         </dependency>
     7         <dependency>
     8             <groupId>org.apache.logging.log4j</groupId>
     9             <artifactId>log4j-core</artifactId>
    10             <version>2.5</version>
    11         </dependency>

      

      

    2.Log4j

      Apache的一个开放源代码项目,可以看做是commons-logging的一个实现.通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。

      比较详细log4j.properties配置文件http://jiangzhengjun.iteye.com/blog/526364

      下载完整配置文件:http://pan.baidu.com/s/1qXHOULY 

    3.slf4j

      slf4j全称为Simple Logging Facade for JAVA,java简单日志门面。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。

      

      所以在使用slf4j的时候需要引入上述的包.

            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.5</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.12</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.12</version>
            </dependency>

      添加日志监听.Log4jConfigListener必须要在Spring的Listener之前。

    <!-- 设置由Sprng载入的Log4j配置文件位置 -->
    <context-param> 
        <param-name>log4jConfigLocation</param-name> 
        <param-value>WEB-INF/classes/log4j.properties</param-value> 
    </context-param> 
      <!-- Spring刷新Log4j配置文件变动的间隔,单位为毫秒 -->
    <context-param> 
        <param-name>log4jRefreshInterval</param-name> 
        <param-value>10000</param-value> 
    </context-param> 
    
        <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        </listener>
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    private static Logger logger = LoggerFactory.getLogger(EmployeeController.class);

    4.slf4j 与 common-logging 比较

      common-logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库。由于它使用了ClassLoader寻找和载入底层的日志库, 导致了象OSGI这样的框架无法正常工作,因为OSGI的不同的插件使用自己的ClassLoader。 OSGI的这种机制保证了插件互相独立,然而却使Apache Common-Logging无法工作。

      slf4j在编译时静态绑定真正的Log库,因此可以再OSGI中使用。另外,SLF4J 支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“current user is: {}”, user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。
      

    参考:http://zachary-guo.iteye.com/blog/361177

      http://blog.csdn.net/woshixuye/article/details/20858239

  • 相关阅读:
    Meten Special Activities II
    Meten Special Activities II
    Meten Special Activities II
    Meten Special Activities II
    Meten Special Activities
    Meten Special Activities
    Meten Special Activities
    Meten Special Activities
    Meten Special Activities
    冒泡排序和选择排序
  • 原文地址:https://www.cnblogs.com/plxx/p/5407662.html
Copyright © 2011-2022 走看看