Memo pentru logarea în scală și, în general, în lumea java, notele programatorului

Nu se poate aplica o aplicație serioasă fără înregistrare, fie că este vorba, GUI sau chiar ceva pentru Android. În lumea Java, situația înregistrării este oarecum confuză la prima vedere. Există unele SLF4J, unele Logback, din anumite motive trebuie să creați fișiere XML, asta e tot. Dar, așa cum se întâmplă adesea, dacă stați jos și nu vă grăbiți să vă gândiți la lucruri, de fapt, totul se dovedește a fi foarte simplu și logic.







În cazul lui Scala, există o bibliotecă scala-logging de notat. fiind o învelitoare pe SLF4J. Utilizând macrocomenzile Scala. adaugă un control înainte de a scrie un șir la jurnal, indiferent dacă va fi înregistrat undeva sub setările curente.

Adică, scrieți:

log. depanare # 40; s "Test $ msg" # 41;

... și după implementarea macrocomenzii se transformă în:

dacă # 40; log. isDebugEnabled # 41; log. depanare # 40; s "Test $ msg" # 41;

Ca rezultat, dacă sunt dezactivate jurnalele de depanare, memoria nu va fi alocată și eliberată sub linie, interpolarea nu va fi efectuată și așa mai departe. Astfel, obținem productivitate semnificativ mai mare.

Să încercăm să strângem logarea la serviciul nostru REST pe baza Finagle. În build.sbt adăugăm dependențe:

"ch.qos.logback"% "logback-clasic"% "1.1.3",
"com.typesafe.scala-logging" %% "scala-logging"% "3.1.0"

În constructorul clasei FinagleServiceExample, creați un logger:

import com. typesafe. scalalogging. _
import org. slf4j. LoggerFactory

private logger = Logger # 40; LoggerFactory. getLogger # 40; acest lucru. getClass # 41; # 41;

Apoi luăm și scriem doar jurnalele:

logger. info # 40; "serviciul a început" # 41;
logger. depanare # 40; s "citirea cheii $" # 41;
logger. eroare # 40; s "solicitare greșită: $ req" # 41;

Există următoarele niveluri de înregistrare, de la cea mai mică la cea mai mare: TRACE, DEBUG, INFO, WARN, ERROR. În setările, discutate mai jos, este selectat un nivel efectiv. Când selectați un anumit nivel eficient, toate mesajele de la acest nivel și mai sus vor ajunge la jurnal. De exemplu, dacă este selectat un nivel eficient INFO, veți vedea toate mesajele INFO, WARN și ERROR din jurnale. În plus, există un nivel special de OFF eficient care dezactivează toate înregistrările.

Logback caută un fișier cu următoarele setări:

  1. Dacă calea de clasă are logback.groovy, este utilizată;
  2. În caz contrar, calea de clasă caută fișierul logback-test.xml;
  3. Dacă nu, încercați să găsiți logback.xml;
  4. Dacă nu este găsit, utilizați setările implicite, adică scriem doar în consola;

Să punem fișierul logback-test.xml în src / test / resources după cum urmează:











. % -5 nivel [% thread]% logger -% msg% n





Așa cum este ușor de ghicit, aici spunem că Logback va scrie toate mesajele DEBUG și mesajele de nivel superior către STDOUT utilizând formatul specificat. Dacă rulați acum testele, în ieșire veți vedea toate înregistrările DEBUG, INFO și ERROR. Puteți înlocui nivelul într-un rând pe INFO sau ERROR și asigurați-vă că jurnalul devine mai mic.

În directorul src / main / resources, creați logback.xml cu conținut ușor diferit:





.ate% -5 nivel [% thread]% logger -% msg% n



finagle-example.log


.ate% -5 nivel [% thread]% logger -% msg% n






De asemenea, aceste setări nu necesită explicații speciale. Spunem că scriem atât consolă, cât și fișier, utilizând un format de jurnal ușor diferit. Puteți construi borcan standalone folosind comanda:

... apoi rulați-o, spunând:

java -jar. / target / scala- 2.11 / finagle-exemplu-asamblare- 0.1 .jar

... și verificați dacă Logback captează cu succes setările.

Puteți înlocui setările fără a reconstrui borcanul, spunând:

java -Dlogback.configurationFile = cale / către / logback.xml \
-borcan. / target / scala- 2.11 / finagle-exemplu-asamblare- 0.1 .jar

Puteți forța Logback să citească automat documentația schimbând prima linie în logback.xml, astfel:

Puteți filtra jurnalele pe clase și pachete, în timp ce semantica intuitivă lucrează pe ierarhii:

În secțiunile Apender, puteți specifica un nivel minim de mesaje:


INFO

Jurnalele de pachete și clase specifice pot fi trimise la anexele specificate:



Puteți configura rotația și arhivarea jurnalelor:

class = "ch.qos.logback.core.rolling.RollingFileAppender">

/path/to/application.log

.ate% -5 nivel [% thread]% logger -% msg% n

class = "ch.qos.logback.core.rolling.FixedWindowRollingPolicy">

/path/to/application.%i.log.zip
1
10

class = "ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

2MB

class = "ch.qos.logback.core.rolling.RollingFileAppender">

/path/to/application.log

.ate% -5 nivel [% thread]% logger -% msg% n

class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

/path/to/application-..log.gz

10

După cum puteți vedea, totul este foarte flexibil, foarte puternic și nu spune că super este dificil.

Și ce scrieți în jurnale?







Trimiteți-le prietenilor: