API zapisivanja Java 9 platforme

1. Uvod

U ovom uputstvu istražit ćemo novo uvedeni Logging API u Javi 9 i implementirati neke primjere kako bismo pokrili najčešće slučajeve.

Ovaj je API uveden u Javi na pružiti zajednički mehanizam za rukovanje svim zapisnicima platforme i izlaganje sučelja usluge koje knjižnice i aplikacije mogu prilagoditi. Na taj način, dnevnici JDK platforme mogu koristiti isti okvir zapisivanja kao i aplikacija, a ovisnosti o projektu mogu se smanjiti.

2. Izrada prilagođene implementacije

U ovom ćemo odjeljku prikazati glavne klase Logging API-a koje moramo implementirati za stvaranje novog zapisnika. Učinit ćemo to primjenom jednostavnog zapisnika koji ispisuje sve zapisnike na konzolu.

2.1. Stvaranje Drvosječa

Glavna klasa koju moramo stvoriti je Drvosječa. Ova klasa mora implementirati System.Logger sučelje i najmanje ove četiri metode:

  • getName (): vraća ime logera. JDK će ga koristiti za stvaranje zapisnika po imenu
  • isLoggable (): označava za koje razine je zapisovač omogućen
  • zapisnik (): to je metoda koja ispisuje zapisnik na bilo koji osnovni sustav koji aplikacija koristi - konzola u našem slučaju. Postoje 2 zapisnik () metode za provedbu, od kojih svaka dobiva različite parametre

Pogledajmo kako će izgledati naša implementacija:

javna klasa ConsoleLogger provodi System.Logger {@Override javni niz getName () {return "ConsoleLogger"; } @Override public boolean isLoggable (razina razine) {return true; } @Override javni void zapisnik (razina razine, paket ResourceBundle, niz poruka, bačena datoteka) {System.out.printf ("ConsoleLogger [% s]:% s -% s% n", razina, poruka, bačena); } @Override javni void log (razina razine, paket ResourceBundle, format niza, objekt ... params) {System.out.printf ("ConsoleLogger [% s]:% s% n", level, MessageFormat.format (format, parametar)); }}

Naše ConsoleLogger razred nadjačava četiri spomenute metode. The getName () metoda vraća a Niz, dok isLoggable () metoda se vraća pravi u svakom slučaju. Konačno, imamo 2 zapisnik () metoda koja izlazi na konzolu.

2.2. Stvaranje LoggerFinder

Jednom kada stvorimo svoj zapisnik, moramo provesti a LoggerFinder koja stvara primjerke našeg ConsoleLogger.

Da bismo to učinili, moramo proširiti apstraktnu klasu System.LoggerFinder i provesti getLogger () metoda:

javna klasa CustomLoggerFinder proširuje System.LoggerFinder {@Override javni System.Logger getLogger (naziv niza, modul modula) {return new ConsoleLogger (); }}

U ovom slučaju, uvijek vraćamo svoje ConsoleLogger.

Napokon, moramo registrirati svoj LoggerFinder kao uslugu kako bi je mogao otkriti JDK. Ako ne pružimo implementaciju, SimpleConsoleLogger će se koristiti prema zadanim postavkama.

Mehanizam koji JDK koristi za učitavanje implementacija je ServiceLoader. Više informacija o tome možete pronaći u ovom vodiču.

Budući da koristimo Javu 9, pakirat ćemo našu klasu u modul i registrirati našu uslugu u module-info.java datoteka:

modul com.baeldung.logging {pruža java.lang.System.LoggerFinder s com.baeldung.logging.CustomLoggerFinder; izvozi com.baeldung.logging; }

Za više informacija o Java modulima pogledajte ovaj drugi vodič.

2.3. Testiranje našeg primjera

Da bismo testirali naš primjer, stvorimo još jedan modul koji će djelovati kao aplikacija. Ovo će sadržavati samo Glavni klasa koja koristi našu implementaciju usluge.

Ova klasa dobit će primjerak našeg ConsoleLogger pozivom na System.getLogger () metoda:

javna klasa MainApp {private static System.Logger LOGGER = System.getLogger ("MainApp"); javna statička void glavna (String [] args) {LOGGER.log (Level.ERROR, "test pogreške"); LOGGER.log (Level.INFO, "info test"); }}

Interno će JDK preuzeti naše CustomLoggerFinder implementaciju i stvoriti primjerak našeg ConsoleLogger.

Nakon toga, kreirajmo modul-info datoteka za ovaj modul:

modul com.baeldung.logging.app {}

U ovom će trenutku struktura našeg projekta izgledati ovako:

├── src │ ├── moduli │ │ ├── com.baeldung.logging │ │ │ ├── com │ │ │ │ └── baeldung │ │ │ │ └── prijava │ │ │ │ ├── ConsoleLogger .java │ │ │ │ └── CustomLoggerFinder.java │ │ │ └── module-info.java │ │ ├── com.baeldung.logging.app │ │ │ ├── com │ │ │ │ └── baeldung │ │ │ │ └── prijava │ │ │ │ └── aplikacija │ │ │ │ └── MainApp.java │ │ │ └── module-info.java └──

Napokon ćemo kompajlirati naša dva modula i smjestit ćemo ih u modovi imenik:

javac --module-path mods -d mods / com.baeldung.logging \ src / modules / com.baeldung.logging / module-info.java \ src / modules / com.baeldung.logging / com / baeldung / logging / * .java javac --module-path mods -d mods / com.baeldung.logging.app \ src / modules / com.baeldung.logging.app / module-info.java \ src / modules / com.baeldung.logging.app /com/baeldung/logging/app/*.java

Napokon, pokrenimo Glavni klasa app modul:

java --module-path mods \ -m com.baeldung.logging.app/com.baeldung.logging.app.MainApp

Ako pogledamo izlaz konzole, možemo vidjeti da se naši zapisnici ispisuju pomoću našeg ConsoleLogger:

ConsoleLogger [GREŠKA]: test pogreške ConsoleLogger [INFO]: test informacija

3. Dodavanje vanjskog okvira za bilježenje

U našem prethodnom primjeru bilježili smo sve svoje poruke na konzolu, što je isto kao i zadani zapisnik. Jedna od najkorisnijih upotreba Logging API-ja u Javi 9 je dopuštanje aplikacijama da usmjeravaju JDK zapisnike u isti okvir za prijavljivanje koji aplikacija koristi, i to ćemo učiniti u ovom odjeljku.

Stvorit ćemo novi modul koji koristi SLF4J kao fasadu za bilježenje i Logback kao okvir za prijavu.

Budući da smo već objasnili osnove u prethodnom odjeljku, sada se možemo usredotočiti na to kako dodati vanjski okvir za evidentiranje.

3.1. Prilagođene implementacije pomoću SLF4J

Prvo ćemo primijeniti još jedan Drvosječa koji će stvoriti novi zapisnik SLF4J za svaku instancu:

javna klasa Slf4jLogger implementira System.Logger {privatni konačni naziv niza; privatni konačni drvosječa; javni Slf4jLogger (ime niza) {this.name = name; logger = LoggerFactory.getLogger (ime); } @Override javni niz getName () {return ime; } // ...}

Primijetite da ovo Drvosječa je org.slf4j.Logger.

Za ostale metode, oslonit ćemo se na implementaciju na instanci zapisnika SLF4J. Stoga, naša Drvosječa bit će omogućeno ako je omogućen zapisovač SLF4J:

@Override public boolean isLoggable (nivo razine) {prekidač (nivo) {case OFF: return false; case TRACE: return logger.isTraceEnabled (); slučaj DEBUG: vratiti logger.isDebugEnabled (); case INFO: return logger.isInfoEnabled (); case UPOZORENJE: vratiti logger.isWarnEnabled (); case ERROR: return logger.isErrorEnabled (); case ALL: default: return true; }}

A metode dnevnika pozvat će odgovarajuću metodu prijavljivanja SLF4J, ovisno o korištenoj razini dnevnika:

@Override public void log (Level level, ResourceBundle bundle, String msg, Throwable bačen) {if (! IsLoggable (level)) {return; } prekidač (razina) {case TRACE: logger.trace (msg, bačen); pauza; slučaj DEBUG: logger.debug (poruka, bačena); pauza; slučaj INFO: logger.info (poruka, bačena); pauza; case UPOZORENJE: logger.warn (poruka, bačena); pauza; GREŠKA slučaja: logger.error (poruka, bačena); pauza; slučaj SVE: zadano: logger.info (poruka, bačena); }} @Override javni void zapisnik (razina razine, paket ResourceBundle, format niza, objekt ... parametri) {if (! IsLoggable (level)) {return; } Niz poruke = MessageFormat.format (format, parametri); prekidač (razina) {case TRACE: logger.trace (poruka); pauza; // ... // isto kao i prethodni prekidač}}

Napokon, kreirajmo novo LoggerFinder koja koristi naše Slf4jLogger:

javna klasa Slf4jLoggerFinder proširuje System.LoggerFinder {@Override javni System.Logger getLogger (naziv niza, modul modula) {return new Slf4jLogger (name); }}

3.2. Konfiguracija modula

Nakon što implementiramo sve svoje razrede, registrirajmo našu uslugu u našem modulu i dodajte ovisnost modula SLF4J:

modul com.baeldung.logging.slf4j {zahtijeva org.slf4j; pruža java.lang.System.LoggerFinder s com.baeldung.logging.slf4j.Slf4jLoggerFinder; izvozi com.baeldung.logging.slf4j; }

Ovaj modul imat će sljedeću strukturu:

├── src │ ├── moduli │ │ ├── com.baeldung.logging.slf4j │ │ │ ├── com │ │ │ │ └── baeldung │ │ │ │ └── prijava │ │ │ │ └─ ─ slf4j │ │ │ │ ├── Slf4jLoggerFinder.java │ │ │ │ └── Slf4jLogger.java │ │ │ └── module-info.java └──

Sada možemo kompajlirati ovaj modul u modovi direktorij kao što smo to učinili u prethodnom odjeljku.

Primijetite da moramo staviti slf4j-api jar u direktorij mods da kompajliramo ovaj modul. Također imajte na umu upotrebu modularizirane verzije knjižnice. Najnoviju verziju možete pronaći u Maven Central.

3.3. Dodavanje povratne informacije

Skoro smo gotovi, ali još uvijek moramo dodati ovisnosti i konfiguraciju zabilježbe. Da biste to učinili, postavite prijava-klasična i logback-core staklenke u modovi imenik.

Kao i prije, moramo biti sigurni da koristimo moduliranu verziju knjižnice. Opet, najnoviju verziju možete pronaći u Maven Central.

Na kraju, kreirajmo datoteku za konfiguraciju zabilježbe i smjestite je u našu modovi imenik:

    % d {yyyy-MM-dd HH: mm: ss} [% nit]% -5 nivo% logger {36} -% msg% n 

3.4. Pokretanje naše aplikacije

U ovom trenutku možemo pokrenuti svoj app koristeći naš modul SLF4J.

U ovom slučaju, trebamo navesti i našu konfiguracijsku datoteku za prijavu:

java --module-path mods \ -Dlogback.configurationFile = mods / logback.xml \ -m com.baeldung.logging.app/com.baeldung.logging.app.MainApp

Napokon, ako provjerimo izlaz, možemo vidjeti da se naši zapisnici ispisuju pomoću naše konfiguracije prijave:

2018-08-25 14:02:40 [main] ERROR MainApp - test pogreške 2018-08-25 14:02:40 [main] INFO MainApp - info test

4. Zaključak

U ovom smo članku pokazali kako stvoriti prilagođeni zapisnik dnevnika u Javi 9 pomoću novog API-ja za evidentiranje platforme. Također, implementirali smo primjer pomoću vanjskog okvira za bilježenje, što je jedan od najkorisnijih slučajeva korištenja ovog novog API-ja.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.


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