Logback: Okvir za logovanje integrisan u Spring Boot
Juče, šef mi je posle što sam završio govoriti koliko je Logback sjajan, potpuno se preobratio, mi daje smrtonosnu naredbu, "tako dobar sistem logovanja, još uvek ne žuriš, prebaci ga u naš projekat!"
Naš projekat ranije koristio Log4j, u mojim očima, već je dovoljno dobar, konačno mala kompanija, zahtevi za performanse nisu tako strogi.

Log4j je predstavljen, SLF4J je takođe predstavljen, zatim, razumete, Logback će dostojno doći na scenu, jer su tri brata imaju istog oca, to je veliki gospodin Ceki Gulcu.
01, Šta je Logback jak
- Vrlo prirodno realizuje SLF4J, ne treba dodati sloj adaptera kao Log4j i JUL.

- Podrazumevani okvir za logovanje u Spring Boot koristi Logback. Jednom kada alat postane podrazumevana opcija, to znači da je taj alat premašio druge konkurente.

Obratite pažnju na sledeću sliku (dokaz pronađen, sa Spring Boot zvaničnog sajta):

Takođe može videti kroz izvorni kod:

Podržava automatsko ponovo učitavanje konfiguracionog fajla, ne treba dodatno kreirati sken niti za praćenje.
Pošto je novo delo velikog gospodina, sigurno ima veliko unapređenje u performansama, inače?
02, Primer upotrebe Logbacka
Prvi korak, dodajte zavisnost Logback u fajl pom.xml:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>Maven će automatski uvesti druge dve zavisnosti:

logback-core je srce Logbacka, logback-classic je realizacija SLF4J.
Drugi korak, dođimo sa najjednostavnijim test slučajem:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author WeChat traži "Chenmo Wang Er", odgovorite ključnu reč PDF
*/
public class Test {
static Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
logger.debug("logback");
}
}Logger i LoggerFactory dolaze iz SLF4J, zato ako se projekat prebacuje sa Log4j + SLF4J na Logback, tada je kod nulte promene.
Pokrenite klasu Test, možete videti sledeće informacije na konzoli:
12:04:20.149 [main] DEBUG com.itwanger.Test - logbackBez konfiguracionog fajla, sve je podrazumevano, log informacije Logbacka će se izbaciti na konzolu. Može koristiti StatusPrinter da ispiše interne informacije Logbacka:
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);Nakon dodavanja gore navedenog koda u metodu main, ponovo pokrenite klasu Test, možete videti sledeće informacije na konzoli:
12:59:22.314 [main] DEBUG com.itwanger.Test - logback
12:59:22,261 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
12:59:22,262 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
12:59:22,262 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
12:59:22,268 |-INFO in ch.qos.logback.classic.BasicConfigurator@5e853265 - Setting up default configuration.To znači da će Logback prvo tražiti fajl logback-test.xml na classpath putanji, ako ne pronađe, traži fajl logback.groovy, još uvek nije pronađen, traži fajl logback.xml, ako ništa ne pronađe, onda izbacuje na konzolu.
Opšte uzevši, mi ćemo konfigurisati logback-test.xml u lokalnom okruženju, konfigurišemo logback.xml u produkcijskom okruženju.
Treći korak, dodajte fajl logback-test.xml u direktorijum resource, sadržaj je kao sledeći:
<configuration debug="true">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %relative [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>Konfiguracioni fajl Logbacka je vrlo fleksibilan, osnovna struktura je element <configuration>, sadrži 0 ili više elemenata <appender>, zatim prati 0 ili više elemenata <logger>, zatim sledi najviše jedan element <root>.

1) Konfiguriši appender, to jest konfiguriši odredište izlaza logova, putem name atributa specificira ime, putem class atributa specificira odredište:
- ch.qos.logback.core.ConsoleAppender: izbacuje na konzolu.
- ch.qos.logback.core.FileAppender: izbacuje u fajl.
- ch.qos.logback.core.rolling.RollingFileAppender: kada veličina fajla premaši prag, kreira novi fajl.
Osim izbacivanja na lokalno, može kroz SocketAppender i SSLSocketAppender izbaciti na udaljene uređaje, kroz SMTPAppender izbaciti u email. Čak može kroz DBAppender izbaciti u bazu podataka.
encoder je odgovoran da pretvara log informacije u niz bajtova, i da piše niz bajtova u izlazni tok.
pattern se koristi da specificira format izlaza logova:
%d: format vremena izlaza.%thread: ime niti logova.%-5level: nivo izlaza logova, popunjava do 5 karaktera. Na primer, info ima samo 4 karaktera, popunjava jedan razmak, tako da su log informacije poravnate.
Kontra primer (nije specificirano -5):

