Warning

**Deprecation Notice**: The Coralogix Java SDK (`coralogix-sdk`) will be deprecated in favor of the [OpenTelemetry SDK](https://opentelemetry.io/docs/languages/java/) and will no longer be supported after **June 30, 2026**. See the [end-of-life notice](https://coralogix.com/docs/user-guides/latest-updates/deprecations/java-sdk/index.md) for migration details.

# Java

This guide shows how to send Java logs to Coralogix using the [OpenTelemetry Java SDK](https://opentelemetry.io/docs/languages/java/) logs API with OTLP/gRPC export. This replaces shipping logs through the legacy `coralogix-sdk` package.

Use Java 17+ and OpenTelemetry Java releases compatible with the sample.

## Package dependencies setup

Add OpenTelemetry API, logs SDK, and OTLP exporter dependencies to your `pom.xml`:

```xml
<dependencies>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-api</artifactId>
    <version>1.57.0</version>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-sdk</artifactId>
    <version>1.57.0</version>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-sdk-logs</artifactId>
    <version>1.57.0</version>
  </dependency>
  <dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-otlp</artifactId>
    <version>1.57.0</version>
  </dependency>
</dependencies>
```

Select the https://ingress.\[[DOMAIN_VALUE]\] endpoint that corresponds to your Coralogix [domain](https://coralogix.com/docs/user-guides/account-management/account-settings/coralogix-domain/index.md) using the domain selector at the top of the page.

## Application implementation

1. Build a `Resource` with `service.name`, `cx.application.name`, and `cx.subsystem.name`.
1. Create an `SdkLoggerProvider` with a `BatchLogRecordProcessor` backed by `OtlpGrpcLogRecordExporter`.
1. Register `OpenTelemetrySdk` globally, emit one INFO record, one WARN record inside a span, then ERROR records with `Hello World Coralogix`.

```java
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.logs.Logger;
import io.opentelemetry.api.logs.Severity;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Scope;
import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import java.time.Instant;
import java.util.concurrent.TimeUnit;

public class Main {
  private static String envOrDefault(String key, String fallback) {
    String value = System.getenv(key);
    return value == null || value.isBlank() ? fallback : value;
  }

  public static void main(String[] args) throws Exception {
    String endpoint = envOrDefault("OTEL_EXPORTER_OTLP_ENDPOINT", "http://host.docker.internal:4317");
    String serviceName = envOrDefault("OTEL_SERVICE_NAME", "java-otel-logs-sample");
    String applicationName = envOrDefault("CORALOGIX_APPLICATION", "java-otel-app");
    String subsystemName = envOrDefault("CORALOGIX_SUBSYSTEM", "worker");

    Resource resource = Resource.getDefault().merge(
        Resource.create(Attributes.of(
            AttributeKey.stringKey("service.name"), serviceName,
            AttributeKey.stringKey("cx.application.name"), applicationName,
            AttributeKey.stringKey("cx.subsystem.name"), subsystemName
        ))
    );

    OtlpGrpcLogRecordExporter logExporter = OtlpGrpcLogRecordExporter.builder()
        .setEndpoint(endpoint)
        .build();

    SdkLoggerProvider loggerProvider =
        SdkLoggerProvider.builder()
            .setResource(resource)
            .addLogRecordProcessor(BatchLogRecordProcessor.builder(logExporter).build())
            .build();

    SdkTracerProvider tracerProvider = SdkTracerProvider.builder()
            .setResource(resource)
            .build();

    OpenTelemetrySdk openTelemetry =
        OpenTelemetrySdk.builder()
            .setLoggerProvider(loggerProvider)
            .setTracerProvider(tracerProvider)
            .buildAndRegisterGlobal();

    Logger logger = GlobalOpenTelemetry.get().getLogsBridge().loggerBuilder("My class").build();
    Tracer tracer = openTelemetry.getTracer("java-otel-example");

    System.out.printf("OTLP logs endpoint: %s%n", endpoint);

    logger.logRecordBuilder()
        .setTimestamp(Instant.now())
        .setSeverity(Severity.INFO)
        .setBody("hello java logging with OpenTelemetry")
        .emit();

    Span span = tracer.spanBuilder("manual-span").startSpan();
    try (Scope ignored = span.makeCurrent()) {
      logger.logRecordBuilder()
          .setTimestamp(Instant.now())
          .setSeverity(Severity.WARN)
          .setBody("java log with trace correlation")
          .emit();
    } finally {
      span.end();
    }

    for (int i = 0; i < 10; i++) {
      var builder = logger.logRecordBuilder()
          .setTimestamp(Instant.now())
          .setSeverity(Severity.ERROR)
          .setBody("Hello World Coralogix");
      builder.emit();
      Thread.sleep(1000);
    }

    Thread.sleep(1500);
    loggerProvider.forceFlush().join(10, TimeUnit.SECONDS);
    loggerProvider.shutdown().join(10, TimeUnit.SECONDS);
    tracerProvider.shutdown().join(10, TimeUnit.SECONDS);

    System.out.println("Done: flush + shutdown completed");
  }
}
```

Run the sample:

```bash
mvn -q -DskipTests package
java -jar target/java-otel-logs-1.0.0-jar-with-dependencies.jar
```

**Notes**

- The logs exporter batches records. Call `forceFlush()` / `shutdown()` before exit so telemetry is delivered.
- The internal sample defaults to `http://host.docker.internal:4317`; for local non-Docker runs you can use `http://localhost:4317`.
- For broader Java setup including traces and metrics, see [Java OpenTelemetry instrumentation](https://coralogix.com/docs/opentelemetry/instrumentation-options/java-opentelemetry-instrumentation/index.md).

### Logging output

With the OpenTelemetry SDK, you can send logs either to a local [OpenTelemetry Collector](https://coralogix.com/docs/opentelemetry/kubernetes-observability/kubernetes-observability-using-opentelemetry/index.md) or directly to Coralogix using an OTLP endpoint.

#### OpenTelemetry Collector

Set `OTEL_EXPORTER_OTLP_ENDPOINT` to your collector OTLP/gRPC endpoint (for example `http://localhost:4317`).

#### Coralogix OpenTelemetry endpoint

Authenticate with your [Send-Your-Data API key](https://coralogix.com/docs/user-guides/account-management/api-keys/send-your-data-api-key/index.md) and point the OTLP exporter at your Coralogix endpoint.

```bash
OTEL_EXPORTER_OTLP_ENDPOINT=https://ingress.[[DOMAIN_VALUE]]:443
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer send_your_data_key"
OTEL_SERVICE_NAME=java-otel-logs-sample
CORALOGIX_APPLICATION=hello
CORALOGIX_SUBSYSTEM=world
```

### Additional resources

|                            |                                                                                                                                                    |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| OpenTelemetry Java         | [OpenTelemetry Java docs](https://opentelemetry.io/docs/languages/java/)                                                                           |
| Java instrumentation guide | [Java OpenTelemetry instrumentation](https://coralogix.com/docs/opentelemetry/instrumentation-options/java-opentelemetry-instrumentation/index.md) |
| Coralogix Endpoints        | [Coralogix Endpoints](https://coralogix.com/docs/integrations/coralogix-endpoints/index.md)                                                        |

### Support

For help, use in-app chat or email [support@coralogix.com](mailto:support@coralogix.com).
