Articles

miten Log4J2 toimii: 10 tapaa saada kaikki irti siitä

Log4j2 on päivitetty versio suositusta ja vaikutusvaltaisesta log4j-kirjastosta, jota on käytetty laajasti koko Java-ekosysteemissä niin monen vuoden ajan. Versio 2.x säilyttää kaikki edeltäjänsä hakkuuominaisuudet ja rakentaa tälle perustalle joitakin merkittäviä parannuksia, erityisesti suorituskyvyn alalla.

ja tietenkin ottaen huomioon, miten instrumentaalinen kirjaus on mille tahansa sovellukselle, sekä tarkastus-että virheenkorjaustarkoituksiin, kiinteän kirjauskirjaston valitseminen on melko tärkeä päätös.

seuraavissa jaksoissa käydään läpi, miksi log4j2-kirjasto on loistava valinta kyseiseen päätökseen ja miten sitä voi käyttää sovelluksessa.

Basic Log4j2 Configuration

aloittaaksesi log4j2: n käytön projektissasi, sinun tarvitsee vain lisätä log4j-ydinriippuvuus. Jos käytät Mavenia, voit lisätä seuraavan riippuvuuden pom: iin.xml-tiedosto:

ja jos työskentelet Gradlen kanssa, sinun täytyy lisätä riippuvuus rakennukseen.gradle-tiedosto:

