Vodič za valjanje dodataka datotekama

1. Pregled

Iako datoteke dnevnika često prenose korisne informacije, oni s vremenom narastu i ako im se dozvoli neograničen rast, njihova veličina može postati problem.

Knjižnice dnevnika rješavaju ovaj problem pomoću valjanje dodataka datoteka, koji automatski "rolaju" ili arhiviraju trenutnu datoteku dnevnika i nastavljaju prijavu u novu datoteku kada se pojave određeni unaprijed definirani uvjeti, čime se sprečava neželjeni zastoj.

U ovom ćemo članku istražiti kako konfigurirati dodavanje valjanih datoteka u neke od najčešće korištenih knjižnica dnevnika - Log4j, Log4j2 i Slf4j.

Pokazat ćemo kako valjati datoteke dnevnika na temelju veličine, datuma / vremena i kombinacije veličine i datuma / vremena. Pokazat ćemo i kako konfigurirati svaku knjižnicu da automatski komprimira i kasnije briše stare datoteke dnevnika, čuvajući nas od pisanja zamornog koda za održavanje.

2. Naš uzorak prijave

Počnimo s primjerom aplikacije koja bilježi neke poruke. Ovaj se kôd temelji na Log4j, ali ga je lako prilagoditi za rad s Log4j2 ili Slf4j:

import org.apache.log4j.Logger; javna klasa Log4jRollingExample {private static Logger logger = Logger.getLogger (Log4jRollingExample.class); public static void main (String [] args) baca InterruptedException {for (int i = 0; i <2000; i ++) {logger.info ("Ovo je" + i + "vrijeme kad kažem 'Hello World'.") ; Navoj.spavanje (100); }}}

Aplikacija je prilično naivna - neke poruke piše u petlji, s kratkim kašnjenjem između iteracija. S 2.000 petlji za pokretanje i pauzom od 100 ms u svakoj petlji, aplikacija bi trebala potrajati nešto više od tri minute.

Ovaj ćemo uzorak koristiti za demonstraciju nekoliko značajki različitih vrsta dodataka valjanih datoteka.

3. Kotrljanje dodataka datotekama u Log4j

3.1. Ovisnosti Mavena

Prije svega, da biste koristili Log4j u svojoj aplikaciji, dodajte ovu ovisnost svom projektu pom.xml datoteka:

 log4j log4j 1.2.17 

Za korištenje dodatnih dodataka koje nudi apache-log-dodaci koju ćemo koristiti u sljedećim primjerima, dodajte sljedeću ovisnost, pazeći da upotrijebite istu verziju koju smo deklarirali za Log4j kako bismo osigurali potpunu kompatibilnost:

 log4j apache-log4j-dodaci 1.2.17 

Najnovije izdanje Log4j i Apache Log4j dodataka možete pronaći na Maven Central.

3.2. Valjanje na temelju veličine datoteke

U Log4j, kao i u ostalim knjižnicama za bilježenje, rolanje datoteka delegirano je dodavaču. Pogledajmo konfiguraciju dodavača valjane datoteke u Log4j koji se kotrlja na temelju veličine datoteke:

Ovdje smo konfigurirali Log4j da vrti datoteku dnevnika kada njegova veličina dosegne 5 KB, koristeći MaxFileSize parametar. Također smo naložili Log4j da čuva najviše dvije valjane datoteke dnevnika pomoću MaxBackupIndex parametar.

Kada smo pokrenuli našu uzorku aplikacije, dobili smo sljedeće datoteke:

27/11/2016 10:28 138 app.log 27/11/2016 10:28 5.281 app.log.1 27/11/2016 10:28 5.281 app.log.2 

Što se dogodilo? Log4j je počeo pisati u app.log datoteka. Kad je veličina datoteke premašila ograničenje od 5 KB, Log4j se premjestio app.log do app.log.1, stvorio potpuno novi, prazan app.logi nastavio s pisanjem novih poruka dnevnika u app.log.

