Sprievodca prihlásením

1. Prehľad

Logback je jedným z najbežnejšie používaných rámcov protokolovania v komunite Java. Je to náhrada za predchodcu Log4j. Program Logback ponúka rýchlejšiu implementáciu ako program Log4j, poskytuje viac možností konfigurácie a väčšiu flexibilitu pri archivácii starých súborov denníka.

Tento úvod predstaví architektúru Logback a ukáže vám, ako ju môžete použiť na zlepšenie svojich aplikácií.

2. Architektúra prihlásenia

Architektúru Logback tvoria tri triedy; Logger, Dodatoka Rozloženie.

Záznamník je kontext pre správy protokolu. Toto je trieda, s ktorou aplikácie interagujú, aby vytvorili správy protokolu.

Dodatky umiestňujú logovacie správy do ich konečných cieľov. Záznamník môže mať viac ako jedného prílohy. Spravidla si o Appenders myslíme, že sú pripojené k textovým súborom, ale Logback je oveľa účinnejší.

Rozloženie pripravuje správy na výstup. Logback podporuje vytváranie vlastných tried na formátovanie správ, ako aj rozsiahle možnosti konfigurácie pre tie existujúce.

3. Inštalácia

3.1. Maven závislosť

Program Logback používa ako svoje natívne rozhranie Simple Logging Facade for Java (SLF4J). Predtým, ako začneme protokolovať správy, musíme do našich pridať Logback a Slf4j pom.xml:

 ch.qos.logback logback-core 1.2.3 org.slf4j test slf4j-api 1.7.30 

Maven Central má najnovšiu verziu Logback Core a najnovšiu verziu slf4j-api.

3.2. Classpath

Prihlásenie tiež vyžaduje logback-classic.jar na ceste triedy za behu.

Toto pridáme k pom.xml ako závislosť od testu:

 ch.qos.logback logback-classic 1.2.3 

4. Základný príklad a konfigurácia

Začnime rýchlym príkladom použitia aplikácie Logback v aplikácii.

Najprv potrebujeme konfiguračný súbor. Vytvoríme textový súbor s názvom logback.xml a umiestnime to niekde do našej triedy:

   % d {HH: mm: ss.SSS} [% vlákno]% -5úroveň% logger {36} -% msg% n 

Ďalej potrebujeme jednoduchú triedu s a hlavný metóda:

verejná trieda Príklad {súkromná statická konečná Logger logger = LoggerFactory.getLogger (Example.class); public static void main (String [] args) {logger.info ("Vzorový denník z {}", Example.class.getSimpleName ()); }}

Táto trieda vytvára Logger a hovory Info() vygenerovať správu protokolu.

Keď bežíme Príklad vidíme našu správu prihlásenú do konzoly:

20: 34: 22.136 [main] INFO Príklad - Príklad záznamu z príkladu

Je ľahké pochopiť, prečo je Logback tak populárny; sme v prevádzke behom niekoľkých minút.

Táto konfigurácia a kód nám poskytujú niekoľko rád, ako to funguje.

  1. Máme appender menovaný STDOUT ktorý odkazuje na názov triedy ConsoleAppender.
  2. Existuje vzor, ​​ktorý popisuje formát našej logovacej správy.
  3. Náš kód vytvára a Logger a odovzdali sme mu správu prostredníctvom Info() metóda.

Teraz, keď rozumieme základom, sa pozrime bližšie.

5. Logger Kontexty

5.1. Vytvorenie kontextu

Na prihlásenie správy do Logbacku sme inicializovali a Logger od SLF4J alebo Logback:

private static final Logger logger = LoggerFactory.getLogger (Example.class); 

A potom to použil:

logger.info ("Vzorový denník z {}", Example.class.getSimpleName ()); 

Toto je náš kontext protokolovania. Keď sme ho vytvorili, prešli sme LoggerFactory naša trieda. Toto dáva Logger meno (existuje aj preťaženie, ktoré akceptuje a Reťazec).

