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
- Build a
Resourcewithservice.name,cx.application.name, andcx.subsystem.name. - Create an
SdkLoggerProviderwith aBatchLogRecordProcessorbacked byOtlpGrpcLogRecordExporter. - Register
OpenTelemetrySdkglobally, emit one INFO record, one WARN record inside a span, then ERROR records withHello 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:
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 usehttp://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 Java | OpenTelemetry Java docs |
| Java instrumentation guide | Java OpenTelemetry instrumentation |
| Coralogix Endpoints | Coralogix Endpoints |
Support
For help, use in-app chat or email [email protected].