Zatim nakon novog app.log premašio granicu od 5 KB, ponovio se postupak valjanja. Ovaj put, app.log.1 je premješteno u app.log.2, stvarajući mjesta za još jedan novi, prazan app.log.

Postupak valjanja ponovljen je nekoliko puta tijekom izvođenja, ali budući da smo naš dodatak konfigurirali da zadrži najviše dvije valjane datoteke, ne postoji nijedna datoteka koja se zove app.log.3.

Dakle, riješili smo jedan od izvornih problema jer smo sada u mogućnosti postaviti ograničenje veličine proizvedenih datoteka dnevnika.

S druge strane, kada smo provjerili prvi redak app.log.2, sadržavao je poruku povezanu sa 700. iteracijom, što znači da su sve prethodne poruke dnevnika izgubljene:

2016-11-27 10:28:34 INFO Ovo je 700 puta da kažem 'Hello World'. 

Pogledajmo možemo li smisliti postavku koja više odgovara proizvodnom okruženju, gdje se gubljenje poruka dnevnika ne može smatrati najboljim pristupom.

Da bismo to učinili, koristit ćemo druge snažnije, fleksibilnije i podesive Log4j dodatke koji se isporučuju u namjenskom paketu zvanom apache-log4j-dodaci.

Dodaci sadržani u ovom artefaktu nude mnoštvo mogućnosti za fino podešavanje valjanja trupaca i uvode različite koncepte pokretanje politike i valjanje politike. The pokretanje politike opisuje kada bi trebalo nastupiti kotrljanje, dok valjanje politike opisuje kako valja vršiti valjanje. Ova su dva koncepta ključna za valjanje datoteka dnevnika i koriste ih više ili manje eksplicitno i druge knjižnice, kao što ćemo uskoro vidjeti.

3.3. Valjanje automatskim sabijanjem

Vratimo se primjeru Log4j i poboljšajmo postavke dodavanjem automatskog sažimanja valjanih datoteka radi uštede prostora:

Uz pokretanje politike elementa, izjavili smo da bi se rola trebala dogoditi kada zapisnik premaši veličinu od 5.120 bajtova.

Unutar valjanje politike označiti, the ActiveFileName parametar navodi put glavnih datoteka dnevnika koji sadrže najnovije poruke i FileNamePattern parametar navodi predložak koji opisuje koji bi trebao biti put valjanih datoteka. Napomenimo da je ovo doista obrazac jer je posebno rezervirano mjesto % i bit će zamijenjen indeksom valjane datoteke.

Napomenimo i to FileNamePattern završava s ".gz " produženje. Kad god koristimo proširenje povezano s podržanim komprimiranim formatom, imat ćemo komprimirane stare valjane datoteke bez ikakvog dodatnog napora s naše strane.

Sada kada pokrenemo aplikaciju, dobivamo drugačiji skup datoteka dnevnika:

12.3.2016 19:24 88 app.1.log.gz ... 12.03.2016 19:26 88 app.2.log.gz 12.03.2016 19:26 88 app.3.log. gz 03.12.2016 19:27 70 app.current.log 

Datoteka app.current.log je mjesto gdje su se dogodili posljednji dnevnici. Prethodni zapisnici su valjani i komprimirani kada je njihova veličina dosegla zadanu granicu.

3.4. Valjanje na temelju datuma i vremena

U drugim scenarijima, možda ćete htjeti konfigurirati Log4j za rolanje datoteka na temelju datuma i vremena poruka dnevnika, umjesto veličine datoteke. Na primjer, u web aplikaciji možda ćete htjeti da sve poruke dnevnika budu izdane u jednom danu u istoj datoteci dnevnika.

Da biste to učinili, možete koristiti TimeBasedRollingPolicy. Ovim pravilom obvezno je navesti predložak za put do datoteke dnevnika koja sadrži rezervirano mjesto povezano s vremenom. Svaki put kada se izda poruka dnevnika, dodavač provjerava koja bi bila rezultirajuća staza dnevnika, a ako se razlikuje od posljednje korištene staze, dogodit će se svitak. Evo kratkog primjera koji konfigurira takav dodatak:

