Spring Boot / Java: Logs an UptimeEye senden

Java-Services loggen meist über Logback (Standard in Spring Boot) oder Log4j2. Wähl die Option, die zu deinem Deployment passt: Der OpenTelemetry Java Agent braucht keinen Code und keinen Agent auf dem Host; Structured Logging plus Log-Agent ist das klassische Container-Setup; mit dem Klartext-Endpoint legst du in einer Minute los.

Endpunkt: https://logs.uptimeeye.com/v1/ingest/otlp/v1/logs

Option 1: OpenTelemetry Java Agent (ohne Codeänderungen)

Der Agent erfasst Logback- und Log4j2-Records mit MDC und Exception-Details und exportiert sie über OTLP. Häng ihn per JVM-Flag an und setz die Umgebungsvariablen.

shell / Dockerfile
curl -sSL -o opentelemetry-javaagent.jar \
  https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar

export OTEL_SERVICE_NAME=orders
export OTEL_RESOURCE_ATTRIBUTES=deployment.environment=prod
export OTEL_LOGS_EXPORTER=otlp
export OTEL_TRACES_EXPORTER=none
export OTEL_METRICS_EXPORTER=none
export OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/protobuf
export OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://logs.uptimeeye.com/v1/ingest/otlp/v1/logs
export OTEL_EXPORTER_OTLP_LOGS_HEADERS="Authorization=Bearer%20ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

java -javaagent:./opentelemetry-javaagent.jar -jar orders.jar
Note: Such mit service.name:=orders severity_text:=ERROR. MDC-Keys kommen als Attribute an; exception.stacktrace enthält den vollständigen Trace.

Option 2: Structured Logging von Spring Boot + Agent (Container)

Spring Boot 3.4+ schreibt mit einer einzigen Property ECS/JSON nach stdout. Dein Kubernetes- oder Docker-Agent macht die JSON-Keys dann zu Feldern.

application.properties
logging.structured.format.console=ecs
logging.structured.ecs.service.name=orders
logging.structured.ecs.service.environment=prod

Option 3: Logback-JSON in eine Datei, mitgelesen von Fluent Bit oder Vector

Für VMs. logstash-logback-encoder schreibt ein JSON-Objekt pro Zeile; die Agent-Anleitungen auf dieser Website lesen es mit _msg_field=message&_time_field=@timestamp ein.

logback-spring.xml
<configuration>
  <appender name="JSON" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/orders/application.json</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>/var/log/orders/application.%d{yyyy-MM-dd}.json</fileNamePattern>
      <maxHistory>3</maxHistory>
    </rollingPolicy>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <customFields>{"service":"orders","env":"prod"}</customFields>
      <includeMdcKeyName>traceId</includeMdcKeyName>
      <includeMdcKeyName>orderId</includeMdcKeyName>
    </encoder>
  </appender>
  <root level="INFO"><appender-ref ref="JSON"/></root>
</configuration>

Option 4: die Klartextdatei, sofort

Behalte dein Pattern-Layout und lad die Datei hoch. Zeitstempel und Level werden erkannt, Stacktraces bleiben bei ihrer Zeile.

shell
curl -sS -X POST "https://logs.uptimeeye.com/v1/ingest/text?service=orders&env=prod&_stream_fields=service,env" \
  -H "Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -H "Content-Type: text/plain" \
  --data-binary @/var/log/orders/application.log

Felder, die du bekommst

Diese Felder erscheinen im Panel „Felder“ und funktionieren in jedem Filter:

  • service / service.name, env
  • level / severity_text
  • logger_name, thread_name
  • MDC-Keys wie traceId, orderId
  • stack_trace / exception.stacktrace

Tipps

  • Logge in UTC oder mit explizitem Offset – der Klartext-Endpoint liest Zeitstempel ohne Zone als UTC.
  • Leg fachliche IDs in den MDC (MDC.put("orderId", id)) statt in die Nachricht; in jeder Option oben werden sie zu filterbaren Feldern.
  • Log4j2: Der OpenTelemetry Agent deckt Log4j2 ebenfalls ab; für Dateien nimm JsonTemplateLayout mit dem Template EcsLayout.json.

FAQ

Welche Option soll ich nehmen?

Kubernetes oder Docker mit vorhandenem Log-Agent → Option 2. VM ohne Agent → Option 1 (außer dem JAR nichts zu installieren) oder Option 3. Nur ausprobieren → Option 4.

Bremst der OpenTelemetry Agent die JVM aus?

Der Start dauert etwas länger (Instrumentierung), im laufenden Betrieb ist der Overhead gering. Sind die Trace- und Metrik-Exporter auf none gesetzt, werden nur Log-Records exportiert.

Wo bekomme ich den Ingest-Key?

In der App unter API-Keys → Neuer API-Key → Typ „Log-Ingest“. Der Key beginnt mit ue_ingest_ und wird nur einmal angezeigt. Management-Keys (ue_live_) lehnt der Ingest-Endpoint ab.

Wie sehe ich, ob Logs ankommen?

Öffne Logs in der App, wähl den Zeitraum „15 Min.“ und such nach service:=<your service>. Neue Zeilen sind nach etwa einer Sekunde durchsuchbar; Live-Tail zeigt sie mit etwa 6 s Verzögerung.