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.