【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)

Log4j

Apache的一个开放源码项目,通过使用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的影响力不可忽视。

一、SLF4J 的几种实际应用模式--之中的一个:SLF4J+Log4J

SLF4J(Simple Logging Facade for Java) 是一个通用的日志框架。不能何以谓之 Facade(门面)。所扮眼的角色相当于 Jakarta Commons Logging。

就像 JCL 须要底层的日志实现,如 Log4J、java.util.logging、Simple Logger 等来完毕详细的信息输出。其实基本总是 JCL+Log4J 那么一个绝配。SLF4J 的原旨也是能支持多种下层日志框架实现,但最好的日志实现仍然是 Log4J,所以本篇讲述 SLF4J 的第一种使用方法
SLF4J+Log4J。

须要的配置文件和组件包,以下三个 jar 文件和一个 properties 文件都是要放在项目的 ClassPath 上。

1. slf4j-api-1.7.7.jar

2. slf4j-log4j12-1.7.7.jar

3. log4j-1.2.17.jar

4. log4j.properties(也能够是 log4j.xml,本例中用 log4j.propertes)

maven:

pom.xml

<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.7</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.7</version>
		</dependency>

前两个包在 http://www.slf4j.org/download.html 处下载,后一个包在http://logging.apache.org/log4j/1.2/download.html 下载,可能包文件名称中的版本有些差,不要紧。

log4j.properties 曾经该是怎么写,如今还是怎么写,比方一个最简单的内容,仅仅向控制台输出日志信息,例如以下:

[xml] view
plain
copy

  1. log4j.rootLogger=DEBUG,console
  2. log4j.appender.console=org.apache.log4j.ConsoleAppender
  3. log4j.appender.console.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

log4j.xml文件:

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

>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
	<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p  %C(%F:%L) - %m%n" />
		</layout>
	</appender>

	<appender name="DEBUG"
		class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="/var/log/w3pc/debug.log" />
		<param name="Append" value="true" />
		<param name="MaxFileSize" value="5120KB" />
		<param name="MaxBackupIndex" value="7" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p  %C(%F:%L) - %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="DEBUG" />
			<param name="LevelMax" value="DEBUG" />
		</filter>
	</appender>

	<appender name="INFO"
		class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="/var/log/w3pc/info.log" />
		<param name="Append" value="true" />
		<param name="MaxFileSize" value="5120KB" />
		<param name="MaxBackupIndex" value="7" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p  %C(%F:%L) - %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="INFO" />
			<param name="LevelMax" value="INFO" />
		</filter>
	</appender>

	<appender name="WARN"
		class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="/var/log/w3pc/warn.log" />
		<param name="Append" value="true" />
		<param name="MaxFileSize" value="5120KB" />
		<param name="MaxBackupIndex" value="7" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p  %C(%F:%L) - %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="WARN" />
			<param name="LevelMax" value="WARN" />
		</filter>
	</appender>

	<appender name="ERROR"
		class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="/var/log/w3pc/error.log" />
		<param name="Append" value="true" />
		<param name="MaxFileSize" value="5120KB" />
		<param name="MaxBackupIndex" value="7" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p  %C(%F:%L) - %m%n" />
		</layout>
		<filter class="org.apache.log4j.varia.LevelRangeFilter">
			<param name="LevelMin" value="ERROR" />
			<param name="LevelMax" value="ERROR" />
		</filter>
	</appender>

	<root>
		<priority value="INFO" />
		<appender-ref ref="INFO"/>
		<appender-ref ref="WARN"/>
		<appender-ref ref="DEBUG"/>
		<appender-ref ref="ERROR"/>
		<appender-ref ref="STDOUT"/>
	</root>
</log4j:configuration>

二、 SLF4J 的几种实际应用模式--之中的一个:SLF4J+Logback

前面讲的 SLF4J 的使用方法之中的一个是 SLF4J+Log4J,而这里要推出的组合是 SLF4J+LogBack。不用 Log4J?难道还有比 Log4J 更好的日志实现吗?是的,答案就是LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手,你就不会认为吃惊了。

LogBack
对 Log4J 进行了增强,并投入了 SLF4J 的怀抱。它还被作者认定为 Log4J 的继任者。

为什么叫做 Logback,我就不知道了,反正不要叫做 Brokeback 即可。这里是推崇用 Logback 替代 Log4J 的十几个理由:Reasons to prefer logback over log4j。说的大至是更快。好測试。与
SLF4J 关系紧;文档丰富。能自己主动载入配置文件。多个 JVM 写一个日志文件,或其它 I/O 错误时不影响程序运行;配置文件里增加条件控制;强大的日志过滤;更强的日志切分功能;自己主动压缩、删除日志文件;异常栈中很多其它的数据信息。

Logback 分为三个模块:logback-core,logback-classic,logback-access。logback-core 是核心。logback-classic 改善了 log4j,且自身实现了 SLF4J API。所以即使用 Logback 你仍然能够使用其它的日志实现,如原始的 Log4J,java.util.logging 等;logback-access 让你方便的訪问日志信息。如通过 http 的方式。

还得提一点。Logback 能更好的放到 OSGI 环境中。好了,简单绍完了 Logback,就来看看详细怎么用它。

须要的配置文件和组件包,以下三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。

1. slf4j-api-1.5.11.jar

2. logback-core-0.9.20.jar

3. logback-classic-0.9.20.jar

4. logback.xml 或 logback-test.xml (类似于 log4j.properties/log4j.xml)

三、SLF4J如何定位到详细用哪个log

