package org.argeo.slc.log4j;
+import java.util.Date;
+
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Layout;
+import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;
public class SlcExecutionAppender extends AppenderSkeleton implements
InitializingBean, DisposableBean {
+ private Boolean disabled = false;
+
+ private String level = null;
+
+ private Level log4jLevel = null;
+
+ /** Marker to prevent stack overflow */
+ private ThreadLocal<Boolean> dispatching = new ThreadLocal<Boolean>() {
+
+ @Override
+ protected Boolean initialValue() {
+ return false;
+ }
+ };
+
private Layout layout = null;
private String pattern = "%m - %c%n";
- private Boolean onlyExecutionThread = true;
+ private Boolean onlyExecutionThread = false;
public void afterPropertiesSet() {
if (layout != null)
@Override
protected void append(LoggingEvent event) {
+ if (disabled)
+ return;
+
+ if (dispatching.get())
+ return;
+
+ if (level != null && !level.trim().equals("")) {
+ if (log4jLevel == null || !log4jLevel.toString().equals(level))
+ try {
+ log4jLevel = Level.toLevel(level);
+ } catch (Exception e) {
+ System.err
+ .println("Log4j level could not be set for level '"
+ + level + "', resetting it to null.");
+ e.printStackTrace();
+ level = null;
+ }
+
+ if (log4jLevel != null
+ && !event.getLevel().isGreaterOrEqual(log4jLevel)) {
+ return;
+ }
+ }
+
Thread currentThread = Thread.currentThread();
if (currentThread.getThreadGroup() instanceof ProcessThreadGroup) {
if (onlyExecutionThread
&& !(currentThread instanceof ExecutionThread))
return;
- ((ProcessThreadGroup) currentThread.getThreadGroup())
- .dispatchAddStep(new SlcExecutionStep(layout.format(event)));
+
+ final String type;
+ if (event.getLevel().equals(Level.ERROR)
+ || event.getLevel().equals(Level.FATAL))
+ type = SlcExecutionStep.ERROR;
+ else if (event.getLevel().equals(Level.WARN))
+ type = SlcExecutionStep.WARNING;
+ else if (event.getLevel().equals(Level.INFO))
+ type = SlcExecutionStep.INFO;
+ else if (event.getLevel().equals(Level.DEBUG))
+ type = SlcExecutionStep.DEBUG;
+ else if (event.getLevel().equals(Level.TRACE))
+ type = SlcExecutionStep.TRACE;
+ else
+ type = SlcExecutionStep.INFO;
+
+ SlcExecutionStep step = new SlcExecutionStep(new Date(event
+ .getTimeStamp()), type, layout.format(event));
+
+ try {
+ dispatching.set(true);
+ ((ProcessThreadGroup) currentThread.getThreadGroup())
+ .dispatchAddStep(step);
+ } finally {
+ dispatching.set(false);
+ }
}
}
this.onlyExecutionThread = onlyExecutionThread;
}
+ public void setDisabled(Boolean disabled) {
+ this.disabled = disabled;
+ }
+
+ public void setLevel(String level) {
+ this.level = level;
+ }
+
}