Deklarácia viacerých loggerov jednej triedy v `slf4j`

Učebnicová deklarácia loggera v slf4j je:

package sk.upjs.ics.novotnyr;

public class Service {
    private Logger logger = LoggerFactory.getLogger(Service.class);

    /*...*/
}

Čo ak chcete mať viacero loggerov v triede? Napr. jeden všeobecný, jeden pre prichádzajúce dáta a jeden pre odchádzajúce dáta?

Loggery by mali mať názvy zodpovedajúce konvencii slf4j: bodka oddeľuje jednotlivé zložky:

sk.upjs.ics.novotnyr.Service
sk.upjs.ics.novotnyr.Service.READ
sk.upjs.ics.novotnyr.Service.WRITE

Prvý nápad bol:

private Logger readLog = LoggerFactory.getLogger(Service.class + ".READ");

ale beda, nič sa nedialo!

Problém je v konštrukcii názvu loggera. Stačí si overiť

    System.out.println(Service.class + ".READ");

Výsledok je… oh!

class sk.upjs.ics.novotnyr.Service.READ

Všimnite si reťazec class, ktorý spôsobí, že hierarchia loggerov nebude fungovať. Ak nastavíte na rodičovskom loggeri (napr. na loggeri sk.upjs.ics.novotnyr level DEBUG), logger class sk.upjs.ics.novotnyr.Service.READ nie je jeho dieťaťom.

Druhý nápad bol

private Logger logger = LoggerFactory.getLogger(getClass() + ".READ");

Ten vedie k rovnakému čudesnému správaniu.

Správna verzia je:

private Logger logger = LoggerFactory.getLogger(getClass().getName() + ".READ");

Až teraz sa názov triedy vykonštruuje správne.

Najhoršie na tomto probléme sú implicitné očakávania o správaní metódy toString(), a následné extremne zložité ladenie skutočných hierarchií loggerov.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *