一个关于用LOG4J输出日志文件的内容的问题

写代码的农民 2008-08-06 08:49:07
我用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=DEBUG

log4j.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
-------------------------------------------------------
请问高手们,这个问题该如何解决?
...全文
342 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
windforcecn 2009-10-12
  • 打赏
  • 举报
回复
我来接分
CoolBoyRay 2009-10-12
  • 打赏
  • 举报
回复
自问自答,
楼主真有才!
写代码的农民 2009-10-12
  • 打赏
  • 举报
回复
自问自答:
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真狠啊!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