All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.airbrake.logback.AirbrakeAppender Maven / Gradle / Ivy

package io.airbrake.logback;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.core.AppenderBase;
import io.airbrake.javabrake.Notifier;
import io.airbrake.javabrake.Airbrake;
import io.airbrake.javabrake.Config;
import io.airbrake.javabrake.Notice;
import io.airbrake.javabrake.NoticeError;

public class AirbrakeAppender extends AppenderBase {

  Notifier notifier;
  int projectId;
  String projectKey;String env;

  public void setProjectId(int projectId) {
    this.projectId = projectId;
    this.initNotifier();
  }

  public void setProjectKey(String projectKey) {
    this.projectKey = projectKey;
    this.initNotifier();
  }

  public void setEnv(String env) {
    this.env = env;
  }

  public void initNotifier() {
    if (projectId == 0 || projectKey == null) {
      return;
    }
    Config config = new Config();
    config.projectId = projectId;
    config.projectKey = projectKey;
    this.notifier = new Notifier(config);
  }

  @Override
  protected void append(ILoggingEvent event) {
    NoticeError err = newNoticeError(event);
    if (err == null) {
      return;
    }

    List errors = new ArrayList<>();
    errors.add(err);

    Notice notice = new Notice(errors);
    if (this.env  != null) {
      notice.setContext("environment", this.env);
    }
    notice.setContext("severity", formatLevel(event.getLevel()));
    notice.setParam("threadName", event.getThreadName());
    Map mdc = event.getMDCPropertyMap();
    if (mdc !=null && mdc.size() > 0) {
      notice.setParam("mdc", mdc);
    }
    Map ctx = event.getLoggerContextVO().getPropertyMap();
    if (ctx!= null && ctx.size() > 0) {
      notice.setParam("contextV0", ctx);
    }
    if (event.getMarker() != null ) {
      notice.setParam("marker", event.getMarker().getName());
    }
    this.send(notice);
  }

  static NoticeError newNoticeError(ILoggingEvent event) {
    IThrowableProxy throwableProxy = event.getThrowableProxy();
    if (throwableProxy != null) {
      String type = throwableProxy.getClassName();
      String message = throwableProxy.getMessage();
      StackTraceElement[] stackTrace =
          toStackTrace(throwableProxy.getStackTraceElementProxyArray());
      return new NoticeError(type, message, stackTrace);
    }

    String type = event.getLoggerName();
    String message = event.getFormattedMessage();
    return new NoticeError(type, message, event.getCallerData());
  }

  static StackTraceElement[] toStackTrace(StackTraceElementProxy[] proxyElements) {
    StackTraceElement[] stackTrace = new StackTraceElement[proxyElements.length];
    for (int i = 0; i < proxyElements.length; i++) {
      stackTrace[i] = proxyElements[i].getStackTraceElement();
    }
    return stackTrace;
  }

  static String formatLevel(Level level) {
    if (level.isGreaterOrEqual(Level.ERROR)) {
      return "error";
    }
    if (level.isGreaterOrEqual(Level.WARN)) {
      return "warn";
    }
    if (level.isGreaterOrEqual(Level.INFO)) {
      return "info";
    }
    if (level.isGreaterOrEqual(Level.DEBUG)) {
      return "debug";
    }
    return "trace";
  }

  Notice send(Notice notice) {
    if (this.notifier != null) {
      return this.notifier.sendSync(notice);
    }
    return Airbrake.sendSync(notice);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy