Java Academy · Oppitunti

SLF4J-julkisivu ja lokittimet

Lokita oikealla tasolla.

Oppitunti 2/413 vaihetta

SLF4J-julkisivu ja lokittimet on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mikä SLF4J on?

SLF4J (Simple Logging Facade for Java) on abstraktio. Koodi kirjoitetaan sen APIa vasten, ja Logbackin tai Log4j2:n kaltainen backend hoitaa varsinaisen lokituksen.

Näin kirjastot voivat kirjoittaa lokia pakottamatta sovellusta käyttämään tiettyä toteutusta.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("Application started");
    }
}

Loggerin hakeminen

Luokaa yksi loggeri luokkaa kohden käyttämällä koodia LoggerFactory.getLogger(MyClass.class).

Yleisen käytännön mukaan kenttä on muotoa private static final, ja sen nimi on log tai logger. Luokasta tulee loggerin nimi, joka näkyy tulosteessa.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class OrderService {
    private static final Logger log = LoggerFactory.getLogger(OrderService.class);
    void placeOrder(String id) {
        log.info("Placing order {}", id);
    }
}

Viisi tasoa

SLF4J-loggerit tarjoavat yhden metodin kutakin tasoa varten:

  • log.trace(...)
  • log.debug(...)
  • log.info(...)
  • log.warn(...)
  • log.error(...)
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.trace("entering main");
        log.debug("args length = {}", args.length);
        log.info("service is up");
        log.warn("cache miss");
        log.error("failed to connect");
    }
}

Oikean tason valitseminen

Ohjeet:

  • ERROR: todellinen virhe, joka ihmisen on tutkittava.
  • WARN: palautettavissa oleva poikkeama.
  • INFO: merkittävät elinkaaritapahtumat.
  • DEBUG: kehittäjän diagnostiikkaa, joka poistetaan käytöstä tuotannossa.
  • TRACE: erittäin yksityiskohtaista seurantaa.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PaymentService {
    private static final Logger log = LoggerFactory.getLogger(PaymentService.class);
    void charge(int cents) {
        if (cents <= 0) { log.warn("non-positive charge: {}", cents); return; }
        log.info("charged {} cents", cents);
    }
}

Loggerien nimet ja hierarkia

Loggerien nimet ovat hierarkkisia pisteillä eroteltujen pakettien perusteella. Loggeri nimeltä com.example.svc on loggerin com.example lapsi.

Ylemmälle tasolle määritetty asetus koskee lapsia, ellei sitä korvata, joten tasot voidaan määrittää pakettikohtaisesti.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    public static void main(String[] args) {
        Logger a = LoggerFactory.getLogger("com.example.app");
        Logger b = LoggerFactory.getLogger("com.example.app.db");
        a.info("parent logger");
        b.debug("child inherits parent's level unless overridden");
    }
}

Kalliiden kutsujen suojaaminen

Kun viestin muodostaminen on kallista, suojatkaa se kutsulla isDebugEnabled(), jotta työ tehdään vain kyseisen tason ollessa käytössä.

Parametrisoidun lokituksen avulla (seuraavalla oppitunnilla) tätä tarvitaan harvoin, mutta itse merkkijonoja muodostettaessa suojaus on välttämätön.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    static String heavyDump() { return "...large state..."; }
    public static void main(String[] args) {
        if (log.isDebugEnabled()) {
            log.debug("state: {}", heavyDump());
        }
    }
}

Poikkeusten lokitus

Jos haluatte kirjata poikkeuksen koko pinonjäljityksineen, välittäkää Throwable viimeisenä argumenttina.

Älkää sijoittako poikkeusta paikkamerkkiin, vaan välittäkää se viestin jälkeen.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        try {
            throw new IllegalStateException("boom");
        } catch (Exception e) {
            log.error("Operation failed for id {}", 42, e);
        }
    }
}

Yksi loggeri luokkaa kohden

Ilmoittakaa loggeri kerran staattisena final-kenttänä. Älkää koskaan luoko loggeria metodin sisällä, sillä se tuhlaa resursseja ja poistaa luokan nimen hyödyntämisen edun.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class UserRepository {
    // Good: one shared logger named after the class
    private static final Logger log = LoggerFactory.getLogger(UserRepository.class);
    void save(String user) { log.debug("saving {}", user); }
}

SLF4J ja backend

SLF4J on vain API. Ajon aikana se sitoutuu classpathissa olevaan backend-järjestelmään.

  • Lisätkää logback-classic: SLF4J käyttää Logbackia.
  • Lisätkää log4j-slf4j2-impl: SLF4J käyttää Log4j2:ta.

Koodiin ei tarvitse tehdä muutoksia.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        // Same code, different backend depending on classpath
        log.info("backend-agnostic logging");
    }
}

Arkaluonteisten tietojen lokituksen välttäminen

Älkää koskaan kirjauttako salasanoja, tunnuksia tai täydellisiä luottokorttinumeroita. Lokit toimitetaan usein moniin järjestelmiin, ja niitä säilytetään pitkään.

Peittäkää arkaluonteiset kentät tai jättäkää ne pois ennen lokitusta.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    static String mask(String card) { return "****" + card.substring(card.length() - 4); }
    public static void main(String[] args) {
        log.info("charged card {}", mask("4111111111111234"));
    }
}

Realistinen palvelu

Yhdistetään kaikki: pieni palvelu, joka kirjoittaa lokia sopivilla tasoilla ja käsittelee poikkeustilanteen.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class EmailService {
    private static final Logger log = LoggerFactory.getLogger(EmailService.class);
    void send(String to) {
        log.debug("preparing email to {}", to);
        try {
            if (to == null) throw new IllegalArgumentException("null recipient");
            log.info("email sent to {}", to);
        } catch (Exception e) {
            log.error("failed to send email", e);
        }
    }
}

Pikatarkistus

Testatkaa SLF4J:n perusteiden hallintaa.

Kertaus

Opitte tuntemaan SLF4J-julkisivun:

  • Hakekaa yksi private static final Logger kutakin luokkaa kohden.
  • Käyttäkää viittä tasometodia tarkoituksenmukaisesti.
  • Loggerien nimet ovat hierarkkisia, mikä mahdollistaa pakettikohtaisen hallinnan.
  • Välittäkää Throwable viimeisenä pinonjäljityksen lokitusta varten, älkääkä koskaan kirjauttako salaisuuksia.

Seuraavaksi käsitellään tehokkaita parametrisoituja viestejä.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
    private static final Logger log = LoggerFactory.getLogger(Main.class);
    public static void main(String[] args) {
        log.info("SLF4J facade recap complete");
    }
}
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”SLF4J-julkisivu ja lokittimet” ilmainen?

Kyllä – oppitunnin ”SLF4J-julkisivu ja lokittimet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”SLF4J-julkisivu ja lokittimet”?

Lokita oikealla tasolla. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”SLF4J-julkisivu ja lokittimet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Miksi rakenteinen lokitus
  2. SLF4J-julkisivu ja lokittimet
  3. Parametrisoitu lokitus
  4. Logbackin määrittäminen
← Takaisin: Java Academy