Kontexty protokolovania existujú v hierarchii, ktorá sa veľmi podobá hierarchii objektov Java:

  1. Drevorubač je predok, keď jeho meno, za ktorým nasleduje bodka, predponu nad menom jeho potomka
  2. Drevorubač je rodič, ak medzi ním a dieťaťom nie sú žiadni predkovia

Napríklad Príklad trieda uvedená nižšie je v com.baeldung.logback balíček. Je tu iná pomenovaná trieda ExampleAppender v com.baeldung.logback.appenders balíček.

Záznamník aplikácie ExampleAppender je dieťaťom Ukážkový záznamník.

Všetky záznamníky sú potomkami preddefinovaného koreňového záznamníka.

A LoggerÚroveň, ktoré je možné nastaviť buď pomocou konfigurácie alebo pomocou Logger.setLevel (). Nastavenie úrovne v kóde prepíše konfiguračné súbory.

Možné úrovne sú, v poradí podľa priority: SLEDOVAŤ, DEBUGOVAŤ, INFO, VAROVAŤ a CHYBA.Každá úroveň má zodpovedajúcu metódu, ktorú používame na prihlásenie správy na tejto úrovni.

Ak Loggeru nie je explicitne priradená úroveň, dedí úroveň svojho najbližšieho predka. Koreňový záznamník je predvolene nastavený na DEBUG. Uvidíme, ako to prekonať nižšie.

5.2. Pomocou kontextu

Vytvorme ukážkový program, ktorý demonštruje použitie kontextu v rámci hierarchií protokolovania:

ch.qos.logback.classic.Logger parentLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger ("com.baeldung.logback"); parentLogger.setLevel (Level.INFO); Logger childlogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger ("com.baeldung.logback.tests"); parentLogger.warn ("Táto správa je zaznamenaná, pretože VAROVANIE> INFO."); parentLogger.debug ("Táto správa nie je prihlásená, pretože DEBUG <INFO."); childlogger.info ("INFO == INFO"); childlogger.debug ("DEBUG <INFO"); 

Keď to spustíme, zobrazia sa tieto správy:

20: 31: 29,586 [main] WARN com.baeldung.logback - Táto správa sa zaznamená, pretože WARN> INFO. 20: 31: 29,594 [hlavné] INFO com.baeldung.logback.tests - INFO == INFO

Začíname načítaním a Logger menovaný com.baeldung.logback a hodí ho do a ch.qos.logback.classic.Logger.

Na nastavenie úrovne v nasledujúcom príkaze je potrebný kontext Logback; všimnite si, že abstraktný logger SLF4J sa neimplementuje setLevel ().

Nastavili sme úroveň nášho kontextu na INFO;potom vytvoríme ďalší logger s názvom com.baeldung.logback.testy.

Protokolujeme dve správy s každým kontextom, aby sme demonštrovali hierarchiu. Logback prihlási POZOR, a INFO správy a filtruje DEBUGspráv.

Teraz použijeme koreňový záznamník:

ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger ("com.baeldung.logback"); logger.debug („Ahoj!“); Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger (org.slf4j.Logger.ROOT_LOGGER_NAME); logger.debug ("Táto správa sa zaznamenáva, pretože DEBUG == DEBUG."); rootLogger.setLevel (Level.ERROR); logger.warn ("Táto správa sa neprihlasuje, pretože WARN <CHYBA."); logger.error ("Toto je prihlásené."); 

Tieto správy sa zobrazujú, keď vykonáme tento úryvok:

20: 44: 44.241 [main] DEBUG com.baeldung.logback - Ahoj! 20: 44: 44.243 [main] DEBUG com.baeldung.logback - táto správa sa zaznamená, pretože DEBUG == DEBUG. 20: 44: 44.243 [main] CHYBA com.baeldung.logback - Toto je prihlásené. 

Na záver sme začali s Logger kontext a tlačené a DEBUG správa.

Potom sme načítali koreňový záznamník pomocou jeho staticky definovaného názvu a nastavili jeho úroveň na CHYBA.

A nakoniec sme demonštrovali, že Logback v skutočnosti filtruje akékoľvek tvrdenia menej ako chyby.

5.3. Parametrizované správy

