Advanced Usage

Learn about ThreadContext parameters that display in sentry.io.

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.

As of Sentry Java SDK version 8.24.0, contextTags also applies to structured logs. MDC properties matching the configured contextTags will be attached to log entries as attributes, prefixed with "mdc.".

To define a tag that shall be sent with events and logs, add a contextTags attribute to the <Sentry> tag in your log4j2.xml with the tags as comma-separated items.

Copied
<Sentry
  name="Sentry"
  dsn="___PUBLIC_DSN___"
  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.

Was this helpful?
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").