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