Advanced Usage

By default all ThreadContext parameters are stored under the “Context Data” tab in sentry.io.

Copied
import org.apache.logging.log4j.ThreadContext;

void logWithExtras() {
  // ThreadContext ("MDC") extras
  ThreadContext.put("Environment", "Development");
  ThreadContext.put("OS", "Linux");

  // This sends an event where the Environment and OS ThreadContext values are set as Context Data entries
  logger.error("This is a test");
}

Note that ThreadContext manages data on a per-thread basis, and that a child thread does not automatically inherit ThreadContext properties from its parent.

Copied
import io.sentry.core.Sentry;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;

public class MyClass {
  private static final Logger logger = LogManager.getLogger(MyClass.class);

  void logSimpleMessage() {
    // This sends a simple event to Sentry
    logger.error("This is a test");
  }

  void logWithBreadcrumbs() {
    // Record a breadcrumb that will be sent with the next event(s),
    // by default the last 100 breadcrumbs are kept.
    Sentry.addBreadcrumb("User made an action");

    // Log entries below `minimumEventLevel` and above or equal to `minimumBreadcrumbLevel`
    // are recorded as breadcrumbs
    logger.info("User made another action");

    // This sends a simple event to Sentry
    logger.error("This is a test");
  }

  void logWithExtras() {
    // MDC extras
    ThreadContext.put("extra_key", "extra_value");
    // NDC extras are sent under 'log4j2-NDC'
    ThreadContext.push("Extra_details");
    // This sends an event with extra data to Sentry
    logger.error("This is a test");
  }

  void logException() {
    try {
      unsafeMethod();
    } catch (Exception e) {
      // This sends an exception event to Sentry
      logger.error("Exception caught", e);
    }
  }

  void unsafeMethod() {
    throw new UnsupportedOperationException("You shouldn't call this!");
  }
}

Starting with Sentry version 6.0.0 and up, you can define a list of MDC tags that will be viewable as Tags in the Sentry UI. MDC Tags not in this list will be viewable as Context Data. To define tags, add a contextTags attribute to the <Sentry> tag in your log4j2.xml with the tags as comma-separated items.

Copied
<Sentry name="Sentry"
  dsn="https://examplePublicKey@o0.ingest.sentry.io/0"
  contextTags="userId,requestId"
/>

When you call ThreadContext.push("userId", "myUserId") with the above configuration in place, the userId will show up as a tag on the event in the Sentry UI.

Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").