3.5. Valjanje na temelju veličine i vremena

Kombinirajući SizeBasedTriggeringPolicy i Politika vremenskog zasnivanja, možete dobiti dodatak koji se kotrlja na temelju datuma / vremena, a kada veličina datoteke dosegne postavljeno ograničenje, valja se i na temelju veličine:

Kada smo pokrenuli našu aplikaciju s ovim postavljanjem, dobili smo sljedeće datoteke dnevnika:

12.3.2016 19:25 234 app.19-25.1481393432120.log.gz 12.03.2016 19:25 234 app.19-25.1481393438939.log.gz 12.03.2016 19:26 244 app.19-26.1481393441940 .log.gz 12.03.2016 19:26 240 app.19-26.1481393449152.log.gz 12.03.2016 19:26 3.528 app.19-26.1481393470902.log

Datoteka app.19-26.1481393470902.log je mjesto gdje se odvija trenutna prijava. Kao što vidite, svi dnevnici u intervalu između 19:25 i 19:26 pohranjeni su u više komprimiranih datoteka dnevnika s imenima koja počinju s “oko.19-25 ″. The "% I" rezervirano mjesto zamjenjuje se sve većim brojem.

4. Kotrljanje dodataka datotekama u Log4j2

4.1. Ovisnosti Mavena

Da bismo koristili Log4j2 kao preferiranu knjižnicu dnevnika, moramo ažurirati POM našeg projekta sa sljedećom ovisnošću:

 org.apache.logging.log4j log4j-core 2.7 

Kao i obično, najnoviju verziju možete pronaći na Maven Central.

4.2. Valjanje na temelju veličine datoteke

Promijenimo naš primjer aplikacije da koristi log4j2 knjižnice za evidentiranje i istražimo sada kako možemo postaviti valjanje datoteka na temelju veličine datoteke dnevnika u log4j2.xml konfiguracijska datoteka:

  % d {yyyy-MM-dd HH: mm: ss}% p% m% n 

U Politike tag, naveli smo sva pravila pokretanja koja želimo primijeniti. OnStartupTriggeringPolicy pokreće svitak svaki put kad se aplikacija pokrene, što bi moglo biti korisno za samostalne aplikacije. Zatim smo naveli a SizeBasedTriggeringPolicy navodeći da bi se valjanje trebalo dogoditi kad god datoteka dnevnika dosegne 5 KB.

4.3. Valjanje na temelju datuma i vremena

Koristeći politike koje nudi Log4j2, postavimo dodavač za savijanje i sažimanje datoteke dnevnika na temelju vremena:

  % d {yyyy-MM-dd HH: mm: ss}% p% m% n 

Ovdje je ključ upotreba TimeBasedTriggeringPolicy koji nam omogućuje upotrebu vremenskih rezerviranih mjesta u predlošku valjanih imena datoteka. Imajte na umu da, budući da nam je trebala samo jedna politika pokretanja, ne moramo koristiti Politike oznaka kao što smo to učinili u prethodnom primjeru.

4.4. Valjanje na temelju veličine i vremena

Kao što je prethodno opisano, primamljiviji scenarij je kotrljanje i sažimanje datoteka dnevnika na temelju vremena i veličine. Evo primjera kako možemo postaviti Log4j2 za ovaj zadatak:

  % d {yyyy-MM-dd HH: mm: ss}% p% m% n 

Ovom konfiguracijom izjavili smo da bi se valjanje trebalo dogoditi na temelju vremena i veličine. Dodavač je u stanju razumjeti na koji vremenski interval mislimo zbog uzorka koji se koristi za naziv datoteke, “app.% d {MM-dd-yyyy-HH-mm}.% i.log.gz ”, koji implicitno postavlja kotrljanje koje se događa svake minute i komprimira valjanu datoteku.

Također smo dodali a DefaultRolloverStrategy za brisanje starih valjanih datoteka koje odgovaraju određenim kriterijima. Naše konfiguriramo za brisanje datoteka koje odgovaraju zadanom uzorku kad su starije od 20 dana.

