Startseite » Blog DE » Logging und Monitoring in Spring Boot – Schritt für Schritt Anleitung

Logging und Monitoring in Spring Boot – Schritt für Schritt Anleitung

Eine Spring-Boot-Anwendung ohne Logging und Monitoring ist wie Autofahren ohne Tacho und Rückspiegel – man sieht nicht, was passiert, bis es zu spät ist. Eine gute Logging- und Monitoring-Strategie hilft nicht nur bei der Fehlersuche, sondern auch bei der Sicherheit und Performance-Optimierung. In diesem Artikel werfen wir einen praxisnahen Blick auf Logging und Monitoring in Spring Boot, inklusive Codebeispiele, bewährter Tools und Best Practices.

Logging in Spring Boot

1. Logging in Spring Boot: Die Basics

Spring Boot setzt standardmäßig auf SLF4J mit Logback als Logging-Framework. Das ist eine solide Basis, die man nach Bedarf erweitern kann.

1.1. Logback konfigurieren

Spring Boot bringt eine Standardkonfiguration mit, aber wir können diese anpassen, indem wir eine logback-spring.xml Datei im resources-Verzeichnis anlegen:

<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

Damit wird sichergestellt, dass Logs ordentlich formatiert in der Konsole landen.

1.2. Logging in der Anwendung nutzen

Nun können wir in unseren Services Logs schreiben:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class UserService {
    private static final Logger logger = LoggerFactory.getLogger(UserService.class);
    public void processUser(String userId) {
        logger.info("Starte Verarbeitung für Benutzer: {}", userId);
        try {
            // Simulierte Verarbeitung
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            logger.error("Fehler bei der Verarbeitung von Benutzer {}: {}", userId, e.getMessage());
        }
    }
}

1.3. Log-Level dynamisch anpassen

Manchmal möchte man den Log-Level ändern, ohne den Code zu ändern. Das geht einfach über die application.properties:

logging.level.org.springframework=DEBUG
logging.level.com.example=INFO

Oder zur Laufzeit per Actuator-Endpoint:

curl -X POST localhost:8080/actuator/loggers/com.example -H "Content-Type: application/json" -d '{"configuredLevel": "DEBUG"}'
Logs with JSON

2. Strukturierte Logs mit JSON

Normale Textlogs sind schwer zu analysieren. Eine bessere Alternative ist das Logging im JSON-Format, das besonders für zentralisierte Logging-Systeme wie Elasticsearch, Logstash und Kibana (ELK) nützlich ist.

2.1. JSON-Logging mit Logstash-Encoder

Erweitere die pom.xml um das Logstash-Encoder-Dependency. Die aktuellste Version findest du hier:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.0</version>
</dependency>

Und passe die logback-spring.xml an:

<appender name="LOGSTASH" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/app.log</file>
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"/>
</appender>
<root level="INFO">
    <appender-ref ref="LOGSTASH"/>
</root>

Jetzt werden die Logs als JSON gespeichert – ideal für die Integration mit zentralisierten Logging-Systemen.

3. Monitoring in Spring Boot: Die Essentials

Logging zeigt uns, was bereits passiert ist – Monitoring hilft uns, Probleme in Echtzeit zu erkennen. Spring Boot bietet mit Spring Boot Actuator eine mächtige Monitoring-Lösung.

3.1. Warum nicht alle Actuators freigegeben werden sollten

Spring Boot Actuator bietet eine Vielzahl von Endpunkten, die wertvolle Informationen über die Anwendung liefern. Allerdings sollten nicht alle Endpunkte öffentlich zugänglich sein, da sie sensible Daten enthalten können.

Risiken bei ungeschützten Actuator-Endpunkten:

  • Information Disclosure: Angreifer können interne Details wie Umgebungsvariablen, Metriken oder Konfigurationswerte auslesen.

  • Manipulation: Einige Endpunkte (z. B. /actuator/loggers) ermöglichen das Ändern von Log-Leveln, was zur Verschleierung von Angriffsspuren genutzt werden kann.

  • Denial of Service (DoS): Der /actuator/heapdump-Endpunkt kann große Speicher-Dumps liefern, die bei unkontrollierter Nutzung zu Speicherproblemen führen können.

Best Practices für sichere Actuator-Nutzung:

  • Nur notwendige Endpunkte freigeben (management.endpoints.web.exposure.include=health,info,metrics)

  • Actuator-Endpunkte mit Basic Auth oder OAuth 2.0 absichern

  • Zugriff auf interne Netzwerke beschränken

3.2. Prometheus für Metriken nutzen

Ein Logging-System reicht nicht aus – wir brauchen auch Metriken. Prometheus ist hier eine beliebte Wahl.

Installiere das Micrometer-Prometheus-Dependency:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

Füge in application.properties hinzu:

management.metrics.export.prometheus.enabled=true
management.endpoints.web.exposure.include=prometheus

Jetzt liefert http://localhost:8080/actuator/prometheus alle Metriken, die Prometheus verarbeiten kann.

Log4j Vulnerability

4. Log4j-Schwachstelle vermeiden

Die Log4j-Schwachstelle (CVE-2021-44228) erlaubt Remote Code Execution (RCE) durch manipulierte Log-Eingaben. Angreifer können Schadcode einschleusen und ausführen. Wenn du mehr Interesse am Thema IT-Sicherheit hast, dann schau dir unseren Blog an.

4.1. Auswirkungen der Log4j-Schwachstelle

  • Remote Code Execution (RCE): Angreifer können bösartigen Code ausführen.
  • Datenlecks: Sensible Informationen können aus den Logs exfiltriert werden.
  • Systemübernahme: Angreifer erhalten möglicherweise vollständige Kontrolle über das System.

4.2. Schutzmaßnahmen

  • Spring Boot auf Logback oder SLF4J umstellen: Log4j durch sicherere Alternativen ersetzen.
  • Aktuelle Log4j-Version verwenden: Falls Log4j benötigt wird, mindestens Version 2.17.1 einsetzen.
  • JNDI Lookup deaktivieren: log4j2.formatMsgNoLookups=true in den Systemvariablen setzen.

Fazit

Logging und Monitoring sind essenziell für eine stabile Spring-Boot-Anwendung. Mit Logback, Actuator, Prometheus und ELK haben wir mächtige Werkzeuge zur Hand. Wer Logs und Metriken klug kombiniert, kann Fehler schneller finden, Angriffe erkennen und die Performance optimieren.

💡 Tipp: Automatisiere dein Logging und Monitoring mit Docker und Kubernetes für skalierbare Lösungen!

Du solltest immer darauf achten, dass deine Applikationen sicher sind. Eine Schwachstelle wie die Log4j-Schwachstelle kann jederzeit auftauchen. Daher halte immer deine Abhängigkeiten und die Spring-Boot Version aktuell. Wir empfehlen dir professionelle Unterstützung zu holen z. B. bei der Durchführung eines Penetrationstests oder auch eine IT-Sicherheitsberatung. Schaue auf unserem Marktplatz für Informations-, IT- und Cybersicherheit vorbei und finde einen passenden Anbieter, der dir dabei helfen kann.

Nach oben scrollen
WordPress Cookie Plugin von Real Cookie Banner