Log4j日志记录机制中的Unknown Source问题解析
(本文将不对log4j的语法及使用情况作说明,详细内容参考apache官方网站的logging项目)
在使用log4j的系统中,使用ant将程序打包之后,运行过程中记录的日志中代码行数(Line Number)并没有打印出来,而是显示Unknown Source消息,具体过程如下:
在NetBeans中建立工程NBLog4jTest工程,结构如下:
ProjectName
src
log4j.properties
Main.java
lib
log4j-1.2.13.jar
JDK 1.5(default)
默认类文件内容如下:
/*
* Main.java
*
* Created on 27 September 2007, 21:19
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package javaapplication1;
import org.apache.log4j.Logger;
/**
*
* @author Administrator
*/
public class Main {
private static final Logger logger=Logger.getLogger(Main.class);
/** Creates a new instance of Main */
public Main() {
if(logger.isDebugEnabled()){
logger.debug("in Constructor of Main");
}
}
public void print(String message){
if(logger.isDebugEnabled()){
logger.debug("in print method of Main");
logger.debug("printing:"+message+"......");
}
System.out.println(message);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Main main=new Main();
main.print("HelloWorld!");
}
}
其中将log4j-1.2.13.jar文件放在src目录内,并将其添加到classpath中。
log4j.properties文件内容如下:
# Sample ResourceBundle properties file
log4j.rootLogger=DEBUG,system,trace
#set the system logging is ON or OFF
log4j.appender.system.Threshold=ERROR
log4j.appender.system=org.apache.log4j.DailyRollingFileAppender
log4j.appender.system.File=c:/system.log
log4j.appender.system.DatePattern='.'yyyy-MM-dd
log4j.appender.system.layout=org.apache.log4j.PatternLayout
log4j.appender.system.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS},%p,%m%n
#set the trace logging is ON or OFF
log4j.appender.trace.Threshold=ON
log4j.appender.trace=org.apache.log4j.DailyRollingFileAppender
log4j.appender.trace.File=c:/trace.log
log4j.appender.trace.DatePattern='.'yyyy-MM-dd
log4j.appender.trace.layout=org.apache.log4j.PatternLayout
log4j.appender.trace.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS},%F:%L,%m%n
这样log4j将error级别以及以上的级别的日志记录到system日志中,而将debug等调试的信息记录到trace日志中,当然,error级别的日志同样记录到trace日志中,要想分文件记录不同的日志可以使用xml的配置文件,添加Level的过滤器。这里不作详细介绍。
这样将程序打包成JavaApplication1.jar,NetBeans工具本身即可进行打包,打包之前先进行工程的clean(通过右键项目,clean project完成),将NBLog4jTest\JavaApplication1\nbproject\private\private.properties文件的以下属性修改:
javac.debug=false(默认的值是true),然后构建工程(通过右键项目,build project完成)。
将打包完成的jar文件拷贝到系统磁盘根目录下(可以不拷贝,只是在根目录下不需要在命令行提示符中敲太多的cd dir)。
执行java –jar JavaApplication1.jar
C:\JavaApplication1>java -jar JavaApplication1.jar
HelloWorld!
C:\JavaApplication1>
查看C:\trace.log文件,内容如下:
2007-09-27 21:47:23,218,?:?,in Constructor of Main
2007-09-27 21:47:23,250,?:?,in print method of Main
2007-09-27 21:47:23,250,?:?,printing:HelloWorld!......
也就是类文件及行数没有找到。在打印异常信息时会显示堆栈信息中的行数为(Unknown Source):
2006-06-19 17:40:11,640 [http8080-Processor25] ERROR mx.org.ifai.persona.proxy.BusinessProxy - updateTransmisionVigencia: Exception!!
java.lang.NullPointerException
at mx.org.ifai.persona.helper.transmisiones.HelperTransmision.sendEmailToDestinatario(Unknown Source)
at mx.org.ifai.persona.proxy.BusinessProxy.updateTransmisionVigencia(Unknown Source)
at mx.org.ifai.persona.action.transmisiones.DispatchTransmisionMgr.terminarPorSistema(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
通过笔者在网上查了一下,可能是因为在类编译的时候没有将debug设置为true所导致的。网络原文如下(摘自Sun的SDN论坛):
This seems to be related to how you compile your classes. In the javac task of my ant script for example, I must specify debug="true" if I want Tomcat to show line numbers in a stack trace:
<javac srcdir="${src.home}"
destdir="${build.home}/WEB-INF/classes"
source="1.4"
target="1.4"
debug="true"
deprecation="false"
optimize="true"
excludes="test/**">
<classpath refid="compile.classpath"/>
</javac>
网络中的另一回答:
Zoe, luckily this should be fairly easy to fix. It looks like you are using Ant to build/package your project. You want to double check and make sure your <javac> task is setting the debug property to on AND including the 3 debuglevel arguments to provide full debugging information in your generated classes, so you don't get any of that 'unknown source' stuff going on.
将NBLog4jTest\JavaApplication1\nbproject\private\private.properties中的属性修改如下:
javac.debug=true
有一些开发人员可能是自己书写的ant的build文件,而没有将javac task的debug属性设置为true、on这样的positive值,导致了Unknow Source问题。
修改之后再按照之前的步骤执行程序,trace日志中日志如下:
2007-09-27 22:09:33,375,Main.java:21,in Constructor of Main
2007-09-27 22:09:33,421,Main.java:27,in print method of Main
2007-09-27 22:09:33,421,Main.java:28,printing:HelloWorld!......
是不是类名和行号都打印出来了!
Tip:debug=on生成的类文件要比debug=off生成的类文件大一些。
发表于 @ 2008年03月27日 00:08:00|评论(loading...)|编辑