4.5. Ovisnosti Mavena

Da bismo koristili Log4j2 kao preferiranu knjižnicu dnevnika, moramo ažurirati POM našeg projekta sa sljedećom ovisnošću:

 org.apache.logging.log4j log4j-core 2.7 

Kao i obično, najnoviju verziju možete pronaći na Maven Central.

5. Kotrljanje dodataka datotekama u Slf4j

5.1. Ovisnosti Mavena

Kada želite koristiti Slf4j2 s logback pozadinom kao knjižnice za bilježenje, dodajte ovu ovisnost u svoj pom.xml:

 ch.qos. logback prijava-klasična 1.1.7 

Kao i obično, najnoviju verziju možete pronaći na Maven Central.

5.2. Valjanje na temelju veličine datoteke

Pogledajmo sada kako koristiti Slf4j umjesto njega, sa zadanim pozadinskim pozadinama Povratna informacija. Istražimo kako možemo postaviti valjanje datoteke u konfiguracijskoj datoteci logback.xml, koji se nalazi u stazi aplikacije:

 target / slf4j / roll-by-size / app.log target / slf4j / roll-by-size / app.% i.log.zip 1 3 1MB 5KB% -4relativni [% thread]% -5level% logger {35} -% msg% n 

Opet se susrećemo s konceptom valjane politike. Osnovni je mehanizam isti kao onaj koji koriste Log4j i Log4j2. The FixedWindowRollingPolicy omogućuje nam upotrebu rezerviranog mjesta indeksa u uzorku imena valjane datoteke.

Kada veličina datoteke dnevnika naraste preko konfiguriranog ograničenja, dodjeljuje se nova datoteka, a stari se sadržaj sprema kao prva datoteka s popisa, pomičući postojeće za jedno mjesto dalje.

5.3. Valjanje na temelju vremena

U Slf4j možemo rolati datoteku dnevnika na temelju vremena koristeći ponuđeni TimeBasedRollingPolicy. Ovo pravilo omogućuje nam da odredimo naziv predloška pokretne datoteke pomoću rezerviranih mjesta povezanih s vremenom i datumom:

 target / slf4j / roll-by-time / app.log target / slf4j / roll-by-time / app.% d {yyyy-MM-dd-HH-mm} .log.zip 20 1MB% d {yyyy-MM -dd HH: mm: ss}% p% m% n 

5.4. Valjanje na temelju veličine i vremena

Ako trebate rolati datoteku i na temelju vremena i veličine, možete koristiti ponuđeni SizeAndTimeBasedRollingPolicy. Kada upotrebljavate ovo pravilo, morate navesti vremensko rezervirano rezervirano mjesto i indeksno rezervirano mjesto.

Svaki put kad veličina datoteke dnevnika za određeni vremenski interval naraste preko konfiguriranog ograničenja veličine, kreira se druga datoteka dnevnika s istom vrijednošću za vremensko rezervirano mjesto, ali s povećanim indeksom:

 target / slf4j / roll-by-time-and-size / app.log target / slf4j / roll-by-time-and-size / app.% d {yyyy-MM-dd-mm}.% i.log. zip 5KB 20 1MB% d {yyyy-MM-dd HH: mm: ss}% p% m% n 

6. Zaključak

Kao što smo vidjeli, korištenje biblioteke dnevnika za rolanje datoteka štedi vas tereta ručnog upravljanja datotekama dnevnika, omogućujući vam da se usredotočite na razvoj vaše poslovne logike. Dodaci datoteka koji se okreću dragocjeni su alat koji bi trebao biti u alatu svakog programera.

Kao i obično, izvore ćete pronaći na GitHub-u, gdje su primjeri aplikacija predstavljeni u ovom članku konfigurirani za prijavljivanje pomoću nekoliko različitih postavki valjanja kako bi vam se omogućilo da pronađete dobru osnovnu konfiguraciju koja će se dodatno prilagoditi vašim potrebama.