Package org.olat.core.util.threadlog

Source Code of org.olat.core.util.threadlog.UserBasedLogLevelManager

package org.olat.core.util.threadlog;

import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

import org.apache.log4j.Appender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.olat.core.configuration.PersistedProperties;
import org.olat.core.gui.control.Event;
import org.olat.core.util.event.GenericEventListener;

/** work in progress class to allow overwriting log levels on a username base **/
public class UserBasedLogLevelManager implements GenericEventListener {
 
  private static final String PROP_NAME_USERNAMES2LEVELS = "Usernames2Levels";
 
  private static final Map<String,LogConfig> username2LogConfig = new HashMap<String,LogConfig>();
 
  private static boolean initialized_ = false;
 
  private static PersistedProperties persistentProperties;
 
  @Override
  public void event(@SuppressWarnings("unused") Event event) {
    // ignoring
  }
 
  private static void init() {
    if (initialized_) {
      return;
    }
   
    persistentProperties = new PersistedProperties(new UserBasedListener());
   
    String usernameAndLevels = loadUsernameAndLevels();

    if (usernameAndLevels!=null) {
      String[] usernameAndLevelArray = usernameAndLevels.split("\r\n");
      for (int i = 0; i < usernameAndLevelArray.length; i++) {
        String aUsernameAndLevel = usernameAndLevelArray[i];
        if (aUsernameAndLevel!=null && aUsernameAndLevel.length()>0 && aUsernameAndLevel.contains("=")) {
          setLogLevelAndAppender(aUsernameAndLevel);
        }
      }
    }
   
    initialized_ = true;
  }
 
  public static String loadUsernameAndLevels() {
    try{
      return persistentProperties.getStringPropertyValue(PROP_NAME_USERNAMES2LEVELS, true);
    } catch(Exception e) {
      Logger.getLogger(RequestBasedLogLevelManager.class).warn("loadUsernameAndLevels: Error loading property value "+PROP_NAME_USERNAMES2LEVELS, e);
      return null;
    }
  }
 
  public static void storeUsernameAndLevels(String usernameAndLevels) {
    try{
      persistentProperties.setStringProperty(PROP_NAME_USERNAMES2LEVELS, usernameAndLevels, true);
    } catch(Exception e) {
      Logger.getLogger(RequestBasedLogLevelManager.class).warn("storeUsernameAndLevels: Error storing property value "+PROP_NAME_USERNAMES2LEVELS, e);
    }
  }
 
  public static void reset() {
    username2LogConfig.clear();
  }
 
  public static void setLogLevelAndAppender(String configStr) {
    StringTokenizer st = new StringTokenizer(configStr, "=");
    String username = st.nextToken();
    String logConfig = st.nextToken();
    Level level;
    Appender appender;
    if (logConfig.contains(",")) {
      st = new StringTokenizer(logConfig, ",");
      level = Level.toLevel(st.nextToken());
      String categoryAppenderStr = st.nextToken();
      Logger l = Logger.getLogger(categoryAppenderStr);
      if (l!=null) {
        appender = l.getAppender(categoryAppenderStr);
        if (appender==null) {
          appender = Logger.getRootLogger().getAppender(categoryAppenderStr);
        }
      } else {
        appender = null;
      }
    } else {
      level = Level.toLevel(logConfig);
      appender = null;
    }
    setLogLevelAndAppenderForUsername(username, level, appender);
  }
 
  public static void setLogLevelAndAppenderForUsername(String username, Priority level, Appender appender) {
    if (level==null && appender==null) {
      username2LogConfig.remove(username);
    } else {
      username2LogConfig.put(username, new LogConfig(level, appender));
    }
  }
 
  /** done static here - still work in progress - will be done as a normal spring manager eventually **/
  public static void activateUsernameBasedLogLevel(String username) {
    if (!initialized_) init();
    LogConfig logConfig = username2LogConfig.get(username);
    if (logConfig!=null) {
      ThreadLocalLogLevelManager.forceThreadLocalLogLevel(logConfig);
    } else {
      ThreadLocalLogLevelManager.releaseForcedThreadLocalLogLevel();
    }
  }
 
  public static void deactivateUsernameBasedLogLevel() {
    ThreadLocalLogLevelManager.releaseForcedThreadLocalLogLevel();
  }


}
TOP

Related Classes of org.olat.core.util.threadlog.UserBasedLogLevelManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.