commons logging与log4j配置与使用简介

    当我们编写代码库时,记录日志时非常重要的事情。然而日志功能的实现有很多种,一种特定的日志实现不可能适用于所有的代码库。
    commons logging是一个轻量级的桥,使用它去适配不同的日志实现。使用commons-logging api的代码库,可以在运行时采用任何一种日志实现。commons-logging目前支持很多流行的日志实现,并且为其他日志实现编写适配器也是一件十分简单的任务。
    应用同样可以选择使用commons-logging。虽然在应用项目中日志实现的独立性没有代码库项目重要,但使用commons-logging可使应用项目随时更换一种不同的日志实现,而不用重新编译。
    请注意commons logging不会在运行时尝试初始化或销毁特定日志实现的实例,这是应用本身的责任。然而很多流行的日志实现都会进行自动初始化,因此应用应该能够避免包含去使用一种日志实现自身的代码。(注:保证通过commons-logging可以随时更换日志实现。)
    上面是apache commons logging的介绍,本人进行了拙劣的翻译。总的讲就一句话,commons logging是java日志兼容器(bridge or adapter)。commons logging兼容的主流日志功能组件有log4j(apache项目)、jdk日志包(java.util.logging)和logkit(同为apache项目,目前可能已经没新产品用了)。下文会详细介绍log4j、jdk日志与commons logging的实际配合使用。
    log4j与commons logging的组合比较常见 ,下面介绍一下这种最流行的组合:
    首先在commons-logging的配置文件
#-------------------------commons-logging.properties------------------------------
# Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
#利用log4j为输出介质
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
#JDK5 Logger配置很复杂
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
#自带的简单日志,比较简陋不建议使用
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
对于log4j的配置可以选择log4j.properties和log4j.xml两种,同样在classpath路径下添加
log4j.rootLogger = debug , stdout , fileout
#$1 为日志级别,一般为[debug,info,warn,error,fatal]
#输出日志类型
log4j.appender.stdout = org.apache.log4j.ConsoleAppender 
#org.apache.log4j.ConsoleAppender           -> 在控制台中输出
#org.apache.log4j.FileAppender              -> 在文件中输出
#org.apache.log4j.DailyRollingFileAppender  -> 输出到文件每日输出一个文件
#org.apache.log4j.RollingFileAppender       -> 每个文件作为一个日志池,输出满了就新建一个文件
#org.apache.log4j.WriterAppender            -> 输出为一个流(没有理解)
log4j.appender.stdout.Target = System.out 
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 
#org.apache.log4j.PatternLayout 按定义模式输出
#org.apache.log4j.HTMLLayout    按HTML格式输出
#org.apache.log4j.SimpleLayout  按默认的简单布局输出
log4j.appender.stdout.layout.ConversionPattern =[%p]\t%d\t[%t]\t%c{3}\t(%F\:%L)\t-%m%n 
# %p 日志级别
# %d date信息,支持自定义,例如{yyyy:MM:dd-HH:mm:SS} 
# %t 线程名
# %c 输出类的全名,{3}代表从底层向上输出三层
# %m 代码产生的日志
# %n 换行符
# %L 日志发生未知,如在第xx行出错等等
# %F 产生日志的文件,如xx.java
#输出INFO级别以上的日志
log4j.appender.stdout.Threshold = INFO

log4j.appender.fileout = org.apache.log4j.FileAppender
log4j.appender.fileout.File=E:/learning.log
log4j.appender.fileout.layout = org.apache.log4j.PatternLayout
log4j.appender.fileout.layout.ConversionPattern =[%p]\t%d\t[%t]\t%c{3}\t(%F\:%L)\t-%m%n
log4j.appender.fileout.Threshold=INF
------------------------------------------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="fileout" class="org.apache.log4j.FileAppender">
		<param name="File" value="E:/learning.log" />
		<param name="Threshold" value="DEBUG"/>
		<param name="BufferSize" value="1024"/><!-- 缓冲输出IO日志 缓冲区大小 -->
		<param name="BufferedIO" value="true"/><!-- 缓冲输出IO日志 是否进行IO缓冲 -->
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%p]\t%d\t[%t]\t%c{3}\t(%F\:%L)\t-%m%n"></param>
		</layout>
	</appender>
	
	<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<param name="Threshold" value="DEBUG"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="[%p]\t%d\t[%t]\t%c{3}\t(%F\:%L)\t-%m%n"></param>
		</layout>
	</appender>
	<root>
		<level value="debug"></level>
		<appender-ref ref="fileout" /> 
        <appender-ref ref="stdout" />		
	</root>
</log4j:configuration>
    需要说明一点,xml配置优先级高于properties的配置,因此在路径下两个问价都的情况,会优先读取xml的形式。测试代码如下:
package com.iceliu.commons.logging;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class JdkLog {
	private Log log=LogFactory.getLog(this.getClass());
	
	public void test(){
		log.debug("debug test");
		log.error("error test");
	}
	
	public static void main(String[] args){
		(new JdkLog()).test();
	}
}
    这里已对log4j和commons-logging的基础用法进行了介绍,以后有机会,一起探讨其内部机制与源码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值