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

og4javabrake2.0.1.6.source-code.AirbrakeAppender Maven / Gradle / Ivy

package io.airbrake.log4javabrake2;
import static java.lang.Runtime.getRuntime;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginElement;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message;

import io.airbrake.javabrake.Notifier;
import io.airbrake.javabrake.Airbrake;
import io.airbrake.javabrake.Notice;
import io.airbrake.javabrake.NoticeError;

@Plugin(name = "Airbrake", category = "Core", elementType = "appender", printObject = true)
public class AirbrakeAppender extends AbstractAppender {
  private ExecutorService executorService = Executors.newFixedThreadPool(4);
  Notifier notifier;
  String env;

  protected AirbrakeAppender(
      String name, Filter filter, int projectId, String projectKey, String env) {
    super(name, filter, null, true);
    if (projectId != 0 && projectKey != null) {
      this.notifier = new Notifier(projectId, projectKey);
    }
    this.env = env;
    getRuntime().addShutdownHook(new Thread(this::shutdown));
  }

  @Override
  public void append(LogEvent event) {
    Notice notice = newNotice(event);
    if (this.env != null) {
      notice.setContext("environment", this.env);
    }
    notice.setContext("severity", formatLevel(event.getLevel()));
    if (event.getContextStack() != null) {
      notice.setParam("contextStack", event.getContextStack().asList());
    }
    if (event.getContextData() != null) {
      notice.setParam("contextData", event.getContextData());
    }
    if (event.getMarker() != null) {
      notice.setParam("marker", event.getMarker().getName());
    }
    this.send(notice);
  }

  @PluginFactory
  public static AirbrakeAppender createAppender(
      @PluginAttribute("name") String name,
      @PluginElement("Filter") final Filter filter,
      @PluginAttribute("projectId") int projectId,
      @PluginAttribute("projectKey") String projectKey,
      @PluginAttribute("env") String env) {
    if (name == null) {
      LOGGER.error("No name provided for AirbrakeAppender");
      return null;
    }
    return new AirbrakeAppender(name, filter, projectId, projectKey, env);
  }

  static Notice newNotice(LogEvent event) {
    Throwable throwable = event.getThrown();
    if (throwable != null) {
      return new Notice(throwable);
    }

    Message eventMessage = event.getMessage();
    throwable = eventMessage.getThrowable();
    if (throwable != null) {
      return new Notice(throwable);
    }

    String type = event.getLoggerName();
    String message = eventMessage.getFormattedMessage();
    StackTraceElement[] stackTrace = null;

    if (event.getSource() != null) {
      stackTrace = new StackTraceElement[1];
      stackTrace[0] = event.getSource();
    }

    NoticeError err = new NoticeError(type, message, stackTrace);

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

    return new Notice(errors);
  }

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

  void send(Notice notice) {
    CompletableFuture.runAsync(() -> {
      if (this.notifier != null) {
        this.notifier.sendSync(notice);
      } else {
        Airbrake.sendSync(notice);
      }
    }, executorService);
  }

  void shutdown() {
    executorService.shutdown();
    try {
      if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
        executorService.shutdownNow();
      }
    } catch (InterruptedException ex) {
      executorService.shutdownNow();
      Thread.currentThread().interrupt();
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy