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.
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.jarservice.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.
logging.structured.format.console=ecs
logging.structured.ecs.service.name=orders
logging.structured.ecs.service.environment=prodOption 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.
<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.
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.logFelder, die du bekommst
Diese Felder erscheinen im Panel „Felder“ und funktionieren in jedem Filter:
service/service.name,envlevel/severity_textlogger_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
JsonTemplateLayoutmit dem TemplateEcsLayout.json.
FAQ
Welche Option soll ich nehmen?
Bremst der OpenTelemetry Agent die JVM aus?
none gesetzt, werden nur Log-Records exportiert.Wo bekomme ich den Ingest-Key?
ue_ingest_ und wird nur einmal angezeigt. Management-Keys (ue_live_) lehnt der Ingest-Endpoint ab.Wie sehe ich, ob Logs ankommen?
service:=<your service>. Neue Zeilen sind nach etwa einer Sekunde durchsuchbar; Live-Tail zeigt sie mit etwa 6 s Verzögerung.