关闭

commons-logging日志输出自定义异常

2182人阅读 评论(11) 收藏 举报
分类:

日志输出在任何一个项目中都是不可缺少的重要功能,它不但在项目开发阶段对于项目的调试有很大的帮助,在程序运行阶段由于忠实记录程序运行过程中的各种操作以及出现的各种错误信息,对于项目后期的运行维护也有重要作用。所以实现日志记录功能对于OA系统来讲也是一定要完成的任务。下面介绍在java项目开发中比较常用的日志记录实现方式,commons-logging实现输出日志文件。commons-log实现日志输出主要分为四个步骤,1.添加相关jar包;2.配置log4j.properties文件;3.自定义异常类;4.编写测试单元,下面让我们来分别看看这几部分是如何做的:

1.添加相关jar包。

commons-log实现输出日志文件用到的jar包主要有两个,分别是commons-logging-1.0.4.jar和log4j-1.2.11.jar。

2.配置log4j.properties文件

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=f:/oa.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout,file

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
#log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
log4j.logger.com.yang =debug


在上面的配置文件中我们看到有两种Appender分别是ConsoleAppender和FileAppender,由于日志信息支持多种输出方式,所以我们可以选择这两种方式中的任意一种,当然也可以同时选择这两种输出方式,注意在配置log4j.properties文件的时候需要注意三点:

第一是log4j.rootLogger这一项的表明日志的输出方式,如果使用控制台方式输出的话一定要添加stdout,如果使用文件输出日志信息一定要加上file,否则信息是不能输出到文件的。

第二点是配置日志输出的级别,日志信息被分为五个级别分别是DEBUG,INFO,WARN,ERROR,FATAL这五个,并且其级别依次升高。而所谓的配置日志输出级别的意思是指当日志输出级别确定以后日志只输出等于高于该级别的日志信息,比如当我们把输出日志信息的级别定位INFO的时候,由于INFO级别高于DEBUG级别,所以日志将不会输出DEBUG级别的信息,只会输出INFO,WARN,ERROR,FATAL级别的信息。

第三点配置日志输出作用的类的范围。这个配置项就是最下面那一行配置log4j.logger。这一项的具体配置会根据下面的实例(第四步)进行讲解。

3.自定义异常类。编写自己的异常类MyException.java,其代码如下:

package com.exception;

public class MyException extends Exception {

	@Override
	public String getMessage() {
		// TODO Auto-generated method stub
		return "类型转换错误";
	}
}


 

4.编写测试单元。针对第二步中的配置日志信息输出范围的介绍,在我的java项目中src目录下新建两个包com.yang(其中包含LogTest类)和com.chang(其中包含LogTest2类),这两个测试类的代码如下:

package com.yang;

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

import com.exception.MyException;

public class LogTest {

	private static void logError(String username,String password) throws Exception{
		
		if("admin".equals(username) && "admin".equals("admin")){
			
				throw new MyException();
			
		}
	}
	public static void main(String[] args){
		
		try {
			logError("admin","aa");
		} catch (Exception e) {
			Log logger = (Log)LogFactory.getLog(LogTest.class);
			
			logger.debug(e.getMessage());
		}
	}
}


 

package com.chang;

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

import com.exception.MyException;
import com.yang.LogTest;

public class LogTest2 {

	private static void logError(String username,String password) throws Exception{
		
		if("admin".equals(username) && "admin".equals("admin")){
			
				throw new MyException();
			
		}
	}
	public static void main(String[] args){
		
		try {
			logError("admin","aa");
		} catch (Exception e) {
			Log logger = (Log)LogFactory.getLog(LogTest2.class);
			
			logger.debug(e.getMessage());
		}
	}
}

仔细查看这两个类的代码我们发现只有一个地方是不一样的,在LogTest类中Log logger = (Log)LogFactory.getLog(LogTest.class)但是在LogTest2类中Log logger = (Log)LogFactory.getLog(LogTest2.class),另外不要忘了我们在log4j的配置文件中配置的日志输出范围是log4j.logger.com.yang,这样的话在执行LogTest2类的main函数时是不会输出文件的,因为LogTest2类所在的路径是com.chang并不在com.yang路径中,那么如果我们在不改动代码的情况下如何让LogTest2类也同样输出日志文件呢?其实很简单,只需要把log4j.properties文件中的最后一项log4j.logger.com.yang=debug改为log4j.logger.com=debug,其实就是扩大一下输出范围而已。这样整个日志输出功能我们就完成了。

 

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:681688次
    • 积分:7570
    • 等级:
    • 排名:第2831名
    • 原创:128篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1305条
    最新评论