log4j的分层打印

在开发的过程中,我们总会想看到更多的错误,这时候log4j便产生了作用,但是有时候我们总会把日志给打印在一个文件中,那我们如何对各个不同的模块的日志进行分不同的日志文件存放呢,比如dao、service、controller、error、jsp等不同层次的日志。

1、log4j的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">


	<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.SimpleLayout" />
	</appender>
	<!-- 根,会把所有涉及到的log都打印出来
		   根logger没有默认的appender 
		   根logger默认被分配了Level.DEBUG的级别
	-->
	<root>
		<level value="INFO" />
		<appender-ref ref="ConsoleAppender" />
	</root>
	
	<!-- 
	A、
		(1)、如果类别的名称(后面加一个点)是其子类别名称的前缀,则它就是另一个类别的祖类
		(2)、如果一个类别和它的子类别之间没有其他的继承关系,我们就称之为parent与child的关系
		 例如:类别com.foo是类别com.foo.Bar的parent。
	B、
		 根(root) 类别位于logger继承结构的最上层。它有两种例外:
		(1) 它一直存在
		(2) 它不能根据名称而获得。
		调用类的静态方法Logger.getRootLogger可以得到它
	C、
		如果一个Logger没有被分配一个级别,那么它将从一个被分配了级别的最接近它的ancestor哪里继承。
		正规的说:级别的继承:对于一个给定的Logger C,它的继承的级别等于从C开始上溯到的第一个拥有非空级别的Logger的级别。
	D、
		对于一个给定的logger,它每个生效的日志请求都被转发到logger所有的appender上和该logger的父辈logger的appender上。
		换句话说,appende自动从它的父辈获得继承。举例来说,如果一个根logger拥有一个console appender,
		那么所有生效的日志请求至少会被输出到console上。
		如果一个名为C的logger有一个file类型的appender,那么它就会对它自己以及所有它的子logger生效。
	E、
		我们也可以通过设置appender的additivity flag为false,来重载appender的默认行为,以便继承的属性不在生效。
	F、
		Log4j的子logger只连接到已经存在的它们的父代。特别的是,名为com.foo.bar的logger是直接连接到根logger,
		而不是围绕着没用的com或com.foo logger。这显著的提高了程序性能并且减少的内存占用。
	G、
		避免参数构建的花费应如下,
		if(logger.isDebugEnabled() {
			logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
		}
		如果logger的debug被关闭这将不会招致参数构建的花费。另一方面,如果logger是debug的话,它将产生两次判断 logger是否能用的花费。
		一次是在debugenabled,一次是debug。这是无关紧要的,因为判断日志是否可用只占日志实际花费时间的约1%。
	H、  如果是DailyRollingFileAppender的话,不会立刻生成error.log.2014.02.23.log,而是先生成error.log,然后等到这天的
	   23:59分,把当天的日志写到error.log.2014.02.23.log的文件中去
	         如果DailyRollingFileAppender的append=true的话,即使当天没有日志,也会生成error.log.2014.02.23.log文件,否则不会生成
	 -->
	<!-- dao层的日志 -->
	<appender name="dao" class="org.apache.log4j.FileAppender">
		<param name="File" value="${webapp.root}/logs/dao.log" />
		<param name="Append" value="true" />
		<!-- 
		Log4j提供的layout有以下几种:
		org.apache.log4j.HTMLLayout(以HTML表格形式布局),
		org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
		org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
		org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
		
		%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
		%r 输出自应用启动到输出该log信息耗费的毫秒数
		%c 输出所属的类目,通常就是所在类的全名
		%t 输出产生该日志事件的线程名
		%n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
		%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
		%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
		 -->
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%t] %p - %m%n" />
		</layout>
	</appender>
	<!-- 以com.hj.dao包开头的所涉及到的类进行log -->
	<logger name="com.hj.dao" additivity="true">
		<level value="INFO" />
		<appender-ref ref="dao" />
	</logger>
	
	<!-- service层的日志 -->
	<appender name="service" class="org.apache.log4j.FileAppender">
		<param name="File" value="${webapp.root}/logs/service.log" />
		<param name="MaxFileSize" value="5MB" />
		<param name="MaxBackupIndex" value="20" />
		<param name="Encoding" value="utf-8"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />
		</layout>
	</appender>
	<!-- 以com.hj.service包开头的所涉及到的类进行log -->
	<logger name="com.hj.service" additivity="true">
		<level value="INFO" />
		<appender-ref ref="service" />
	</logger>
	
	<!-- controller层的日志 -->
	<appender name="controller" class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="${webapp.root}/logs/controller.log" />
		<param name="MaxFileSize" value="5MB" />
		<param name="MaxBackupIndex" value="20" />
		<param name="Encoding" value="utf-8"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />
		</layout>
	</appender>
	<!-- 以com.hj.controller包开头的所涉及到的类进行log -->
	<!-- 输出源的可添加性(Appender Additivity):一个名为C的logger的日志定义的输出将延续到它自身以及它的ancestor logger的appenders
		 Loggers的附加标记(additivity flag)默认为true。 -->
	<logger name="com.hj.controller" additivity="true">
		<level value="INFO" />
		<appender-ref ref="controller" />
	</logger>
	
	<!-- 异常捕获的日志 -->
	<appender name="error" class="org.apache.log4j.RollingFileAppender">
		<param name="File" value="${webapp.root}/logs/error.log" />
		<param name="MaxFileSize" value="5MB" />
		<param name="MaxBackupIndex" value="20" />
		<param name="Encoding" value="utf-8"/>
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d [%-5p][%t] %c{1} %m %n" />
		</layout>
	</appender>
	<!-- 对com.hj.exception.ErrorHandler类进行log -->
	<logger name="com.hj.exception.ErrorHandler" additivity="true">
		<level value="ERROR" />
		<appender-ref ref="error" />
	</logger>
