SLF4J:替代Jakarta Common-Logging的日志前端接口库

Posted by dohkoos on October 5th, 2008 (524 views)

JCL(Jakarta Common-Logging)是广泛使用的Java前端接口(Facade)库。在我们开发过程中可能使用各种log,每个Log有不同的风格、布局,使用JCL可以灵活的切换底层的日志实现。JCL通过动态查找机制,在程序运行时自动找出真正使用的日志库,然后使用ClassLoader载入被使用的日志库。尽管这可以很好的工作,但它的类加载解决方案有着自身的缺点。例如,如果你的应用处于严格的类加载环境中(像OSGI),这可能会引起一些问题(在OSGI中,不同的插件使用自己的ClassLoader,一个线程的ClassLoader在执行不同的插件时,其执行能力是不同的。OSGI的这种机制保证了插件互相独立,然而确使JCL无法工作)。另外,JCL的类加载解决方案还有着糟糕的历史,更多信息可以阅读Commons Logging may be harmful to your health

SLF4J(Simple Logging Facade for Java)就是解决这些问题的新的前端接口库。SLF4J类似于JCL。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包集合。

另:SLF4J的作者就是Log4j的作者,他正在开发logback来代替Log4j,logback有更高的性能。

Related Posts

Servlet.init()中初始化Log4j后不能输出log的问题

Posted by dohkoos on March 13th, 2005 (497 views)

<!-- web.xml -->
<web-app>
    <servlet>
        <servlet-name>Startup</servlet-name>
        <servlet-class>com.tinysoft.uucard.Bootstrap</servlet-class>
        <init-param>
            <param-name>log4jConfig</param-name>
            <param-value>/WEB-INF/log4j.properties</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
</web-app>

# log4j.properties
log4j.rootLogger=ALL, Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%t] %37c %3x - %m%n

// Bootstrap.java
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Bootstrap extends HttpServlet {
    private Logger logger = Logger.getLogger(Bootstrap.class);

    public void init() throws ServletException {
        super.init();

        ServletConfig config = getServletConfig();
        ServletContext sc = getServletContext();

        String log4jConfig = config.getInitParameter("log4jConfig");
        System.out.println(log4jConfig);

        if (log4jConfig == null) {
            BasicConfigurator.configure();
        } else {
            PropertyConfigurator.configure(sc.getRealPath(log4jConfig));
        }

        logger.info("========= WebApp Starting =========");
    }

    public void destroy() {
    }
}

程序运行没有问题,可就是不能在Console上输出log,而且out.println()也不输出,不过在把Logger logger注释掉后out.println()就可以输出了。查看TOMCAT_HOME/logs 中的日志文件,发现有如下异常:
----- Root Cause -----
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
  at com.tinysoft.pulse.Bootstrap.<init>(Bootstrap.java:15)

找不到Logger类?是不是WEB-INF/lib目录下没有log4j.jar呢?转到WEB-INF/lib目录,果然没有发现log4j.jar文件。把log4j.jar拷到lib目录下再试一下......真的OK了。

Related Posts

People who read this, also read...