dependencies { compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.8.2'}

laatikosta log4j2 tarjoaa automaattisesti yksinkertaisen kokoonpanon, jos et määrittele sitä itse. Oletusasetukset kirjautuvat konsoliin VIRHETASOLLA tai sen yläpuolella.

aloittaaksesi viestien kirjaamisen tällä perusasetuksella, sinun tarvitsee vain hankkia metsuri-instanssi LogManager-luokalla:

private static Logger logger = LogManager.getLogger(MyService.class);

voit käyttää loggeriobjektia haluamaasi lokitasoa vastaavilla menetelmillä:

logger.error("This is an error message");

räätälöimällä Log4j2-konfiguraatiota

mukautettu log4j2-konfiguraatio voidaan luoda joko ohjelmallisesti tai asetustiedoston kautta.

kirjasto tukee XML -, JSON -, YAML -, sekä the .ominaisuusmuoto. Tässä, aiomme käyttää XML keskustella kaikista esimerkeistä ensisijaisesti.

ensin voit ohittaa oletusasetukset yksinkertaisesti luomalla log4j2: n.XML-tiedosto classpathissa:

tarkastellaan lähemmin tässä yksinkertaisessa kokoonpanossa käytettyjä tageja:

  • Configuration: log4j2-asetustiedoston juurielementti; status-attribuutti kuvaa tasoa, jolla log4j: n sisäiset tapahtumat pitäisi kirjata
  • Appenders: tämä elementti sisältää luettelon appendereistä; esimerkissämme määritellään järjestelmäkonsolia vastaava appender
  • loggerit: tämä elementti sisältää luettelon Logger-instansseista. Juurielementti on standardiloggeri, joka lähettää kaikki viestit

on tärkeää ymmärtää, että Juuriloggeri on pakollinen jokaisessa konfiguraatiossa. Kuten on todettu, jos et anna sellaista, se määritetään automaattisesti oletusarvoisesti konsolin appenderin ja VIRHELOKITASON avulla.

määrittäessään Appenders

log4j2-arkkitehtuurissa appender on periaatteessa vastuussa lokiviestien lähettämisestä tiettyyn tulostuskohteeseen.

Tässä muutamia hyödyllisimpiä sovellustyyppejä, joita kirjasto tarjoaa:

  • ConsoleAppender – logs messages to the System console
  • FileAppender – writes log messages to a file
  • RollingFileAppender – writes the messages to a rolling log file
  • jdbcappender – uses a relational database for logs
  • AsyncAppender – contains a list of other appenders and determines the logs for threading

jotta ymmärtäisit paremmin, miten appenders toimii, Katsotaanpa joitakin konfigurointi esimerkkejä.

RollingFileAppender

kaiken kirjaaminen yhteen tiedostoon ei tietenkään ole ihanteellista. Se on yleensä paljon parempi roll yli aktiivinen lokitiedosto säännöllisesti-mikä on juuri mitä RollingFileAppender tekee.

tämän tyyppisellä appenderilla Voit myös ylittää perusasiat ja määrittää sekä mukautetun laukaisukäytännön että rollover-strategian.

käynnistyskäytäntö määrittää, milloin lokitiedosto rullataan, eli uusi tiedosto luodaan, kun taas rullausstrategia määrittää, miten tiedosto rullataan.

nopeana esimerkkinä voidaan määrittää sovellus, joka luo uuden lokitiedoston 3 käytännön perusteella:

  • onstartuptriggeringpolicy – Uusi lokitiedosto luodaan joka kerta, kun JVM käynnistyy
  • TimeBasedTriggeringPolicy – lokitiedosto rullataan päivämäärän/ajan perusteella
  • SizeBasedTriggeringPolicy – tiedosto rullataan, kun se saavuttaa tietyn koon

kokoonpano käyttää defaultrollover-strategiaa:

näet, kuinka joustava tämä asetustyyli on, ja miten voit virittää lokistrategiasi tarkat semantiikat – viimeistä yksityiskohtaa myöten.

JDBCAppender

kuten nimestä voi päätellä, tämä sovellus käyttää JDBC: tä kirjoittaakseen lokit relaatiotietokantaan.

tälle kokoonpanolle on määriteltävä ConnectionSource, joka voi olla joko JNDI-tietolähde tai mukautettu ConnectionFactory. Metsuri käyttää ConnectionSource saada JDBC yhteydet, minkä vuoksi on tärkeää käyttää yhteys allas paremman suorituskyvyn.

XML-asetustiedoston appenderin määrittämiseen voit käyttää JDBC-tagia:

kuten näet, JNDI-tietolähde määritetään yksinkertaisesti DataSource-tagin jndiname-attribuutin avulla. Yhdessä ConnectionSource, voit määrittää taulukon ja sarakkeet, joita käytetään tallentaa lokitiedot.

The FailoverAppender

Finally, let ’ s have a look at the FailoverAppender; this defines a primary appender and a list of backups that will step in to handle the logging in if the primary one fails.

esimerkiksi, voit määrittää ensisijaisen jdbcappenderin, toissijaisen Rullaustiedoston ja konsolin appenderit siltä varalta, että tietokantayhteyttä ei voida luoda:

tuotantoympäristössä on aina hyvä idea ottaa vikaantumisstrategia kirjautumismekanismillesi.

asettelujen määrittäminen

vaikka appenders on vastuussa lokiviestien lähettämisestä määränpäähän, appenders käyttää asetteluja määrittääkseen, miten lokiviesti muotoillaan.

tässä lyhyt kuvaus joistakin yleisemmin käytetyistä asetteluista, joita log4j2 tarjoaa:

  • PatternLayout – määrittää viestit Merkkijonomallin mukaan
  • JsonLayout – määrittelee JSON – muodon lokiviesteille
  • CsvLayout-voidaan luoda viestejä CSV-muodossa

PatternLayout

ensimmäinen layout-tyyppi, jota aiomme tarkastella, on PatternLayout. Tämä on varsin joustava ratkaisu, joka antaa sinulle paljon kontrollia lokiviestin lopulliseen ulostuloon.

mekanismia ohjaa ensisijaisesti muunnoskuvio, joka sisältää muunnosspesifikaatiot. Jokainen määrittely alkaa % – merkillä, jota seuraavat muokkaajat, jotka ohjaavat asioita, kuten viestin leveyttä ja väriä, sekä sisältöä kuvaava muunnosmerkki, kuten päivämäärä tai langan nimi.

katsotaanpa esimerkkiä kaavakuvan määrittämisestä, joka määrittää lokiviivat näyttämään päivämäärän, langan, lokitason ja lokiviestin eri väreillä eri lokitasoille:

nämä tarkenteet kannattaa ymmärtää yksityiskohtaisesti, joten katsotaan tarkemmin:

  • %d{HH:mm:SS.SSS} – lähdöt lokitapahtuman päivämäärä määritetyssä muodossa
  • %t – lähdöt säieen nimi
  • %taso – näyttää viestin lokitason
  • %highlight{%taso} – käytetään määrittelemään kiharan suluissa olevan kuvion värit
  • %msg%n – lähdöt lokiviesti

lähtö näyttää lokitasot eri väreillä:

voit lukea lisää koko sarjasta vaihtoehtoja kaavojen määrittelemiseksi log4j2 dokumentaatio patternlayout.

JsonLayout

tietojen kirjaamisella JSON-muodossa on joitakin merkittäviä etuja, kuten se, että lokit on helpompi analysoida ja käsitellä kirjaamalla työkaluja pitkin linjaa.

määrittääksesi jsonlayoutin log4j2: ssa, voit yksinkertaisesti määritellä vastaavan tagin:

<JSONLayout complete="true" compact="false"/>

Setting complete=true tuottaa hyvin muodostetun JSON-dokumentin:

JSONin tuottamiseen tarvitaan myös Jackson-databind-kirjasto:

määritettäessä suodattimia

suodattimia log4j2: ssa käytetään määritettäessä, pitäisikö lokiviesti käsitellä vai ohittaa.

suodatin voidaan määrittää koko kokoonpanolle tai logger-tai appender-tasolle.

kirjasto tarjoaa useita erilaisia suodattimia, joita voidaan käyttää:

  • BurstFilter – ohjaa sallittujen lokitapahtumien määrää
  • DynamicThresholdFilter – suodattaa lokirivit tiettyjen attribuuttien perusteella
  • RegexFilter – suodattaa viestit sen perusteella, vastaavatko ne säännöllistä lauseketta

voit esimerkiksi kontrolloida nopeutta, jolla sovellus saa kirjata tietoja.

voit tehdä Burstfilterin ja soveltaa sitä INFOVIESTEIHIN:

<Filters> <BurstFilter level="INFO" rate="10" maxBurst="100"/></Filters>

Tämä jättää valikoivasti huomioimatta INFOTASON viestien ja niiden alapuolella olevien viestien liikenteen ja varmistaa samalla, ettet menetä mitään tärkeämpiä infon yläpuolella olevia viestejä.

tässä tapauksessa nopeus määrittelee keskimääräiset lokiviestit, jotka pitäisi käsitellä sekunnissa, ja maxBurst ohjaa liikenteen purkauksen kokonaiskokoa ennen kuin suodatin alkaa poistaa lokimerkintöjä.

vastaavasti voimme määrittää appenderin vain hyväksymään lokiviestejä, jotka vastaavat tiettyä säännöllistä lauseketta:

<Appenders> <JDBC name="JDBCAppender"> <RegexFilter regex="*jdbc*" onMatch="ACCEPT" onMismatch="DENY"/> </JDBC></Appenders>

kaiken kaikkiaan tätä suodatusmekanismia voidaan käyttää erittäin tarkasti varmistamaan, että jokainen lokiasetuksesi appender seuraa oikeaa tietoa. Kyky kirjata vain hyvin täsmällistä ja merkityksellistä tietoa johtaa yleensä hyvin nopeaan perussyyanalyysiin, erityisesti monimutkaisissa järjestelmissä-varsinkin kun siihen yhdistetään tehokas lokin katselutyökalu.

määrittämällä loggerit

Pääkirjurin lisäksi voidaan määrittää myös muita Metsurielementtejä eri lokitasoilla, appendereillä tai suodattimilla. Jokainen metsuri vaatii nimen, jota voidaan käyttää myöhemmin viittaamaan siihen:

<Loggers> <Logger name="RollingFileLogger"> <AppenderRef ref="RollingFileAppender" /> </Logger></Loggers>

kirjoittaaksesi lokiviestejä tällä nimenomaisella Metsurilla, voit saada siihen viittauksen LogManager-luokalla:

Logger rfLogger = LogManager.getLogger("RollingFileLogger");rfLogger.info("User info updated");

toinen hyvin yleinen tapa jäsentää näiden metsureiden hierarkia perustuu Java-luokkaan:

Logger logger = LogManager.getLogger(MyServiceTest.class);

käyttäen hakuja

hakuja ovat tapa lisätä ulkoisia arvoja log4j2-asetukseen. Olemme jo nähneet esimerkin päivämäärä lookup RollingFileAppender kokoonpano:

<RollingFile name="RollingFileAppender" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">

${date:yyy-MM} – haku lisää nykyisen päivämäärän tiedostonimeen, kun edeltävä $ on pakotusmerkki, lisätäkseen hakulausekkeen filePattern-attribuuttiin.

Voit myös lisätä järjestelmän ominaisuuksien arvot log4j2-asetuksiin käyttämällä muotoa ${sys:property_name}:

<File name="ApplicationLog" fileName="${sys:path}/app.log"/>

toinen tietotyyppi, jonka voit etsiä ja lisätä, on Java-ympäristötiedot:

<PatternLayout header="${java:version} - ${java:os}"> <Pattern>%d %m%n</Pattern></PatternLayout>

löydät lisätietoja siitä, millaisia tietoja voit lisätä hakujen kautta log4j2-dokumentaatio.

ohjelmallinen kokoonpano

asetustiedostojen lisäksi log4j2 voidaan konfiguroida myös ohjelmallisesti. Tähän on muutamia eri tapoja:

  • luo mukautettu Konfiguraatiofactory
  • käytä Konfiguraattoriluokkaa
  • Muokkaa asetuksia alustuksen jälkeen
  • yhdistele ominaisuudet-tiedostoja ja ohjelmallisia konfiguraatioita

Katsotaanpa, miten asettelu ja appender voidaan määrittää ohjelmallisesti:

Seuraavaksi voit määritellä metsurin LoggerConfig-luokalla, liittää appenderin siihen ja päivittää kokoonpano:

sitten voit aloittaa metsurin käytön tavalliseen tapaan:

Logger pLogger = LogManager.getLogger("programmaticLogger");pLogger.info("Programmatic Logger Message");

tämä sujuvan API: n tyyli voi johtaa nopeampaan kehitykseen ja iterointiin monimutkaisemmissa kirjauskonfiguraatioissa, koska olet nyt hyötynyt suoraan Java-koodin kanssa työskentelyn eduista.

kuitenkin, koska XML voi vielä olla luettavampi ja kompaktimpi, konfiguraatiota voi usein kehittää ohjelmallisesti ja muuntaa XML: ksi, kun kaikki on tehty.

mukautetut Lokitasot

sisäänrakennetut lokitasot log4j2: lle ovat:

  • pois
  • kohtalokas
  • irhe

  • varoitus
  • INFO

  • DEBUG
  • jäljitys
  • kaikki

näiden lisäksi voit myös määritellä mukautetun lokitason hakemustarpeidesi mukaan.

esimerkiksi tämän uuden lokitason määrittelyyn voi käyttää tasoa.forName () API-täsmennetään uuden tason nimi ja kokonaisluku, joka edustaa tason paikkaa lokitasojen hierarkiassa:

Level myLevel = Level.forName("NEW_LEVEL", 350);

voit määrittää käytettävän kokonaislukuarvon tarkastelemalla log4j2-dokumentaatiossa muille lokitasoille määriteltyjä arvoja:

350-arvo asettaa varoituksen ja INFO välisen tason, eli viestit näkyvät, kun taso on asetettu INFO tai sitä korkeampi.

viestin kirjaamiseen mukautetulla tasolla on käytettävä log () – menetelmää:

logger.log(myLevel, "Custom Level Message");

vastaava XML-konfiguraatio voi olla:

<CustomLevels> <CustomLevel name="NEW_XML_LEVEL" intLevel="350" /></CustomLevels>

silloin sitä voidaan käyttää standardin lokirajapinnan kautta:

logger.log(Level.getLevel("NEW_XML_LEVEL"),"Custom XML Level Message");

uudet mukautetut tasot näkyvät samalla tavalla kuin tavalliset:

11:28:23.558 NEW_LEVEL - Custom Level Message11:28:23.559 NEW_XML_LEVEL - Custom XML Level Message

siirrytään log4j 1: stä.x

Jos siirrät sovellusta käyttäen 1.X-versio kirjastosta nykyiseen 2.X-versiossa on pari reittiä, joita voi seurata:

  • käytä log4j 1: tä.X bridge
  • päivittää API: n manuaalisesti ja kokoonpano

komentosiltaa käyttäen on triviaali. Sinun tarvitsee vain korvata log4j-riippuvuus log4j-1.2-api-kirjastolla:

vaikka tämä on nopeampi menetelmä, sen haittana on se, että muunnettavissa olevaa konfiguraatiotyyppiä rajoitetaan.

manuaalinen menetelmä on toki työläämpi, mutta johtaa lopulta joustavampaan ja tehokkaampaan hakkuuratkaisuun.

tässä on joitakin yleisimpiä muutoksia, joita sinun on tehtävä:

johtopäätös

lokitiedostot ovat kriittisiä missä tahansa tuotantoympäristössä, ja hyvän lokiratkaisun valitseminen voi olla ero 5 minuutin ja kokonaisen päivän käyttämisen välillä ymmärtääksesi jonkin ongelman tuotannossa.

Log4j2 on tehokas ja kestävä kirjausratkaisu moderneihin Java-sovelluksiin, jossa on laaja valikoima konfigurointivaihtoehtoja.

se mahdollistaa kehittyneiden parhaiden kirjauskäytäntöjen helpon määrittämisen, kuten tiedostojen liikkuvan, erityyppiset kirjauskohteet, tuen jäsennellyille kirjausformaateille, kuten JSON-tai XML-tiedostoille, käyttämällä useita loggereita ja suodattimia, sekä mukautetuille lokitasoille.

lopuksi, kun sinun täytyy ylittää lokitietojen analysointi manuaalisesti, tarkista ehdottomasti Retrace APM: ään sisältyvät kirjausominaisuudet.