---
title: "Advanced Usage"
description: "Learn about ThreadContext parameters that display in sentry.io."
url: https://docs.sentry.io/platforms/java/guides/log4j2/advanced_usage/
---

# Advanced Usage | Sentry for Log4j 2.x

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

```java
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.

### [In Practice](https://docs.sentry.io/platforms/java/guides/log4j2/advanced_usage.md#in-practice)

```java
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!");
  }
}
```

## [Context Tags](https://docs.sentry.io/platforms/java/guides/log4j2/advanced_usage.md#context-tags)

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](https://docs.sentry.io/product/explore/logs.md). 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.

```xml
<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.
