package net.lightoze.errbit; import net.lightoze.errbit.api.Notice; import org.apache.commons.lang.Validate; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.spi.LoggingEvent; /** * @author Vladimir Kulev */ public class Log4jErrbitAppender extends AppenderSkeleton { private Class<? extends Log4jNoticeBuilder> noticeBuilder = Log4jNoticeBuilder.class; private NoticeSender sender; private String url; private String apiKey; private String environment; private boolean enabled = true; public Log4jErrbitAppender() { setThreshold(Level.ERROR); } @Override protected void append(LoggingEvent event) { if (!enabled) { return; } try { Log4jNoticeBuilder builder = noticeBuilder.newInstance(); Notice notice = builder .setEvent(event) .setApiKey(apiKey) .setEnvironment(environment) .build(); sender.send(notice); } catch (Exception e) { LogLog.warn("Could not send error notice", e); } } @SuppressWarnings("unchecked") public void setNoticeBuilder(String className) throws ClassNotFoundException { noticeBuilder = (Class<? extends Log4jNoticeBuilder>) Thread.currentThread().getContextClassLoader().loadClass(className); } public void setUrl(String url) { this.url = url; } public void setApiKey(String apiKey) { this.apiKey = apiKey; } public void setEnvironment(String environment) { this.environment = environment; } public void setEnabled(boolean enabled) { this.enabled = enabled; } @Override public void activateOptions() { Validate.notNull(url); Validate.notNull(apiKey); Validate.notNull(environment); sender = new NoticeSender(url); } @Override public void close() { } @Override public boolean requiresLayout() { return false; } }