如何暂时使字段线程本地化

时间:2014-05-19 23:10:51

标签: java multithreading logging

我的类是这样的,基本上我正在编写一个servlet,我想更改连接到我的servlet的特定用户的日志级别,并保持其他用户的其他日志设置不变,因为服务器将生成一个线程为一个客户端服务,我只编写演示代码只使用线程

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");
    }
}

任何想法怎么做?

1 个答案:

答案 0 :(得分:2)

似乎可以这样做

 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"));
       }
     }
  }

了解更多信息: When and how should I use a ThreadLocal variable?

对于Thread Local,

java doc表示访问一个(通过其get或set方法)的每个线程都有自己的,独立初始化的变量more的副本。