`
geeksun
  • 浏览: 965012 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用ThreadLocal记录日志

阅读更多

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

分享到:
评论

相关推荐

    j2ee的aop方式记录日志

    在多线程环境中,我们可以利用ThreadLocal存储用户信息和请求信息,确保这些信息在同一个请求范围内是安全的。 - 在Filter或者Servlet初始化时,将用户和请求信息存入ThreadLocal。 - 在日志切面中,可以直接从...

    ThreadLocal原理及在多层架构中的应用

    - **HTTP请求上下文**:在Web应用中,可以利用ThreadLocal传递请求相关的数据,如用户会话信息、请求参数等。 - **线程本地缓存**:为每个线程提供独立的缓存,避免并发访问引起的同步问题。 - **日志记录器**:在...

    java中ThreadLocal类的使用

    1. **线程安全的配置**:每个线程可以有自己的配置信息,如数据库连接、日志记录器等,而无需担心数据冲突。 2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同...

    ThreadLocal 线程本地变量 及 源码分析.rar_开发_设计

    - 容器内部使用:例如Spring框架中的TransactionTemplate就是利用ThreadLocal来管理事务的。 以上是对ThreadLocal的简单介绍和源码分析,实际使用中还需要结合具体业务场景进行合理设计和优化。通过深入理解...

    利用AOP来变更工作线程的名字,来快速过滤出一次请求的所有日志.docx

    1. **@Slf4j**: 这是Lombok库的一个注解,用于自动注入SLF4J的日志记录器,简化日志记录代码。 2. **@Component**: 这是Spring框架的注解,表示`WorkThreadNameAspect`是一个bean,可以被Spring容器管理。 3. **@...

    使用spring拦截器实现日志管理实例

    如果需要对不同URL或特定请求进行不同的日志处理,可以利用`HandlerMapping`中的`HandlerMapping.getHandler(HttpServletRequest request)`方法获取到处理当前请求的处理器对象,进一步判断是否需要进行日志记录。...

    大型应用系统架构设计 淘宝分布式调用跟踪系统介绍 共60页.pptx

    \n\n在系统架构中,鹰眼首先通过中间件进行埋点,利用ThreadLocal存储调用信息,实现异步写入日志,并采用采样的方式减少性能影响。一旦发生问题,可以实时抓取日志,按照Traceld汇总,然后根据不同的存储策略进行...

    slf4j中的MDC

    了解以上知识点后,你可以更有效地利用SLF4J的MDC特性来提升你的日志系统,便于追踪问题和分析日志。在实际项目中,配合源码阅读和工具使用,如查看博客文章(如提供的链接),可以帮助你更深入地理解和运用这一功能...

    关于java内存泄漏

    3. **日志记录**:记录关键对象的生命周期,以便追踪和分析内存使用情况。 ##### 避免措施: 1. **合理使用弱引用、软引用**:对于那些非必需但又有一定价值的对象,可以考虑使用弱引用或软引用来代替强引用。 2. ...

    从头分析一则traceId穿透问题(附解决方案).docx

    这主要是因为日志记录发生在不同的线程中,而默认情况下,trace ID是通过`ThreadLocal`来传递的。因此,当从一个线程切换到另一个线程时,原有的`ThreadLocal`变量中的trace ID信息可能会丢失。 为了解决这个问题,...

    C#蜂巢工作机制系统与源代码.zip

    7. **日志记录(Logging)**:为了追踪系统运行状况和调试,日志记录是必不可少的。C#中有多种日志库,如NLog、Log4Net、Serilog等,可以集成到项目中进行日志记录。 8. **扩展性与插件化(Extensibility & Plugins...

    阿里巴巴Java开发手册(详尽版)1.4.0.rar

    2. 日志框架:合理选择日志框架,如Log4j、SLF4J、Logback等,保证日志记录的统一性和可追溯性。 3. 日志级别:正确设置日志级别,如DEBUG、INFO、WARN、ERROR等,以平衡调试需求和性能影响。 五、性能优化 1. 对象...

    Java 实例 - 状态监测源代码+详细指导教程.zip

    3. **日志与异常处理**:在状态监测中,日志记录是获取程序运行状态的重要途径。学会使用如Log4j或SLF4J等日志框架,以及正确的异常处理策略(try-catch-finally、throwable类型、自定义异常类)对于状态监测至关...

    Web页面分层交叉实验.pdf

    实验信息的埋点是另一个重要环节,需要在流量进入页面时记录实验信息,这些信息会随着用户行为记录到用户操作日志中,便于后续分析实验效果。 总的来说,分层交叉实验通过巧妙地组织和管理流量,实现了流量资源的...

    基于Java的线程错误捕获工具 CheckThread.zip

    6. **日志记录**:CheckThread通常会将捕获到的错误信息和分析结果写入日志文件,方便后续分析和故障排查。 7. **用户友好的界面**:对于非命令行用户,CheckThread可能提供了一个图形用户界面(GUI),使开发者能...

    针对于java面试资料.docx

    - **撤销日志**:记录事务对数据的更改,以便于回滚。 - **快照隔离**:每个事务读取的数据是一致的“快照”,只包括在事务开始前已经提交的数据。 **应用场景:** - 数据库管理系统中的事务处理。 - 大型分布式...

    分布式实时监控系统

    例如,利用Java的ThreadLocal传递Trace ID以实现上下文的传递,使用ArrayBlockingQueue这样的Java并发库中的组件来进行数据的缓冲处理,通过HDFS(Hadoop分布式文件系统)、MapReduce进行数据的汇总和处理,以及最终...

    静态代理案例---线程买票

    在这个静态代理案例中,静态代理模式主要用于增加额外的功能,例如日志记录、权限验证等,而不会影响到核心业务逻辑(购票)。代理类将持有目标对象(售票员),并在调用目标对象方法时进行预处理和后处理。 总的来...

    java 内存泄露

    2. **日志记录与监控**:通过在代码中加入适当的日志记录,可以追踪对象的创建和销毁过程,有助于发现潜在的内存泄露问题。同时,对应用的JVM内存使用情况进行持续监控,一旦发现异常增长,可以及时介入调查。 四、...

Global site tag (gtag.js) - Google Analytics