如何暂时将字段线程设为本地 [英] how to temporarily make a field thread local
问题描述
我的类是这样的,基本上我正在编写一个servlet,并且我想更改连接到servlet的特定用户的日志级别,并保持其他用户的其他日志设置不变,因为服务器将产生一个线程为了服务一个客户,我正在编写仅使用线程的演示代码
My class is like this, basically I'm writing a servlet, and I want to change the log level for a specific user connected to my servlet and leave other log settings for other user unchanged, since the server will produce one thread to serve one client, I'm writing demo code use only threads
public Class A implements Runnable {
Logger myLogger = new Logger();
@Override
public void run() {
if (Thread.currentThread.getName()).equals("something") {
// some code that makes myLogger thread-local so I can change
// myLogger settings without affecting other threads
}
myLogger.debug("some debug information");
}
}
有什么想法怎么做?
推荐答案
似乎可以通过这种方式完成
Seems like this could be done in this way
public Class A implements Runnable {
private static final ThreadLocal<Logger> logger = new ThreadLocal<Logger>(){
//return your desired logger
}
@Override
public void run() {
//check condition and change logger if required
//check if that particular servlet and user also
if (Thread.currentThread.getName().equals("something") && user.getId() ==XX) {
ConsoleAppender a = (ConsoleAppender) Logger.getRootLogger().getAppender("stdout");
a.setLayout(new PatternLayout("%d{HH:mm:ss} %-5.5p %t %m%n"));
}
}
}
有关更多信息: 何时以及如何使用ThreadLocal变量?
java doc 用于本地线程指出每个访问一个线程(通过其get或set方法)的线程都有其自己的,独立初始化的变量
java doc for Thread Local states that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable more.
这篇关于如何暂时将字段线程设为本地的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!