在开发的过程中,我们总会想看到更多的错误,这时候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