Na rozdiel od správ vo vyššie uvedených ukážkových úryvkoch je potrebné pridať najužitočnejšie správy denníka Struny. To znamená pridelenie pamäte, serializáciu objektov, zreťazenie Struny, a potenciálne čistenie odpadu neskôr.

Zvážte nasledujúcu správu:

log.debug ("Aktuálny počet je" + počet); 

Náklady na zostavenie správy, bez ohľadu na to, či ju Logger prihlási, alebo nie, nám vznikajú.

Logback ponúka alternatívu so svojimi parametrizovanými správami:

log.debug ("Aktuálny počet je {}", počet); 

Závesy {} prijmú akékoľvek Objekt a používa jeho natiahnuť() metóda na zostavenie správy až po overení, či je požadovaná správa protokolu.

Vyskúšajme niekoľko rôznych parametrov:

String message = "Toto je reťazec"; Celé číslo nula = 0; try {logger.debug ("Protokolujúca správa: {}", správa); logger.debug ("Vydelíme {} na {}", 42, nula); int výsledok = 42 / nula; } catch (Výnimka e) {logger.error ("Chyba pri delení {} číslom {}", 42, nula, e); } 

Tento úryvok prinesie:

21: 32: 10.311 [main] DEBUG com.baeldung.logback.LogbackTests - Protokolovacia správa: Toto je reťazec 21: 32: 10.316 [main] DEBUG com.baeldung.logback.LogbackTests - delíme 42 na 0 21:32 : 10.316 [main] ERROR com.baeldung.logback.LogbackTests - Chyba pri delení 42 0 java.lang.ArithmeticException: / nulou na com.baeldung.logback.LogbackTests.givenParameters_ValuesLogged (LogbackTests.java:64) ... 

Vidíme, ako a Reťazec, an int, a an Celé číslo je možné odovzdať ako parametre.

Tiež, keď Výnimka je odovzdaný ako posledný argument metóde protokolovania, Logback za nás vytlačí sledovanie zásobníka.

6. Podrobná konfigurácia

V predchádzajúcich príkladoch sme pomocou 11-riadkového konfiguračného súboru, ktorý sme vytvorili v časti 4, tlačili správy denníka do konzoly. Toto je predvolené správanie Logbacku; ak nemôže nájsť konfiguračný súbor, vytvorí ConsoleAppender a spojí ho s koreňovým záznamníkom.

6.1. Vyhľadanie informácií o konfigurácii

Konfiguračný súbor je možné umiestniť do cesty triedy a pomenovať ho buď logback.xml alebo logback-test.xml.

Tu je príklad, ako sa Logback pokúsi nájsť konfiguračné údaje:

  1. Vyhľadajte pomenované súbory logback-test.xml, logback.groovy,alebo logback.xml v triede, v tomto poradí.
  2. Ak knižnica nenájde tieto súbory, pokúsi sa použiť Java ServiceLoader nájsť realizátora com.qos.logback.classic.spi.Configurator.
  3. Nakonfigurujte sa na protokolovanie výstupu priamo do konzoly

Poznámka: Aktuálna verzia aplikácie Logback nepodporuje konfiguráciu Groovy z dôvodu neexistencie verzie Groovy kompatibilnej s Java 9.

6.2. Základná konfigurácia

Pozrime sa bližšie na našu príkladnú konfiguráciu.

Celý súbor je v priečinku značky.

Vidíme značku, ktorá deklaruje znak Dodatok typu ConsoleAppendera pomenuje to STDOUT. V tejto značke je vložený kódovač. Má vzor s tým, ako vyzerá štýl šprintu únikové kódy:

  % d {HH: mm: ss.SSS} [% thread]% -5level% logger {36} -% msg% n 

Napokon vidíme a koreň značka. Táto značka nastavuje koreňový záznamník na DEBUG a spája jeho výstup s Dodatok menovaný STDOUT:

6.3. Riešenie problémov s konfiguráciou

Konfiguračné súbory protokolu Logback sa môžu komplikovať, takže existuje niekoľko vstavaných mechanizmov na riešenie problémov.

