<一>.介绍
log4J将日志分为5个级别,从低到高分别是DEBUG,INFO,WARN,ERROR,FATAL,相应地log4J为记录这5个级别提供了5个方法,它们分别是:
public void debug(Object obj)
public void info(Object obj)
public void warn(Object obj)
public void error(Object obj)
public void fatal(Object obj)
同时每个方法还对应一个带Throwable入参的重载函数,用于将异常一并记录到日志中:
public void debug(Object obj,Throwable ex)
public void info(Object obj,Throwable ex)
public void warn(Object obj,Throwable ex)
public void error(Object obj,Throwable ex)
public void fatal(Object obj,Throwable ex)
<二>一般原则:
1、 在程序开始运行应该以INFO记录程序开始运行的消息。
2、 在程序初始化过程中,如果影响程序主体正常运行错误出现,应该以FATAL记录出现错误的函数名、事件和错误号;如果只是一个不影响程序正常功能的模块出现错误,则应该以ERROR记录出现错误的函数名、模块名、事件和错误号。
3、 在程序初始化完成后,应该以INFO记录程序初始化完成的消息。
4、 在函数的入口,如果需要验证参数,则可以以DEBUG的形式输出参数的信息。如果重要参数不正确,则应该以ERROR输出。
5、 在调用比较成熟的API时,如果失败,则以ERROR记录,并且有错误号记下错误号。
6、 在调用没有经过严格测试的库时,即使返回成功,也要以DEBUG的形式记录下返回的结果。
7、 以捕获异常时,以ERROR记录下错误。
8、 在进行数据库操作时,以DEBUG的级别输出执行的SQL词句,对于取回的结果,最好是能打印出所有构造完成的对象的信息。
9、 在与其它程序进行通信时,以DEBUG记录下通信过程中的重要信息。
10、 对程序中的每个线程,它们的初始化完成和开始运行也要以INFO记录下来。
11、 对程序中需要检查运行性能的地方,以DEBUG记录下运行耗时。
12、 程序正常结束时,和初始化的记录方式相同,对各个模块的卸载采用和加载是一样的处理方式。当程序都卸载完成后以INFO记录程序退出的消息。
<三>写日志API的使用示例
Connection conn = null;
String sqlStr = "select * from table1 where a=’"+a+"’";
// 测试变量是否正确,在调度时查看,以后不会用
logger.debug("sqlStr字串为:"+sqlStr);
// ...
try
{
conn = DBBean.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(sqlStr);
if(rs.next())
{
logger.info("有记录");
// 查看程序运行中的信息,反映程序及配置信息的情况
}
else
{
logger.warn("因配置要求至少要有一条记录,请核对配置信息。");
// 假设配置信息要求一条配置记录,当找不到记录时应该警告,
// 以并更改配置
}
}catch(SQLException e)
{
logger.error("数据查询时发生异常",e);
// 发生了查询异常,可能是sqlStr语句的语法错误造成的
}
finally
{
try
{
if(conn != null)
{
conn.close();
conn = null;
}
}
catch(SQLException e)
{
logger.warn("数据连接无法关闭,连接将无法释放",e);
// 数据连接无法关闭将导致资源泄漏,可能是系统原因产生的
// 如果持续产生这个问题,开发人员需要查明原因,
// 否则系统将因数据连接资源无法释放而崩溃
}
}
<四>log4j怎样记录日志到项目目录而不是tomcat目录中
1:新建一个ServletContextListener的实现类Log4jConfigListener
2:Log4jConfigListener做:System.setProperty("webapp","你的webapp路径");
3:在log4j配置中:
log4j.appender.A2.File=${webapp}/log/access.log.
这样就配置了你的log路径.
=====================什么时候记录log==================================
三、Log问题
怎么记录Log,在什么地方记,记录什么信息,怎么很容易的在发布版中去掉Log。
3.1 Log的分级
在程序中Log进行分级是很重要的,通常可以分为6级:ALL<DEBUG<INFO<ERROR<FATAL<NONE,Log的级别是可以配置的,当总的Log级别是ERROR时,则级别低于ERROR的都不会输出,只有高于或等于ERROR的才被输出。在程序中,可以指定的级别只有中间的四种。
DEBUG代表这些Log是用来输出调试信息,一般是在程序中不是非常重要的地方;INFO代表一些比较重要的信息,比如程序初始化完毕;ERROR一般指程序本身引起的,可以恢复的错误;FATAL一般指程序所依赖的环境出现错误,使的程序不恢复。其中常用的是DEBUG和ERROR。
3.2 在什么地方记Log
基本原则:
l 对程序的输入输出要以DEBUG记录下来,常包括从文件、数据库、网络、用户等输入的信息,向文件、数据库、网络输出的信息。
l 对重要对象或结构体的修改,要以INFO记录修改前的信息和修改后的状态。
l 不能忽视每个调用错误。
l 记下打印信息时所在的文件名和函数名(必须能区分开重载函数),有行数最好。
一般原则:
1、 在程序开始运行应该以INFO记录程序开始运行的消息。
2、 在程序初始化过程中,如果影响程序主体正常运行错误出现,应该以FATAL记录出现错误的函数名、事件和错误号;如果只是一个不影响程序正常功能的模块出现错误,则应该以ERROR记录出现错误的函数名、模块名、事件和错误号。
3、 在程序初始化完成后,应该以INFO记录程序初始化完成的消息。
4、 在函数的入口,如果需要验证参数,则可以以DEBUG的形式输出参数的信息。如果重要参数不正确,则应该以ERROR输出。
5、 在调用比较成熟的API时,如果失败,则以ERROR记录,并且有错误号记下错误号。
6、 在调用没有经过严格测试的库时,即使返回成功,也要以DEBUG的形式记录下返回的结果。
7、 以捕获异常时,以ERROR记录下错误。
8、 在进行数据库操作时,以DEBUG的级别输出执行的SQL词句,对于取回的结果,最好是能打印出所有构造完成的对象的信息。
9、 在与其它程序进行通信时,以DEBUG记录下通信过程中的重要信息。
10、 对程序中的每个线程,它们的初始化完成和开始运行也要以INFO记录下来。
11、 对程序中需要检查运行性能的地方,以DEBUG记录下运行耗时。
12、 程序正常结束时,和初始化的记录方式相同,对各个模块的卸载采用和加载是一样的处理方式。当程序都卸载完成后以INFO记录程序退出的消息。