在应用中,通过LoggerFactory类的静态getLogger()获取logger。通过查看该类的代码能够看出,终于是通过StaticLoggerBinder.SINGLETON.getLoggerFactory()方法获取LoggerFactory然后,在通过该详细的LoggerFactory来获取logger的。类org.slf4j.impl.StaticLoggerBinder并不在slf4j-api-1.5.2.jar包中。细致查看每一个与详细日志系统相应的jar包,就会发现,相应的jar包都有一个org.slf4j.impl.StaticLoggerBinder的实现,不同的实现返回与该日志系统相应的LoggerFactory,因此就实现了所谓的静态绑定,达到仅仅要选取不同jar包就能简单灵活配置的目的。

时间: 2024-10-26 15:48:30

【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)的相关文章

Java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)

转自:http://blog.csdn.net/kobejayandy/article/details/17335407 如果对于commons-loging.log4j.slf4j.LogBack等都已经非常清楚了,可以忽略本文.几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对这块有更深刻理解的同学,也贡献出自己的知识和见解. 一.    概念 Commons-logging:apache最早提供的日志的门面接口.避免和具体的日志方案直接耦合.

[z]Java日志,需要知道的几件事(commons-logging,log4j,slf4j,logback)

一.    概念 Commons-logging:apache最早提供的日志的门面接口.避免和具体的日志方案直接耦合.类似于JDBC的api接口,具体的的JDBC driver实现由各数据库提供商实现.通过统一接口解耦,不过其内部也实现了一些简单日志方案. Log4j:经典的一种日志解决方案.内部把日志系统抽象封装成Logger.appender.pattern等实现.我们可以通过配置文件轻松的实现日志系统的管理和多样化配置. Slf4j: 全称为Simple Logging Facade fo

java基础知识(2)环境变量配置

java环境变量被配置 程序员在机器上做开发安装好jdk后必须要对java进行几步配置才能使用 1右键我的电脑属性->高级系统设置->环境变量 2在系统变量里新建 变量名: JAVA_HOME 变量值:JDK的安装路径 例如 C:\Program Files (x86)\Java\jdk1.6.0_43 (也就是bin文件夹的上一级,路径中不包含bin) 这句话的意思是把java路径赋值给一个变量,这个变量叫做JAVA_HOME. eclipse和tomcat就是通过JAVA_HOME找到ja

Java日志体系 —— slf4j

1.1 简介 与commons-logging相同,slf4j也是一个通用的日志接口,在程序中与其他日志框架结合使用,并对外提供服务. Simple Logging Facade for Java简称 slf4j,Java简单日志门面系统.在我们的代码中,不需要显式指定具体日志框架(例如:java.util.logging.logback.log4j),而是使用slf4j的API来记录日志便可,最终日志的格式.记录级别.输出方式等通过具体日志框架的配置来实现,因此可以在应用中灵活切换日志系统.

Java日志体系(八)最佳实践

java常用日志框架关系 Log4j 2与Log4j 1发生了很大的变化,Log4j 2不兼容Log4j 1. Logback必须配合Slf4j使用.由于Logback和Slf4j是同一个作者,其兼容性不言而喻. 比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用. 项目中选择日志框架选择 如果是在一个新的项目中建议使用Slf4j与Logback组合,这样有如下的几个优点. Slf4j实现机制决定Slf4j限制较少,使用范围更广.由于S

Java 日志框架终极教程

概述 对于现代的 Java 应用程序来说,只要被部署到真实的生产环境,其日志的重要性就是不言而喻的,很难想象没有任何日志记录功能的应用程序被运行于生产环境中.日志 API 所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息.状态信息.调试信息和执行时间信息等.在生产环境中,日志是查找问题来源的重要依据,应用程序运行时的产生的各种重要信息,都应该通过日志 API 来进行记录. 很多Java开发人员习惯于使用 System.out.println.System.err.println 以及

JAVA 日志库3

Commons Logging和SLF4J都是基于相同的设计,即从一个LogFactory中取得一个命名的Log(Logger)实例,然后使用这个Log(Logger)实例打印debug.info.warn.error等不同级别的日志.作为两个门面日志系统,Commons Logging和SLF4J本身并不实现具体的日志打印逻辑,它们只是作为一个代理系统,接收应用程序的日志打印请求,然后根据当前环境和配置,选取一个具体的日志实现系统,将真正的打印逻辑交给具体的日志实现系统,从而实现应用程序日志系

Java日志框架研究及常见配置

按照基本的定义,日志即是对程序运行过程中关键事件的记录:大体日志分为运行日志和开发日志,运行日志在业务层面记录一些关键事件,为后面的跟踪运行提供帮助,而开发日志大多数时候是调试日志,根据事件流的输出来调试程序:因为开发人员本身的关注领域,运行日志可能制作的比较少,难以达到跟踪业务流的作用,而即使是开发日志,因为开发的调试有各种技巧,即使是跟踪事件流,使用println也比日志配置简单多了,这是一个投资回报的问ti,而人经常性的是短视的,调试可能在这些人眼里根本不需要认真对待,没有前期的事件记录规

Java日志管理:log4j、Commons-logging、slf4

1.log4j 概述 log4j是Apache的一个开源项目,主要是用来做Java开发中的日志管理工作.主要是由三个重要组件构成的.可管理日志的优先级.输出目的地以及输出格式等.它的配置文件主要有XML和properties两种,当然,也可以在程序里配置,但实际开发中一般使用properties文件. log4j的组件 1.1.日志信息的优先级(Level) 有7个日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL,级别从做到有一次降低. Off:关闭所有的日志记录