键者天行

天行键,君子以自强不息;地势坤,君子以厚德载物!

用户操作
[即时聊天] [发私信] [加为好友]
chenshengID:chensheng913
1223624次访问,排名18好友40人,关注者112
天行键,君子以自强不息;
地势坤,君子以后德载物。
chensheng913的文章
原创 678 篇
翻译 0 篇
转载 87 篇
评论 1000 篇
chensheng913的公告
    首页         留言
本站总访问量:

当前页访问量:


与我联系:我的EMAIL
月 [下月] [上月]

天气预报

最近评论
bluehouse1985:InstallShield & InstallAnywhere 涨价前最后一次特卖!
Acresso公司主打产品installshield和installanywhere从11月1日起全面涨价!InstallShield & InstallAnywhere 涨价前最后一次特卖!仅10天!先到先得!
为庆祝最新版InstallShield 2009 &……
ellen_1397:这两天正好要用到!谢谢啦!
bluehouse1985:InstallShield 2009 升级优惠中!
为庆祝最新版InstallShield 2009上市,答谢广大新老用户的支持与厚爱,从即日起,上海世全软件(XLsoft)举办InstallShield 2009优惠活动!数量有限,售完为止!
销售热线:021-62128912/010-64616123
销售邮箱:sales@XLsoft.com.cn
flying_all:是否是一个公共变量,不仅要看是不是有static关键字,其实更应该看JVM是怎样分配空间的。如果在JVM中一个类的多个实例访问的是同一块内存,那就是公共变量了。谢谢。
flying_all:是否是一个公共变量,不仅要看是不是有static关键字,其实更应该看JVM是怎样分配空间的。如果在JVM中一个类的多个实例访问的是同一块内存,那就是公共变量了。谢谢。
文章分类
收藏
相册
搞笑娱乐
窈窕淑女
友情Blog
!Java的专栏
Baggico的专栏
feng_sundy的专栏
八进制的专栏
嘟嘟狼的专栏
潇潇的新生活
笨笨的专栏
编程夜未眠的专栏
阿赖的个性空间
韩磊的专栏
珍藏链接
《CSDN社区电子杂志-Java杂志》官方Blog
《CSDN社区电子杂志-Oracle杂志》官方Blog
侯捷专栏
执子之手,与子偕老
王森专栏
科诺专栏
蔡学镛专栏
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 利用ThreadLocal记录日志收藏

新一篇: 开发保留标准浏览器功能的AJAX应用程序 | 旧一篇: 用Oracle闪回功能恢复偶然丢失的数据

   在项目中记录日志是必须的,但是往往在记录日志的时候都是通过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() 来保存您的程序正在做什么的信息,而且,稍后如果有必要(例如发生了一个错误),您能够容易地检索与某个特定线程相关的调试信息。 与简单地把所有信息转储到一个日志文件,然后努力找出哪个日志记录来自哪个线程(还要担心线程争用日志纪录对象)相比,这种技术简便得多,也有效得多。 

发表于 @ 2006年02月09日 18:29:00|评论(loading...)|编辑

新一篇: 开发保留标准浏览器功能的AJAX应用程序 | 旧一篇: 用Oracle闪回功能恢复偶然丢失的数据

评论

#jerry 发表于2006-02-14 15:16:00  IP: 58.33.229.*
方法的创意不错,,能够解决实际问题..代码没太明白,,感觉用了复杂的方式来实现比较简单的问题.
#Ahui 发表于2006-02-14 18:49:00  IP: 202.120.214.*
如果系统正常运行了一个月,那ThreadLocal那就存放了系统运行了一个月的日志,这时ThreadLocal需要很多内存来保存这些日志,所以这个方法不是很好的
#vincent thinking 发表于2006-02-17 10:49:00  IP: 222.66.41.*
把日志写入数据库就不会存在这种问题。

log放入ThreadLocal,性能一定有问题。
#hama 发表于2006-07-19 00:05:00  IP: 221.221.145.*
楼主这就不厚道了!!!!明明是copy的,非要说成是原创!!!
http://www-128.ibm.com/developerworks/cn/java/j-threads/index3.html
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © chensheng913