NCNC - No cross,no crown!

WTGGT,TTGG-When the going gets tough,the tough get going!

张忠良ID:sunjavaduke
[修改头像]
85400次访问,排名895好友0人,关注者2
I am better than I was everyday!
sunjavaduke的文章
原创 5 篇
翻译 27 篇
转载 1 篇
评论 0 篇
sunjavaduke的公告
Contact me
最近评论
文章分类
收藏
    相册
    Favorite
    ASF
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 Unknown Source in Log4j

    新一篇: Apache Commons Configuration Part1

     
    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
     
    这样log4jerror级别以及以上的级别的日志记录到system日志中,而将debug等调试的信息记录到trace日志中,当然,error级别的日志同样记录到trace日志中,要想分文件记录不同的日志可以使用xml的配置文件,添加Level的过滤器。这里不作详细介绍。
     
    这样将程序打包成JavaApplication1.jarNetBeans工具本身即可进行打包,打包之前先进行工程的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所导致的。网络原文如下(摘自SunSDN论坛):
    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
     
    有一些开发人员可能是自己书写的antbuild文件,而没有将javac taskdebug属性设置为trueon这样的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!......
     
    是不是类名和行号都打印出来了!
     
    Tipdebug=on生成的类文件要比debug=off生成的类文件大一些。
     

    发表于 @ 2008年03月27日 00:08:00|评论(loading...)|编辑

    旧一篇: Load Property From XML

    评论:没有评论。

    Csdn Blog version 3.1a
    Copyright © sunjavaduke