Ak chcete zobraziť informácie o ladení, keď Logback spracuje konfiguráciu, môžete zapnúť protokolovanie ladenia:

 ... 

Protokol Logback vytlačí informácie o stave do konzoly pri spracovaní konfigurácie:

23: 54: 23 040 | -INFO v ch.qos.logback.classic.LoggerContext [predvolené] - nájdený zdroj [logback-test.xml] v [súbor: / Users / egoebelbecker / ideaProjects / logback-guide / out / test / resources / logback-test.xml] 23: 54: 23 230 | -INFO v ch.qos.logback.core.joran.action.AppenderAction - asi na vytvorenie inštancie appender typu [ch.qos.logback.core.ConsoleAppender] 23: 54: 23 236 | -INFO v ch.qos.logback.core.joran.action.AppenderAction - pomenovanie pripájača ako [STDOUT] 23: 54: 23 247 | -INFO v ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Za predpokladu predvoleného typu [ch.qos.logback.classic.encoder.PatternLayoutEncoder] pre vlastnosť [encoder] 23: 54: 23 308 | -INFO v ch.qos.logback.classic.joran.action.RootLoggerAction - nastavenie úrovne ROOT loggeru na DEBUG 23: 54: 23 309 | -INFO v ch.qos.logback.core.joran.action.AppenderRefAction - pripojenie appenderu s názvom [STDOUT] k Loggeru [ROOT] 23: 54: 23 310 | -INFO v ch.qos.logback. classic.joran.action.ConfigurationAction - koniec konfigurácie. 23: 54: 23,313 | -INFO v [chránené e-mailom] - registrácia aktuálnej konfigurácie ako bezpečného záložného bodu

Ak sa pri analýze konfiguračného súboru vyskytnú varovania alebo chyby, program Logback zapíše do konzoly stavové správy.

Existuje druhý mechanizmus na tlač informácií o stave:

  ... 

The StatusListener zachytáva stavové správy a tlačí ich počas konfigurácie a počas behu programu.

Výstup zo všetkých konfiguračných súborov sa vytlačí, čo je užitočné pri vyhľadávaní „nečestných“ konfiguračných súborov na ceste triedy.

6.4. Automatické načítanie konfigurácie

Opätovné načítanie konfigurácie protokolovania počas behu aplikácie je výkonný nástroj na riešenie problémov. Prihlásenie umožňuje toto pomocou skenovať parameter:

 ... 

Predvolené správanie je skenovať zmeny v konfiguračnom súbore každých 60 sekúnd. Upravte tento interval pridaním scanPeriod:

 ... 

Môžeme určiť hodnoty v milisekundách, sekundách, minútach alebo hodinách.

6.5. Úpravy Drevorubači

V našom vzorovom súbore vyššie sme nastavili úroveň koreňového záznamníka a priradili ho ku konzole Dodatok.

Môžeme nastaviť úroveň pre akýkoľvek logger:

   % d {HH: mm: ss.SSS} [% vlákno]% -5úroveň% logger {36} -% msg% n 

Pridajme to do našej triedy a spustime tento kód:

Logger foobar = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger ("com.baeldung.foobar"); Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger ("com.baeldung.logback"); Logger testslogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger ("com.baeldung.logback.tests"); foobar.debug ("Toto je prihlásené z foobar"); logger.debug ("Toto sa neprihlasuje z loggeru"); logger.info ("Toto je prihlásené z loggeru"); testslogger.info ("Toto sa neprihlasuje z testov"); testslogger.warn ("Toto je prihlásené z testov"); 

Vidíme tento výstup:

00: 29: 51.787 [main] DEBUG com.baeldung.foobar - Toto je prihlásené z foobar 00: 29: 51.789 [main] INFO com.baeldung.logback - Toto je prihlásené z loggeru 00: 29: 51.789 [main] WARN com .baeldung.logback.tests - toto sa zaznamenáva z testov 

Ak programovo nenastavíte úroveň našich záznamníkov, konfigurácia ich nastaví; com.baeldung.foobar dedí DEBUG z koreňového záznamníka.

Drevorubačitiež dediť appender-ref z koreňového záznamníka. Ako uvidíme ďalej, môžeme to prepísať.

