在项目中记录日志是必须的,但是往往在记录日志的时候都是通过logger.debug("...")来记录的,程序一边运行一边记录日志,尤其在多线程或者Web应用中,同一时间可能有不同的日志记录到同一个文件中去,当出现错误的时候就不能确定在那些信息是你想关心的.因此如果我们在一个程序的开始的地方开始记录日志,但是这个日志不记录到日志文件中,而是保存在一个ThreadLocal中,在出错的时候就可以将这些日志全部输出到日志文件中去,就能方便查找了.
代码如下:
package com.test.test; 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() 来保存您的程序正在做什么的信息,而且,稍后如果有必要(例如发生了一个错误),您能够容易地检索与某个特定线程相关的调试信息。 与简单地把所有信息转储到一个日志文件,然后努力找出哪个日志记录来自哪个线程(还要担心线程争用日志纪录对象)相比,这种技术简便得多,也有效得多。
相关推荐
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
特别是在生产环境中,日志记录变得更加重要,因为它可以帮助开发者快速定位和解决问题。 使用 ModelAndViewResolver 记录日志 在 Spring MVC 中,ModelAndViewResolver 是一个用于处理方法返回值的接口。它可以...
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
j2ee项目经常需要记录操作者的日志,本demo在ssh框架上运用了spring的aop,加上threadlocal(用户信息,请求信息)完成了日志记录。
主要介绍ThreadLocal的原理,实例分析以及注意事项
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
java 简单的ThreadLocal示例
Synchronized与ThreadLocal
本例以序列号生成的程序为例,展示ThreadLocal的使用
设计模式及ThreadLocal详细讲解资料,想要学习java或者提升自己技术的同学可以下载观看
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量
详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053