Skip to content

Warning

Deprecation Notice: The Coralogix Java SDK (coralogix-sdk) will be deprecated in favor of the OpenTelemetry SDK and will no longer be supported after June 30, 2026. See the end-of-life notice for migration details.

Java

This guide shows how to send Java logs to Coralogix using the OpenTelemetry Java SDK 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:

<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. endpoint that corresponds to your Coralogix domain 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.
  2. Create an SdkLoggerProvider with a BatchLogRecordProcessor backed by OtlpGrpcLogRecordExporter.
  3. Register OpenTelemetrySdk globally, emit one INFO record, one WARN record inside a span, then ERROR records with Hello World Coralogix.
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:

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.

Logging output

With the OpenTelemetry SDK, you can send logs either to a local OpenTelemetry Collector 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 and point the OTLP exporter at your Coralogix endpoint.

OTEL_EXPORTER_OTLP_ENDPOINT=https://ingress.: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 JavaOpenTelemetry Java docs
Java instrumentation guideJava OpenTelemetry instrumentation
Coralogix EndpointsCoralogix Endpoints

Support

For help, use in-app chat or email [email protected].