大连仟亿科技
客服中心
  • 电话
  • 电话咨询:0411-39943997
  • 手机
  • 手机咨询:15840979770
    手机咨询:13889672791
网络营销 >更多
您现在的位置:仟亿科技 > 新闻中心 > 常见问题

Java Web App 选择与配置日志库

作者:billionnet 发布于:2012/9/13 17:44:29 点击量:

Java世界里,日志库就和许多其他库[1]一样,你有多个选择,多个还不错的选择,比如log4j, java.util.logging, logback, 另外还有一些统一的log api,比如slf4j, common-logging等 。 而C++感觉开源的好用的有口碑的日志库并不是那么丰富[2]。

选择

Java的日志库分为两种,一种是提供统一的api,如slf4j, common-logging;一种是提供真正的实现,如log4j, java.util.logging以及logback。前者可以自由搭配后面真正的实现库。

会出现这种情况的原因是java日志库百家争鸣,这会有这么一个问题:假设我的程序使用到两个库,第一个使用了log4j,而第二个使用了java.util.logging,两个log库同时工作,肯定不是好事:

  • 日志输出格式可能不一致,增加阅读,分析难度;
  • 加载两份同样功能的库对classpath的整洁以及内存使用会产生影响;
  • 甚至还有可能两者无法兼容,运行时出现问题。
  • 限制了我的程序对日志库的选择 - 我依赖的库已经用了A日志库了,我很好也是用A吧,虽然我很喜欢B

所以出现了提供统一api的日志库(不过这玩意多了,还是会回到原来的问题),供公用的库写日志都要这些统一的api,用户程序也是用这些统一的api,然后用户可以部署自己喜欢的实际功能日志库,提供真正写日志的功能。

我选择使用slf4j + logback的组合,虽然我写的不是一个公用库,但这种使用方式使我将来可以非常容易的替换日志库实现。

因为我的应用暂时还没有什么特殊的要求,所以选择相对来讲不是很细致,大概是:

  • 选择slf4j而不是common-logging,因为slf4j新新更酷,且解决了选择性格式化输出[3]与classloader[4]的问题。
  • 选择logback,因为log4j将被logback替代;因为logback和slf4j是同一个作者写的(即log4j的作者),相信他们会合作的很好

配置

首先是在ivy中加入对slf4j和logback的依赖:

 

 
 

 

因为logback内置了与slf4j的binder,你无需像使用log4j或者java.util.Logging时那样提供额外的binder jar包。

然后,对logback做一些配置,提供一个logback的配置文件:

 




    interviewerportal

    
        System.out
        
        
            INFO
        
        
            %d{ISO8601} [%thread] %-5level %logger{20} - %msg%n
            
        
    

    
        output/logs/interviewerportal.log
        
            output/logs/interviewerportal.%i.log
            
            1
            9
        
        
            5MB
        
        
        
            TRACE
        
        
            %d{ISO8601} [%thread] %-5level %logger{20} - %msg%n
            
        
    

    
    
        
        
    

 

这里配置了两个输出:一个标准输出,一个文件输出,标准输出只显示INFO及以上级别的log;而文件输出显示所有级别的log。对于文件输出,同时还定义了文件替换策略:当当前日志文件大于某个数值时,开始写到一个新的日志文件中去。

把这个文件放到classpath的根目录下, 见(https://github.com/lzprgmr/interviewerportal/blob/master/interviewerportal/src/logback.xml),logback在启动时会自动读取该文件并应用配置。

使用非常简单:

 

package interviewerportal.domain;

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

public class SLF4JTest {
    private static final Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
    
    public static void main(String[] args) {
        
        logger.error("Hello, error");
        logger.warn("Hello, warn");
        logger.info("Hello, info");
        logger.debug("Hello, debug");
        logger.trace("Hello, trace");
        
        logger.info("{} + {}", 1, 2);
        
    }
}

 


[1] 比如web MVC框架有Stuts, Spring MVC, JSF(JavaServer Faces, J2EE提供), 详细见此; 前端显示的有freemarker, jsp(jstl)等;web server有tomcat, jetty等;application server有GlassFish, JBoss, WebSphere, WebLogic, TomEE等,详细见此

[2] C++的日志库其实也不少,有google的glog, apache的log4cxx(log4j的兄弟版本), pantheios, 以及boost.log(该库已经被接受进入boost, 但目前还未包含进boost的发布中,可能会在2012年末?)

[3] slf4j支持一种高效的格式化输出字符串:loger.info("{} + {}", 1, 2)。如果当前的log level没有被打开,则该条信息不会被log,而且该字符串格式化也不会执行,从而提高了效率;而以前,为了避免此种情况,你往往需要写出丑陋的if:if(logger.isInfoEnabled()) loger.info("{} + {}", 1, 2)

[4] common-logging是通过classloader加载真正的日志库实现的,如果代码中有多份classloader,就可能出现问题,详细见此



分享到:


评论加载中...
内容:
评论者: 验证码:
  

Copyright@ 2011-2017 版权所有:大连仟亿科技有限公司 辽ICP备11013762-1号   google网站地图   百度网站地图   网站地图

公司地址:大连市沙河口区中山路692号辰熙星海国际2215 客服电话:0411-39943997 QQ:2088827823 42286563

法律声明:未经许可,任何模仿本站模板、转载本站内容等行为者,本站保留追究其法律责任的权利! 隐私权政策声明