我用log4j输出日志到日志文件:
日志处理有两个类:一个日志配置文件加载类(LoggerFactory.java),包括加载日志配置文件的方法loadLoggerConfigure()及申请日志管理器的方法protected Logger getLogger(String loggerName)。另一个为日志记录类SqlLogger.java继承自LoggerFactory.java,包括debug、info、warn、error等各种日志记录方法,具体如下:
public class LoggerFactory
{
    //一些常量定义省略
    static
    {
        loadLoggerConfigure();  //静态加载日志配置文件
    }    static protected Logger getLogger(String loggerName)
    {
        if (!isConfigLoad)
        {
            loadLoggerConfigure();  //加载日志配置文件
        }
        
        return Logger.getLogger(loggerName);
    }
    
    static protected void loadLoggerConfigure()
    {
        try 
        {
            Properties props = new Properties();
            FileInputStream istream = new FileInputStream(getLoggerCfgFile());  //将配置文件内容读取到文件输入流
            props.load(istream);
            istream.close();
            
            //设置日志文件保存的详细路径
            Enumeration  enumeration = props.propertyNames();
            while (enumeration.hasMoreElements())
            {
                key = (String) enumeration.nextElement();
                if (key.startsWith("log4j.logger."))
                {
                    .........获取配置文件中配置日志文件的key值
                    logFile = getLogFilePath(props.getProperty(key));//设置日志文件保存的路径
                    props.setProperty(key, logFile);
                }
            }
            
            PropertyConfigurator.configure(props);  //加载日志配置文件
            isConfigLoad = true;
        }
        catch (IOException e) 
        {
            ......
            isConfigLoad = false;
        }
    }
}
--------------------------------
public class SqlLogger extends LoggerFactory
{
    private static Logger logger = null;
    static 
    {
        ......判断是否需要加载日志配置文件
        if (logger == null)
        {
            logger = getLogger("SqlLogger");  //调用父类方法申请日志管理器
        }
    }
    
    public static void debug(Object message)
    {
        logger.debug(message);
    }
    
    ......
}
-----------------------------------
我在应用程序中调用SqlLogger.debug(Object message)记录日志,如在TestDBOperate.testQuery()方法中有如下语句:
    String sql = "select * from userinfo";
    ArrayList list = db.executeQuery(sql);
    SqlLogger.debug(list);  //记录日志
现在问题是,日志文件生成了,也记录了日志,内容正确,但是记录的位置不正确,日志内容如下:
[main] 2008-07-20 15:15:51,514 SysLogger INFO  - [{username=hzwei, userid=hzwei, password=hzwei}, {username=测试用户, userid=test, password=1}] (SqlLogger.java:19)也就是日志内容中最后记录的 (SqlLogger.java:19)不正确,应该记录调用SqlLogger.debug方法的位置,如TestDBOperate.java:80
-------------------------------------------------------------
日志配置文件为:
#设定logger的root level为DEBUG
log4j.rootLogger=DEBUGlog4j.logger.SysLogger=INFO,A1
log4j.logger.SqlLogger=DEBUG,A2# 配置日志记录器A2
 log4j.appender.A2=org.apache.log4j.FileAppender
 log4j.appender.A2.File=sqlLog.txt
 log4j.appender.A2.layout=org.apache.log4j.PatternLayout
 log4j.appender.A2.layout.ConversionPattern=[%t] %d{yyyy-MM-dd HH:mm:ss,SSS} %c %-5p - %m (%F:%L)%n
-------------------------------------------------------
请问高手们,这个问题该如何解决?

解决方案 »

  1.   

    自问自答:
    thisClassName = SqlLogger.class.getName();
    public static void debug(String message, Throwable throwable) 

       message = buildMessage(message, thisClassName, Thread.currentThread().getStackTrace());
       log(logger, message, throwable, INT_DEBUG);
    }---------------------
    protected static String buildMessage(Object messgae, String className, StackTraceElement[] ste)
    {
        String loc = getStackMsg(thisClassName, ste);
        if (loc != null && loc.indexOf('(') > 0) {
           loc = loc.substring(loc.indexOf('('));
        }    StringBuffer ret = new StringBuffer();
        ret.append(messgae);
        ret.append(loc);
        return ret.toString();
    }private static String getStackMsg(String className,
                StackTraceElement[] ste)
    {
        if (ste == null) return null;    boolean srcFlag = false;
        StackTraceElement s = null;
        for (int i = 0; i < ste.length; i++) {
            s = ste[i]; // 如果上一行堆栈代码是本类的堆栈,则该行代码则为源代码的最原始堆栈。
            if (srcFlag) {
        return s == null ? "" : s.toString();
    } // 定位本类的堆栈
    if (className.equals(s.getClassName())) {
    srcFlag = true;
    }
        }
        return null;
    }
    -------------------------
    自问自答没分,CSDN真狠啊!