利用ThreadLocal记录日志

王朝java/jsp·作者佚名  2006-02-20
窄屏简体版  字體: |||超大  

在项目中记录日志是必须的,但是往往在记录日志的时候都是通过logger.debug("...")来记录的,程序一边运行一边记录日志,尤其在多线程或者Web应用中,同一时间可能有不同的日志记录到同一个文件中去,当出现错误的时候就不能确定在那些信息是你想关心的.因此如果我们在一个程序的开始的地方开始记录日志,但是这个日志不记录到日志文件中,而是保存在一个ThreadLocal中,在出错的时候就可以将这些日志全部输出到日志文件中去,就能方便查找了.

代码如下:

import java.util.ArrayList;

import java.util.List;

public class DebugLogger {

/**

* @param args

*/

public static void main(String[] args) {

//测试使用,正式使用的时候可以在一个方法的开始new一个DebugLogger

DebugLogger logger = new DebugLogger();

//模拟需要记录的十次日志信息,一次记录到DebugLogger里面去了

for(int i = 0;i<10;i++){

//在需要记录日志的地方改为下面的代码

logger.put("Log info " + i);

}

//到了方法结束或者出现异常的时候,将刚才记录的日志取出来

String[] strings = logger.get();

//将取出来的日志一次记录到日志文件里去

for (int i = 0; i < strings.length; i++) {

System.out.println(strings[i]);

}

//请空DebugLogger里记录的日志内容

logger.clear();

{

String[] strings1 = logger.get();

for (int i = 0; i < strings1.length; i++) {

System.out.println(strings1[i]);

}

}

}

//内部静态类,继承至ThreadLocal

private static class ThreadLocalList extends ThreadLocal {

// 在调用get()方法的时候返回一个ArrayList对象

public Object initialValue() {

return new ArrayList();

}

//将保存在ThreadLocal中的List返回

public List getList() {

return (List) super.get();

}

}

private ThreadLocalList list = new ThreadLocalList();

private static String[] stringArray = new String[0];

//清空记录的日志

public void clear() {

list.getList().clear();

}

//将需要记录的日志内容保存下来

public void put(String text) {

list.getList().add(text);

}

//返回需要记录的日志

public String[] get() {

return (String[]) list.getList().toArray(stringArray);

}

}

在代码中,您可以调用 DebugLogger.put() 来保存您的程序正在做什么的信息,而且,稍后如果有必要(例如发生了一个错误),您能够容易地检索与某个特定线程相关的调试信息。 与简单地把所有信息转储到一个日志文件,然后努力找出哪个日志记录来自哪个线程(还要担心线程争用日志纪录对象)相比,这种技术简便得多,也有效得多。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航