Geogrewu 2012-08-28
日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;
也可以控制每一条日志的输出格式;
定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改程序代码。
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core, logback-classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j。
Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。
Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。在作者的观点,这是简单重要的原因选择logback而不是
Logback-classic非常自然实现了SLF4j
Logback-classic实现了 SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了SLF4J, 所 以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的
官方网站有两百多页的文档。
日志门面:为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
下图为SLF4J调用底层Logging的一个整体说明:
目前广泛使用的Java日志门面库。通过动态查找的机制,在程序运行时自动找出真正使用的日志库。是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。
SLF4J库类似于ApacheCommon-Logging。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合。
Common-Logging通过动态查找的机制,使用ClassLoader寻找和载入底层的日志库。
另外,SLF4J 支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“currentuser is: {}”, user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。同时,日志中的参数若超过三个,则需要将参数以数组的形式传入,如:
Object[] params = {value1, value2, value3}; logger.debug(“first value: {}, second value: {} and third value: {}.”, params);
1) log4j-1.2.15.jar 这是log4j的库。 SLF4J并不改变这个底层实现库。
2) slf4j-api-1.5.2.jar 这是SLF4J库。
3) logback-classic-0.9.29.jar,logback-core-0.9.29.jar 这是logback的库。
这是应用最广泛的日志方案,大部分开源软件都采用了这种方式。使用此方案只需引入commons-logging和log4j两个jar包,并提供log4j.xml或log4j.properties配置文件即可。代码如下:
1) private static final Log log = LogFactory.getLog(LogTest.class); //推荐使用这种方式 2)private static final Logger log = Logger.getLogger(LogTest. class); // 使用这种方式其实只需要引入log4j包即可
此方案性能高,使用灵活方便,可使用默认配置文件,也可以通过加载指定的配置文件。使用此方案需要引入slf4j, logback-core和logback-classic三个jar包,提供logback.xml。代码如下:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(LogTest. class);
l 支持按文件大小或基于时间的切分方式,可自定义命名
l 文件打包(触发器方式)
l 支持OSGI环境
如果在单纯的logging环境中,使用SLF4J意义不大。如果想在各种logger API中切换,SELF4J是理想选择,另外在新的项目中,使用SLF4J+Logback是比较好的日志框架选型。