6.6. Variabilná substitúcia

Konfiguračné súbory Logback podporujú premenné. Premenné definujeme vnútri konfiguračného skriptu alebo externe. Premennú je možné zadať kedykoľvek v konfiguračnom skripte namiesto hodnoty.

Napríklad tu je konfigurácia pre a FileAppender:

  $ {LOG_DIR} /tests.log true% -4relative [% thread]% -5level% logger {35} -% msg% n 

V hornej časti konfigurácie sme deklarovali a nehnuteľnosťmenovaný LOG_DIR.Potom sme ho použili ako súčasť cesty k súboru vo vnútri súboru appender definícia.

Vlastnosti sú deklarované v a značka v konfiguračných skriptoch. Dostupné sú ale aj z externých zdrojov, ako sú napríklad vlastnosti systému. Mohli by sme vynechať nehnuteľnosť deklarácia v tomto príklade a nastavte hodnotu LOG_DIR na príkazovom riadku:

$ java -DLOG_DIR = / var / log / aplikácia com.baeldung.logback.LogbackTests

Hodnotu nehnuteľnosti určíme pomocou $ {propertyname}. Logback implementuje premenné ako náhradu textu. K premennej zámene môže dôjsť v ktoromkoľvek bode konfiguračného súboru, kde je možné určiť hodnotu.

7. Dodatky

Drevorubači prejsť Prihlasovacie udalosti do Dodatky.Dodatky urobte skutočnú prácu s ťažbou dreva. O logovaní si zvyčajne myslíme, že ide o niečo, čo ide do súboru alebo na konzolu, ale Logback dokáže oveľa viac. Logback-core poskytuje niekoľko užitočných príloh.

7.1. ConsoleAppender

Videli sme ConsoleAppenderuž v akcii. Napriek svojmu názvu ConsoleAppender pridáva správy k System.outalebo System.err.

Používa OutputStreamWriter na vyrovnanie I / O, takže to smeruje na System.err nemá za následok zápis bez vyrovnávacej pamäte.

7.2. FileAppender

FileAppenderpridá správy do súboru. Podporuje širokú škálu konfiguračných parametrov. Pridajme k našej základnej konfigurácii doplnok súboru:

    % d {HH: mm: ss.SSS} [% vlákno]% -5level% logger {36} -% msg% n tests.log true% -4relative [% thread]% -5level% logger {35} -% msg % n 

The FileAppender je nakonfigurovaný s názvom súboru cez . The značka dáva pokyn Dodatoknamiesto existujúceho súboru ho pridať. Ak test spustíme niekoľkokrát, zistíme, že výstup protokolovania je pripojený k rovnakému súboru.

Ak znovu spustíme test zhora, správy z com.baeldung.logback.testy choďte na konzolu aj do súboru s názvom tests.log. Potomok protokolovača zdedí asociáciu koreňového protokolovača s ConsoleAppender s jeho združením s FileAppender. Prílohy sú kumulatívne.

Toto správanie môžeme prepísať:

Nastavenie aditívnosť do nepravdivézakáže predvolené správanie. Skúšky sa neprihlási do konzoly a ani žiaden z jej potomkov.

7.3. RollingFileAppender

Pripojenie správ protokolu k rovnakému súboru často nie je správaním, ktoré potrebujeme. Chceme, aby sa súbory „otáčali“ na základe času, veľkosti súboru denníka alebo ich kombinácie.

Na to máme RollingFileAppender:

  $ {LOG_FILE} .log $ {LOG_FILE}.% D {rrrr-MM-dd} .gz 30 3 GB% -4relative [% thread]% -5level% logger {35} -% msg% n 

A RollingFileAppenderRollingPolicy.V tejto ukážkovej konfigurácii vidíme a TimeBasedRollingPolicy.

Podobne ako v FileAppender, nakonfigurovali sme tohto prílohu s názvom súboru. Vyhlásili sme vlastnosť a použili sme ju na to, pretože znova použijeme názov súboru uvedený nižšie.

