网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.入门:Java连接各种数据库的实例.
.java实现的18位身份证格式验证算.
.选择排序算法的JAVA实现.
.JDBC解决方案.
.Wireless Messaging API(4).
.servlet与javabean实现长文本数据.
.关于 MVC 模式中的通知机制.
.代码复用的规则.
.Java库的建立方法及其实例.
.微软地图MapPoint2004编程简介(图.
.JAVA与正则表达式(2年级之1).
.Merlin的魔力:用新的正则表达式.
.jdk-1_5_0_04-nb-4_1-win简体中文.
.Sun授权ASEC-Java培训中心名录.
.Hibernate和Jive缓存策略的比较.
.Java异常处理的陋习展播.
.JAVA教师:给JAVA初学者的忠告.
.高级应用——Java动态的程序设计.
.JAVA数组和JAVA集合类的对象操作.
.Java企业应用开发实践TOP10.

利用ThreadLocal记录日志

发表日期:2008-1-5


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

上一篇:Nutch 使用之锋芒初试 人气:1077
下一篇:Checked vs UnChecked Exception ,使用场合? 人气:853
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