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

ThreadLocal记录日志

    博客分类:
  • java
 
阅读更多
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import trace.visitor.Visitor;

public class Trace {
	private static ThreadLocal<ConcurrentHashMap<Class<? extends ITracer>, ITracer>> tracer = new ThreadLocal<ConcurrentHashMap<Class<? extends ITracer>, ITracer>>() {
		@Override
		protected ConcurrentHashMap<Class<? extends ITracer>, ITracer> initialValue() {
			return new ConcurrentHashMap<Class<? extends ITracer>, ITracer>();
		}
	};
	private static ThreadLocal<Boolean> lock = new ThreadLocal<Boolean>() {
		@Override
		protected Boolean initialValue() {
			return Boolean.FALSE;
		}
	};

	public static boolean isStart() {
		return lock.get();
	}

	public static void start() {
		lock.set(true);
	}

	public static void stop() {
		lock.set(false);
	}

	public static void trace(Visitor visitor, ITraceFilter filter) {

		if (visitor == null) {
			throw new NullPointerException("需要先指定访问者");
		}
		ConcurrentHashMap<Class<? extends ITracer>, ITracer> map = tracer.get();
		for (Map.Entry<Class<? extends ITracer>, ITracer> entry : map
				.entrySet()) {
			ITracer tracer = entry.getValue();
			List<? extends AbstractEntry> entrys = tracer.getEntrySet();
			for (AbstractEntry e : entrys) {
				if (filter == null || filter.accept(e)) {
					e.accept(visitor);
				}
			}
		}

	}

	public static void trace(Visitor visitor) {
		trace(visitor, null);
	}

	public static void reset() {
		ConcurrentHashMap<Class<? extends ITracer>, ITracer> map = tracer.get();
		for (Map.Entry<Class<? extends ITracer>, ITracer> entry : map
				.entrySet()) {
			ITracer tracer = entry.getValue();
			tracer.reset();
		}
	}

	@SuppressWarnings("unchecked")
	public static <T extends ITracer> T getTracer(Class<T> clazz) {
		ConcurrentHashMap<Class<? extends ITracer>, ITracer> map = tracer.get();
		try {
			map.putIfAbsent(clazz, (T) clazz.newInstance());
			return (T) map.get(clazz);
		} catch (Exception e) {
			throw new RuntimeException("无法获取" + clazz.getName() + "的记录器");
		}
	}
}

 