Definujeme a fileNamePattern vnútri RollingPolicy.Tento vzor nedefinuje iba názov súborov, ale aj to, ako často sa majú súbory premiestňovať. TimeBasedRollingPolicyskúma vzor a hodí sa v najjemnejšie definovanom období.

Napríklad:

   $ {LOG_DIR} / $ {LOG_FILE} .log $ {LOG_DIR} /% d {rrrr / MM} / $ {LOG_FILE} .gz 3 GB 

Aktívny súbor denníka je / var / logs / application / LogFile.Tento súbor sa prenáša na začiatku každého mesiaca na / Aktuálny rok / Aktuálny mesiac / LogFile.gza RollingFileAppender vytváranový aktívny súbor.

Keď celková veľkosť archivovaných súborov dosiahne 3 GB, RollingFileAppendervymaže archívy „od prvého do prvého“.

Existujú kódy na týždeň, hodinu, minútu, sekundu a dokonca aj milisekundy. Logback má tu odkaz.

RollingFileAppendermá tiež zabudovanú podporu pre kompresiu súborov. Komprimuje naše rolované súbory, pretože ich pomenoval LogFile.gz.

TimeBasedPolicynie je naša jediná možnosť rolovania súborov. Logback tiež ponúka SizeAndTimeBasedRollingPolicy,ktoré sa budú valiť na základe aktuálnej veľkosti logovacieho súboru a času. Ponúka tiež a FixedWindowRollingPolicyktorý roluje názvy protokolových súborov pri každom spustení loggeru.

Môžeme napísať aj svoj vlastný RollingPolicy.

7.4. Vlastné dodatky

Môžeme vytvoriť vlastné pripájače rozšírením jednej zo základných tried pripájačov Logback. Máme tu návod na vytváranie vlastných príloh.

8. Rozloženia

Rozloženia formátovať denníkové správy. Rovnako ako zvyšok Logbacku, Rozloženiasú rozšíriteľné a môžeme si vytvoriť svoj vlastný. Avšak predvolené PatternLayout ponúka to, čo väčšina aplikácií potrebuje, a potom niektoré.

Použili sme PatternLayout vo všetkých našich doterajších príkladoch:

 % d {HH: mm: ss.SSS} [% vlákno]% -5úroveň% logger {36} -% msg% n 

Tento konfiguračný skript obsahuje konfiguráciu pre PatternLayoutEncoder.Míňame okolo Kódovač k nášmu Dodatok,a tento kódovač používa PatternLayout na formátovanie správ.

Text v značka definuje, ako sa formátujú správy protokolu. PatternLayout implementuje širokú škálu konverzných slov a modifikátorov formátu na vytváranie vzorov.

Poďme si to rozobrať. PatternLayout rozpoznáva konverzné slová s%, takže konverzie v našom vzore generujú:

  • % d {HH: mm: ss.SSS} - časová značka s hodinami, minútami, sekundami a milisekundami
  • [% vlákno] - názov vlákna, ktoré generuje správu, obklopený hranatými zátvorkami
  • % - 5 úrovní - úroveň záznamu udalosti, polstrovaná na 5 znakov
  • % logér {36} - meno záznamníka, skrátené na 35 znakov
  • % správa% n - správy protokolu, za ktorými nasleduje znak oddeľovača riadkov závislý od platformy

Vidíme teda správy podobné tomuto:

21: 32: 10.311 [main] DEBUG com.baeldung.logback.LogbackTests - protokolová správa: Toto je reťazec

Vyčerpávajúci zoznam konverzných slov a modifikátorov formátu nájdete tu.

9. Záver

V tomto rozsiahlom sprievodcovi sme sa venovali základom používania aplikácie Logback v aplikácii.

Pozreli sme sa na tri hlavné komponenty v architektúre Logbacku: protokolovače, prílohy a rozloženie. Program Logback's má výkonné konfiguračné skripty, pomocou ktorých sme manipulovali s komponentmi na filtrovanie a formátovanie správ. Pozreli sme sa tiež na dva najbežnejšie používané doplnky súborov na vytváranie, presunutie, usporiadanie a kompresiu súborov denníka.

Útržky kódu ako obvykle nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found