</log4j:configuration>

2、dao层

@Repository
public class UserDao {
	
	private Logger logger = Logger.getLogger(this.getClass());
	
	public void show(){
		logger.info("this is DAO add");
	}
	
	public void exception(){
		String str = null;
		try{
			str.charAt(2);
		}catch(Exception e){
			logger.error("DAO空指针异常", e);
		}
	}

	public void throwsExcep() throws Exception{
		String str = null;
		logger.info("dao测试异常");
		str.charAt(2);
	}
}

3、service层

@Service
public class UserService {
	
	private Logger logger = Logger.getLogger(this.getClass());
	
	@Resource
	private UserDao userDao;
	
	public void show(){
		logger.info("ths is Service add");
		userDao.show();
	}
	
	public void exception(){
		String str = null;
		try{
			str.charAt(2);
		}catch(Exception e){
			logger.error("Service空指针异常", e);
		}
		userDao.exception();
	}
	
	public void throwsExcep() throws Exception{
		logger.info("service测试异常");
		userDao.throwsExcep();
	}
}

4、controller层

@Controller
public class UserController {
	
	private Logger logger = Logger.getLogger(this.getClass());
	
	@Resource
	private UserService userService;
	
	@RequestMapping(value = "/show")
	public String show(){
		logger.info("this is Controller add");
		userService.show();
		return "index";
	}
	
	@RequestMapping(value = "/exception")
	public String exception(){
		String str = null;
		try{
			str.charAt(2);
		}catch(Exception e){
			logger.error("Controller空指针异常", e);
		}
		userService.exception();
		return "index";
	}

	@RequestMapping(value = "/throwsExcep")
	public String throwsExcep() throws Exception{
		logger.info("controller测试异常");
		userService.throwsExcep();
		return "index";
	}
}

5、异常处理中心,捕获所有controller的所有异常

@ControllerAdvice 
public class ErrorHandler {
	
	private Logger logger = Logger.getLogger(this.getClass());
	
	@ExceptionHandler(value = Exception.class)
    public @ResponseBody Object errorResponse(Exception e) {
		logger.error("异常处理中心", e);
		return e;
	}
}

6、生成的日志文件



工程下载地址:http://download.csdn.net/detail/wxwzy738/7409341


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值