%logger{length}: ime logger-a, length se koristi da skraći ime. Nije specificirano znači pun izlaz; 0 znači samo izlaz stringa posle najdesnije tačke logger-a; drugi brojevi znače izlaz količine karaktera pre poslednje tačke decimala.%msg: konkretne informacije logova.%n: karakter novog reda.%relative: izlazi vreme od pokretanja programa do kreiranja zapisa logova, jedinica je milisekunda.
2) Konfiguriši root, podržava samo jedan atribut – level, vrednost može biti: TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF.
appender-ref se koristi da specificira konkretan appender.
3) Pregledaj informacije o unutrašnjem stanju.
Možete u kodu koristiti StatusPrinter da ispišete informacije o unutrašnjem stanju Logbacka, takođe možete uključiti debug na configuration da ispišete informacije o unutrašnjem stanju.
Ponovo pokrenite klasu Test, možete videti sledeće informacije na konzoli:
13:54:54,718 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] at [file:/Users/maweiqing/Documents/GitHub/JavaPointNew/codes/logbackDemo/target/classes/logback-test.xml]
13:54:54,826 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
13:54:54,828 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
13:54:54,833 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
13:54:54,850 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
13:54:54,850 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
13:54:54,850 |-INFO in ch.qos.logback.classic.joran.ConfigurationAction - End of configuration.
13:54:54,851 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@f8c1ddd - Registering current configuration as safe fallback point
13:54:54.853 [main] DEBUG com.itwanger.Test - logback4) Automatsko ponovo učitavanje konfiguracije.
Ranije sam pominjao da je vrlo snažna funkcija Logbacka podrška automatskog ponovnog učitavanja konfiguracije, ako želite da omogućite ovu funkciju, veoma je jednostavno, samo dodajte scan=true na element configuration.
<configuration scan="true">
...
</configuration>Podrazumevano, vreme skeniranja je jednom svakog minuta. Ako želite podesiti interval skeniranja, možete podesiti kroz atribut scanPeriod, jedinica može biti milisekunde (milliseconds), sekunde (seconds), minuti (minutes) ili satovi (hours).
Sledeći primer specificira interval od 30 sekundi:
<configuration scan="true" scanPeriod="30 seconds"
...
</configuration>Pažnja: ako specificirate interval, ali ne specificirate jedinicu vremena, podrazumevana jedinica vremena je milisekunda.
Kada podesite scan=true, Logback će pokrenuti zadatak ReconfigureOnChangeTask da prati promene konfiguracionog fajla.
03, Pretvori log4j.properties u logback-test.xml
Ako vaš projekat ranije koristio Log4j, onda možete preko sledećeg URL-a pretvoriti log4j.properties u logback-test.xml:
Kopirajte sadržaj ranijeg log4j.properties:
### Podešavanje ###
log4j.rootLogger = debug,stdout,D,E
### Izlaz informacija na konzolu ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### Izlazi logove nivoa DEBUG ili više u debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### Izlazi logove nivoa ERROR ili više u error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%nNalepite na to tekstualno polje sajta:

Kliknite "Translate", možete dobiti sledeći sadržaj:
<?xml version="1.0" encoding="UTF-8"?>
<!-- For assistance related to logback-translator or configuration -->
<!-- files in general, please contact the logback user mailing list -->
<!-- at http://www.qos.ch/mailman/listinfo/logback-user -->
<!-- -->
<!-- For professional support please see -->
<!-- http://www.qos.ch/shop/products/professionalSupport -->
<!-- -->
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<encoder>
<pattern>[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n</pattern>
</encoder>
</appender>
<appender name="D" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--See http://logback.qos.ch/manual/appenders.html#RollingFileAppender-->
<!--and http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy-->
<!--for further documentation-->
<Append>true</Append>
<File>debug.log</File>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<appender name="E" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--See http://logback.qos.ch/manual/appenders.html#RollingFileAppender-->
<!--and http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy-->
<!--for further documentation-->
<File>error.log</File>
<Append>true</Append>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="debug">
<appender-ref ref="stdout"/>
<appender-ref ref="D"/>
<appender-ref ref="E"/>
</root>
</configuration>Možete potvrditi sadržaj, otkrio sam da su sva tri appendera tu.

Ali, konvertovani fajl se ne može direktno koristiti, treba malo prilagoditi, jer:
Prvo, formatiranje logova je malo drugačije, Logback nema %l.
Drugo, RollingFileAppender treba specificirati RollingPolicy i TriggeringPolicy, prvi je odgovoran za funkciju rotacije logova, drugi je odgovoran za vreme rotacije logova. Ako RollingPolicy takođe implementira interfejs TriggeringPolicy, onda samo treba postaviti RollingPolicy.
TimeBasedRollingPolicy i SizeAndTimeBasedRollingPolicy su dve najčešće korišćene strategije rotacije.
TimeBasedRollingPolicy istovremeno implementira interfejse RollingPolicy i TriggeringPolicy, zato kada koristite TimeBasedRollingPolicy ne morate specificirati TriggeringPolicy.
TimeBasedRollingPolicy može specificirati sledeće atribute:
fileNamePattern, koristi se da definiše ime fajla (obavezno). Njegova vrednost treba da se sastoji od imena fajla plus jednog placeholdera
%d.%dtreba da sadrži format datuma specificiran ujava.text.SimpleDateFormat, podrazumevano jeyyyy-MM-dd. Rotacioni period se izvodi iz fileNamePattern.maxHistory, najviše koliko fajlova logova da zadrži (opcionalno), stare fajlove će brisati asinhrono. Na primer, specificirate rotaciju po mesecu, specificirate
maxHistory = 6, onda će se fajlovi logova u roku od 6 meseci zadržati, više od 6 meseci će biti obrisano.totalSizeCap, veličina svih fajlova logova (opcionalno). Prelazi ove veličine, stari fajlovi logova će biti obrisani asinhrono. Treba koristiti zajedno sa atributom maxHistory, i to je drugi uslov.
Pogledajte sledeću konfiguraciju RollingFileAppender:
<appender name="D" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Rotacija po danima -->
<fileNamePattern>debug.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- Zadrži 30 dana istorije, maksimalna veličina je 30GB -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%relative [%thread] %level %logger{35} - %msg%n</pattern>
</encoder>
</appender>Na osnovu strategije rotacije po danima, najviše zadržava 30 dana, maksimalna veličina je 30G.
SizeAndTimeBasedRollingPolicy ima jedan atribut više od TimeBasedRollingPolicy koji podešava veličinu fajla logova: maxFileSize, ostalo je potpuno isto.
Na osnovu našeg razumevanja RollingPolicy, možemo prilagoditi sadržaj logback-test.xml na sledeći sadržaj:
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="D" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Append>true</Append>
<File>debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Rotacija po danima -->
<fileNamePattern>debug.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- Zadrži 30 dana istorije, maksimalna veličina je 30GB -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<appender name="E" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Rotacija po danima -->
<fileNamePattern>error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- Zadrži 30 dana istorije, maksimalna veličina je 30GB -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="debug">
<appender-ref ref="stdout"/>
<appender-ref ref="D"/>
<appender-ref ref="E"/>
</root>
</configuration>Izmenite sadržaj klase Test:
public class Test {
static Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
logger.debug("logback");
logger.error("logback");
}
}Nakon pokretanja, možete videti dva fajla u direktorijumu target: debug.log i errror.log.

Do sada, projekat se već prebacio sa Log4j na Logback, proces je veoma glatak i tečak, hehe.
04, Priručnik Logbacka
Na zvaničnom sajtu Logbacka postoji priručnik, veoma detaljan, ukupno 200+ stranica, ali je na engleskom. Drugari mogu posle što pročitate moj članak za uvođenje i praksu Logbacka, idite na sledeću adresu da vidite zvanični priručnik.
Ako vam je sposobnost čitanja engleskog ograničena, možete na GitHub-u videti kinesku verziju prevedenu od Lei Feng:
Naravno, postoji i deo drugari koji vole da gledaju offline PDF, već sam organizovao:
Link:https://pan.baidu.com/s/16FrbwycYUUIfKknlLhRKYA Lozinka:bptl
