package org.radargun.stages.monitor; import java.util.HashMap; import java.util.Map; import java.util.Stack; import org.radargun.DistStageAck; import org.radargun.config.Property; import org.radargun.config.Stage; import org.radargun.logging.Level; import org.radargun.logging.LogFactory; import org.radargun.stages.AbstractDistStage; /** * This stage is meant for debugging. Changes log priorities. Beware that some code can cache the is{LogLevel}Enabled(). * * @author Radim Vansa <rvansa@redhat.com> */ @Stage(doc = "Debugging stage: changes log priorities") public class SetLogLevelStage extends AbstractDistStage { @Property(optional = false, name = "package", doc = "The package or class which should be affected.") private String pkg; @Property(doc = "The new priority that should be used. No defaults.") private String priority; @Property(doc = "If set to true, instead of setting the priority directly just undo the last priority change. Default is false.") private boolean pop; private static Map<String, Stack<Level>> stacks = new HashMap<String, Stack<Level>>(); @Override public DistStageAck executeOnSlave() { try { Stack<Level> stack = stacks.get(pkg); if (stack == null) { stack = new Stack<Level>(); stacks.put(pkg, stack); } if (priority != null) { stack.push(LogFactory.getLog(pkg).getLevel()); LogFactory.getLog(pkg).setLevel(Level.toLevel(priority)); } else if (pop) { if (stack.empty()) { log.error("Cannot POP priority level, stack empty!"); } else { LogFactory.getLog(pkg).setLevel(stack.pop()); } } else { log.error("Neither priority nor POP request specified"); } } catch (Exception e) { log.error("Failed to change log level", e); } return successfulResponse(); } }