获取一个tracer,调用tracer.debug(×××),记录的东西都保存在ThreadLocal中,最后通过访问者模式暴露给外部使用。可以用来统计方法运行过程中产生的各种日志,以及方法执行的时间,结果等等

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    j2ee的aop方式记录日志

    在日志切面中,通过这些库的API记录日志信息。 - 根据需求,可以记录方法名、参数、返回值、执行时间、用户信息和请求信息等。 5. **优化与注意事项** - 注意日志级别,根据不同的环境(开发、测试、生产)设置...

    正确理解ThreadLocal.pdf

    3. **日志记录**:在多线程环境中,`ThreadLocal`可以用于维护每个线程的日志上下文,如线程ID、用户名等,便于日志信息的记录和分析。 4. **性能优化**:在某些计算密集型应用中,`ThreadLocal`可以用于缓存线程...

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

    - **日志记录器**:在日志系统中,每个线程可以有自己的日志记录器实例,避免在多线程环境下对同一日志对象进行同步。 ### 3. ThreadLocal的优缺点 优点: - **简单易用**:ThreadLocal提供了一种简单的线程间数据...

    java事务 - threadlocal

    例如,每个线程可以有自己的日志记录器实例,避免在并发环境中频繁地同步共享资源。ThreadLocal的使用方法是创建一个ThreadLocal实例,然后通过其set()方法设置线程局部变量,get()方法获取当前线程的该变量值。需要...

    springmvcController层通用日志配置

    Spring MVC 提供了多种方式来记录日志,其中一种是通过实现 ModelAndViewResolver 接口来记录日志。在本资源中,我们将详细介绍如何使用 ModelAndViewResolver 来记录 Controller 层的日志信息。 为什么需要记录...

    java中ThreadLocal类的使用

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

    ThreadLocal使用案例_动力节点Java学院整理

    我们使用ThreadLocal来记录操作日志,以便在多线程环境中能够正确地记录操作日志。通过使用ThreadLocal,我们可以确保数据的一致性和线程安全。 ThreadLocal的使用可以带来许多好处,例如: * 实现线程安全的变量...

    理解ThreadLocal

    此外,ThreadLocal 还有很多其他的应用场景,例如在事务管理、日志记录、会话管理等方面都可以使用 ThreadLocal 来实现线程局部变量的管理。 ThreadLocal 的应用非常广泛, Java 开发者应该掌握它来提高开发效率和...

    Python之ThreadLocal共4页.pdf.zip

    1. **线程安全的配置**:每个线程可以有自己的配置信息,例如数据库连接、日志记录器等,确保线程间互不干扰。 2. **状态管理**:在多线程服务器应用中,如Web服务器,每个请求通常分配到一个单独的线程,...

    ThreadLocal,你真的了解吗?

    3. 实现线程本地配置,如日志记录器、线程优先级等。 总结,ThreadLocal 提供了一种线程隔离的变量存储方式,而 Java 中的四种引用类型则帮助我们更好地控制对象的生命周期和内存管理,理解这些概念对于理解和使用 ...

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

    - 线程局部配置:如数据库连接、日志记录器等,每个线程都有自己的副本,互不干扰。 - 控制并发:例如在Servlet容器中,每个请求可以分配一个ThreadLocal变量,存储请求特有的数据。 - 容器内部使用:例如Spring...

    Java 并发编程之ThreadLocal详解及实例

    - **日志记录**:为每个线程设置一个日志对象,便于区分不同线程的日志输出。 4. **实例代码** ```java import java.util.concurrent.atomic.AtomicInteger; public class UniqueThreadIdGenerator { private...

    java 中ThreadLocal 的正确用法

    * 日志记录的线程关联 * 等等 ThreadLocal 的注意事项 在使用 ThreadLocal 时,我们需要注意以下几点: * ThreadLocal 变量应该是 private static 的,以避免外部访问和修改。 * 在使用 ThreadLocal 时,需要确保...

    C# 高效线程安全,解决多线程写txt日志类.zip

    5. **日志级别**:根据日志的严重性(比如错误、警告、信息)来控制写入频率,减少不必要的日志记录,提高效率。 通过这样的设计,我们可以构建出一个既安全又高效的多线程日志系统。在调试和排查问题时,这种系统...

    彻底理解Java中的ThreadLocal

    彻底理解Java中的ThreadLocal ...3. 日志记录的实现 ThreadLocal是一个非常有用的工具类,能够帮助我们简洁地编写出优美的多线程程序。但是需要注意的是,我们需要手动清除线程局部变量,以避免内存泄露。

    有关ThreadLocal的面试题你真的懂了吗

    3. ThreadLocal的使用场景:ThreadLocal常用于解决多线程程序的并发问题,如每个请求的关联、事务管理、日志记录等。 4. ThreadLocal的优点:ThreadLocal提供了一种解决多线程程序并发问题的思路,可以避免某些情况...

    java 中ThreadLocal实例分析

    在实际应用中,ThreadLocal 通常用于实现线程安全的缓存、Session 管理、日志记录等场景。例如,在 Web 应用程序中,我们可以使用 ThreadLocal 来存储用户的 Session 信息,以便在多个请求之间共享 Session 信息。 ...

    aop-log:项目正式命名为aop-log,基于Spring AOP,ThreadLocal实现方法埋点,埋点信息记录和自定义收集

    AopLogAopLog是基于SpringAop和ThreadLocal实现的一个对请求方法埋点记录与处理的日志工具包。设计目的和场景:使用Spring Aop拦截程序,基本上都是同一个小异,不想日后每个项目都柏林都写一份这样的Aop拦截处理...

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

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

    springMVC自定义注解,用AOP来实现日志记录的方法

    SpringMVC自定义注解与AOP实现日志记录的方法 在本文中,我们将探讨如何使用SpringMVC自定义注解与AOP(Aspect-Oriented Programming)来实现日志记录的方法。该方法可以在项目中记录业务操作的日志,并提取关键...

Global site tag (gtag.js) - Google Analytics