# AP04 – Logging-Adapter (SLF4J-Fassade + Log4j2-Bindung) ## Ziel Sicherstellen, dass im gesamten Quellcode **nur noch SLF4J-Typen importiert werden** (`org.slf4j.Logger`, `org.slf4j.LoggerFactory`), außer in einem dedizierten **Logging-Adapter** und im **Bootstrap**. Die konkrete Log4j2-Bindung darf nur an diesen zwei Stellen sichtbar sein, wie von `technik-und-architektur.md` gefordert. ## Voraussetzungen - AP03 (Paketstruktur vorhanden) ## Scope IN - Alle Stellen im Produktivcode, die `org.apache.logging.log4j.LogManager` oder `org.apache.logging.log4j.Logger` importieren, werden umgestellt auf: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(MyClass.class); ``` - Anlage einer minimalen `log4j2.xml` in `src/main/resources/`: - Console-Appender (StdErr) - File-Appender mit Zielpfad, der später (AP07) durch den Bootstrap überschrieben wird; für M1 genügt ein Default-Pfad `logs/asv-format-validator.log` - Log-Level `INFO` für `de.gecheckt.asv`, `WARN` für alles andere - Deutsche Log-Texte bleiben auf Deutsch - Anlage eines `LoggingConfigurator` oder ähnlich im Paket `adapter.out.logging`, der Log4j2 **programmatisch** konfigurieren kann (Zielpfad der Log-Datei setzbar). Für M1 reicht eine Klasse mit einer Methode `void configureLogFile(Path logFile)`, die noch keine tiefe Magie macht, aber das Interface definiert. - Architekturcheck: per `grep` sicherstellen, dass außerhalb von `adapter.out.logging` und `bootstrap` keine `org.apache.logging.log4j.*`-Imports mehr existieren. ## Scope OUT - tatsächliche dynamische Log-Datei-Umleitung pro Lauf (das ist AP07) - Log-Rotation, Log-Compression, eigene Appender-Klassen - Logging-Policies, Log-Level pro Klasse - Umbau der Log-Nachrichten selbst (Wortlaut, Formatierung) ## Schritte 1. Branch `m1/ap04-logging-adapter` 2. In allen Produktiv-Klassen außer `adapter.out.logging` und `bootstrap`: Log4j2-Imports durch SLF4J-Imports ersetzen 3. Minimale `log4j2.xml` in `src/main/resources/` anlegen 4. `LoggingConfigurator` in `adapter.out.logging` anlegen (Skelett) 5. `mvn clean verify` laufen lassen, muss grün sein 6. `grep -rn "org.apache.logging.log4j" src/main/java/ | grep -v "adapter/out/logging\|bootstrap"` muss **leer** sein 7. Commit `M1-AP04: Logging-Adapter, SLF4J-Fassade etabliert` 8. Abschlussbericht schreiben ## Abnahmekriterien - kein Import von `org.apache.logging.log4j.*` außerhalb von `adapter.out.logging` und `bootstrap` (Grep-Nachweis im Bericht) - `log4j2.xml` in `src/main/resources/` vorhanden - `LoggingConfigurator`-Klasse in `adapter.out.logging` vorhanden (mindestens Skelett) - `mvn clean verify` ist grün - alle bestehenden Tests laufen weiterhin (SLF4J ist API-kompatibel; falls Tests wegen Logger-Mocks brechen, müssen sie angepasst werden — dann im Bericht dokumentieren) - Abschlussbericht liegt vor ## Rest-Risiken und offene Punkte - Falls bestehende Tests Log4j2-Logger mocken: Anpassung nötig. Im Zweifel Logger-Mocks entfernen, Logging ist keine Testlogik. - `log4j2.xml` hat in M1 einen statischen Dateipfad. Der dynamische Pfad pro Lauf kommt erst in AP07. ## Bericht `docs/arbeitspakete/m1/berichte/AP04-bericht.md` nach `templates/ap-bericht.md`.