JavaRush /Blog Jawa /Random-JV /Logging ing Jawa: apa, carane, ngendi lan karo apa?

Logging ing Jawa: apa, carane, ngendi lan karo apa?

Diterbitake ing grup
Halo kabeh, komunitas JavaRush! Dina iki kita bakal ngomong babagan logging Java:
  1. Apa iki, kok. Ing kasus apa luwih apik kanggo nggunakake, ing kasus apa ora?
  2. Apa bedane implementasi logging ing Jawa lan apa sing kudu ditindakake babagan macem-macem iki?
  3. Tingkat logging. Ayo ngrembug apa appender lan carane ngatur kanthi bener.
  4. Node logging lan carane ngatur kanthi bener supaya kabeh bisa mlaku kaya sing dikarepake.
Materi iki ditrapake kanggo pamirsa sing akeh. Bakal cetha banget kanggo wong sing lagi kenal karo basa Jawa, lan sing wis kerja, nanging mung digoleki kanthi logger.info(“log something”); Ayo!

Napa logging dibutuhake?

Ayo goleki kasus nyata sing logging bakal ngrampungake masalah kasebut. Iki minangka conto saka karyaku. Ana titik aplikasi sing nggabungake karo layanan liyane. Aku nggunakake logging saka titik kasebut minangka "alibi" : yen integrasi ora bisa, iku bakal gampang kanggo tokoh metu saka sisih ngendi masalah asalé saka. Sampeyan uga dianjurake kanggo log informasi penting sing disimpen ing database. Contone, nggawe pangguna administrator. Iki persis apa sing bakal apik kanggo log.

Java Logging Tools

Logging: apa, carane, ngendi lan karo apa?  - 2Solusi sing kondhang kanggo mlebu ing Jawa kalebu:
  • log4j
  • JUL - java.util.logging
  • JCL - jakarta commons logging
  • Logback
  • SLF4J - fasad logging prasaja kanggo java
Ayo dadi njupuk dipikir cepet ing saben wong, lan ing bagean praktis saka materi kita bakal njupuk sambungan Slf4j - log4j minangka basis . Iki bisa uga katon aneh saiki, nanging aja kuwatir: ing pungkasan artikel kabeh bakal jelas.

System.err.println

Kaping pisanan, mesthi, ana System.err.println (output rekaman menyang console). Iki isih digunakake kanggo entuk log kanthi cepet sajrone debugging. Mesthi wae, ora perlu ngomong babagan setelan apa wae ing kene, mula ayo ngelingi lan nerusake.

Log4j

Iki wis dadi solusi lengkap, sing digawe saka kabutuhan pangembang. Ternyata alat sing menarik banget kanggo digunakake. Amarga macem-macem kahanan, solusi iki ora tau mlebu ing JDK, sing ngganggu kabeh komunitas. log4j duwe opsi konfigurasi supaya logging bisa diaktifake ing paket com.example.typelan dipateni ing subpaket com.example.type.generic. Iki ndadekake iku bisa kanggo cepet misahake apa sing perlu kanggo mlebu log saka apa ora perlu. Wigati dicathet ing kene ana rong versi log4j: 1.2.x lan 2.x.x, sing ora kompatibel karo saben liyane . log4j nambahake konsep kaya appender , yaiku, alat sing direkam log lan tata letak - log formatting. Iki ngidini sampeyan kanggo ngrekam mung apa sing perlu lan carane sampeyan perlu iku. Kita bakal ngomong luwih akeh babagan appender mengko.

JUL - java.util.logging

Salah sawijining kaluwihan utama yaiku solusi - JUL kalebu ing JDK (Java development kit). Sayange, sajrone pangembangane, dudu log4j populer sing dijupuk minangka basis, nanging solusi saka IBM, sing mengaruhi pangembangane. Nyatane, saiki ana JUL, nanging ora ana sing nggunakake. Saka "dadi-dadi": ing JUL tingkat logging beda saka apa ing Logback, Log4j, Slf4j, lan iki worsens pemahaman antarane wong-wong mau. Nggawe logger kurang luwih padha. Kanggo nindakake iki, sampeyan kudu ngimpor:
java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggingJul.class.getName());
Jeneng kelas kasebut sacara khusus diterusake supaya bisa ngerti saka ngendi logging kasebut. Wiwit Jawa 8, iku bisa kanggo pass Supplier<String>. Iki mbantu kanggo count lan nggawe senar mung ing wayahe nalika iku pancene needed, lan ora saben wektu, kaya sadurunge. Mung kanthi rilis Java 8, para pangembang ngrampungake masalah penting, sawise JUL pancen bisa digunakake. Yaiku, metode kanthi argumentasi Supplier<String> msgSupplierkaya ing ngisor iki:
public void info(Supplier<String> msgSupplier) {
   log(Level.INFO, msgSupplier);
}

JCL - jakarta commons logging

Amarga kasunyatan sing wis suwe ora ana standar industri ing logging lan ana wektu nalika akeh wong nggawe logger khusus dhewe, dheweke mutusake kanggo ngeculake JCL - bungkus umum sing bakal digunakake kanggo wong liya. Kenging punapa? Nalika sawetara dependensi ditambahake menyang proyek kasebut, dheweke bisa nggunakake logger sing beda tinimbang logger ing proyek kasebut. Amarga iki, dheweke ditambahake kanthi transitif menyang proyek kasebut, sing nggawe masalah nyata nalika nyoba nggabungake kabeh. Sayange, pambungkus iki banget miskin ing fungsi lan ora ngenalake tambahan. Mesthine bakal trep yen kabeh wong nggunakake JCL kanggo nindakake pakaryan. Nanging nyatane ora bisa kaya ngono, mula nggunakake JCL dudu ide sing apik saiki.

Logback

Carane eri iku path open-source... Logback ditulis dening pangembang padha log4j kanggo nggawe penerus. Ide kasebut padha karo log4j. Bedane ana ing logback:
  • kinerja apik;
  • ditambahake dhukungan asli kanggo slf4j;
  • Opsi nyaring wis ditambahi.
Kanthi gawan, logback ora mbutuhake setelan lan ngrekam kabeh log saka tingkat DEBUG lan ndhuwur. Yen konfigurasi dibutuhake, bisa ditindakake liwat konfigurasi xml:
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss,SSS} %-5p [%c] - %m%n</pattern>
        </encoder>
    </appender>
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" />
    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

SLF4J - fasad logging prasaja kanggo java

Around 2006, salah siji saka pendiri log4j ninggalake project lan nggawe slf4j - Simple Logging Facade kanggo Jawa - pambungkus watara log4j, JUL, umum-loggins lan logback. Nalika sampeyan bisa ndeleng, kemajuan wis tekan titik sing padha nggawe pambungkus ing ndhuwur pambungkus ... Menapa malih, iku dipérang dadi rong bagéan: API, kang digunakake ing aplikasi, lan implementasine, kang ditambahake minangka. dependensi kapisah kanggo saben jinis logging. Tuladhane, slf4j-log4j12.jar, slf4j-jdk14.jar. Cukup kanggo nyambungake implementasine sing bener lan mung: kabeh proyek bakal bisa digunakake. Slf4j ndhukung kabeh fitur anyar kayata format string kanggo logging. Ana masalah kuwi sadurunge. Ayo ngomong yen ana entri log:
log.debug("User " + user + " connected from " + request.getRemoteAddr());
userAna konversi implisit ing obyek user.toString()amarga concatenation senar, lan iki mbutuhake wektu, kang slows mudhun sistem. Lan kabeh iku ok yen kita debug aplikasi. Masalah diwiwiti yen tingkat logging kanggo kelas iki INFO lan luwih dhuwur. Tegese, log iki ora kudu ditulis, lan concatenation string uga ora bisa ditindakake. Ing teori, iki kudu diputusake dening perpustakaan logging dhewe. Kajaba iku, iki dadi masalah paling gedhe ing versi pisanan log4j. Dheweke ora menehi solusi normal, nanging disaranake nindakake kaya iki:
if (log.isDebugEnabled()) {
    log.debug("User " + user + " connected from " + request.getRemoteAddr());
}
Sing, tinimbang siji baris logging, padha disaranake nulis 3 (!). Logging kudu nyilikake owah-owahan ing kode, lan telung baris cetha contradicted pendekatan umum. slf4j ora duwe masalah kompatibilitas karo JDK lan API, mula solusi sing apik langsung muncul:
log.debug("User {} connected from {}", user, request.getRemoteAddr());
ngendi {}nuduhake sisipan saka argumen sing liwati ing cara. Sing, pisanan {}cocog karo user, kaloro {}- request.getRemoteAddr(). Amarga iki, mung yen tingkat logging ngidini ngrekam menyang log, pesen iki bisa digabung dadi siji. Sawise iki, SJF4J cepet dadi populer lan saiki dadi solusi sing paling apik. Mulane, kita bakal nimbang logging nggunakake conto bundel slf4j-log4j12.

Apa sing kudu dicathet

Mesthi, sampeyan ora kudu nyathet kabeh. Kadhangkala iki ora perlu lan malah mbebayani. Contone, yen sampeyan janji data pribadhi wong lan piye wae nerangake cahya, bakal ana masalah nyata, utamané ing proyèk oriented menyang Kulon. Nanging ana uga sing wajib dicathet :
  1. Wiwiti / pungkasan aplikasi. Kita kudu ngerti manawa aplikasi kasebut diluncurake kaya sing dikarepake lan rampung kaya sing dikarepake.
  2. Pitakonan keamanan. Ing kene bakal luwih apik kanggo log nyoba ngira sandhi, mlebu log pangguna penting, lsp.
  3. Sawetara negara aplikasi . Contone, transisi saka siji negara menyang liyane ing proses bisnis.
  4. Sawetara informasi kanggo debugging , kanthi tingkat logging sing cocog.
  5. Sawetara skrip SQL. Ana kasus nyata nalika iki dibutuhake. Maneh, kanthi trampil nyetel level, asil sing apik bisa digayuh.
  6. Utas sing dieksekusi (Utas) bisa dicathet yen operasi sing bener dicenthang.

Kesalahan logging populer

Ana akeh nuansa, nanging ana sawetara kesalahan umum:
  1. Keluwihan logging. Sampeyan ora kudu nyathet saben langkah sing bisa sacara teoritis penting. Ana aturan: log bisa mbukak kinerja ora luwih saka 10%. Yen ora, bakal ana masalah kinerja.
  2. Log kabeh data menyang siji file. Iki bakal nggawe maca / nulis iku angel banget ing titik tartamtu, ora kanggo sebutno ana watesan ukuran file ing sistem tartamtu.
  3. Nggunakake level logging sing salah. Saben level logging nduweni wates sing jelas lan kudu diajeni. Yen wates iku samar, sampeyan bisa setuju ing kang tingkat kanggo nggunakake.

Tingkat logging

x: katon
FATAL ERROR WARNING INFO DEBUG TRACE KABEH
OFF
FATAL x
ERROR x x
WARNING x x x
INFO x x x x
DEBUG x x x x x
TRACE x x x x x x
KABEH x x x x x x x
Apa level logging? Supaya rangking log, perlu diwenehi sebutan lan bedane tartamtu. Kanggo tujuan iki, tingkat logging dienalake. Tingkat disetel ing aplikasi. Yen entri belongs kanggo tingkat ngisor siji ditetepake, iku ora mlebu menyang log. Contone, kita duwe log sing digunakake kanggo debug aplikasi. Ing karya produksi normal (nalika aplikasi digunakake kanggo tujuan sing dimaksud), log kasebut ora dibutuhake. Mulane, tingkat logging bakal luwih dhuwur tinimbang kanggo debugging. Ayo goleki level nggunakake log4j minangka conto. Solusi liyane, kajaba JUL, nggunakake tingkat sing padha. Ing ngisor iki ana ing urutan sing mudhun:
  • OFF: ora ana log sing ditulis, kabeh bakal diabaikan;
  • FATAL: kesalahan sawise aplikasi ora bisa maneh lan bakal mandheg, contone, JVM metu saka kesalahan memori;
  • ERROR: Tingkat kesalahan nalika ana masalah sing kudu ditanggulangi. Kesalahan ora mandhegake aplikasi kanthi sakabehe. Pitakonan liyane bisa uga bener;
  • WARN: Nuduhake log sing ngemot bebaya. Tumindak sing ora dikarepke kedadeyan, sanajan sistem kasebut nolak lan ngrampungake panjaluk kasebut;
  • INFO: log sing nyathet tumindak penting ing aplikasi kasebut. Iki dudu kesalahan, iki dudu peringatan, iki minangka tumindak sistem sing dikarepake;
  • DEBUG: log sing dibutuhake kanggo debug aplikasi. Kanggo mesthekake yen sistem nindakake persis apa sing dikarepake, utawa kanggo njlèntrèhaké tumindak sistem: "metode1 wiwit digunakake";
  • TRACE: log prioritas sing luwih murah kanggo debugging, kanthi tingkat logging paling murah;
  • ALL: level ing ngendi kabeh log saka sistem bakal direkam.
Pranyata yen level logging INFO diaktifake ing sawetara panggonan ing aplikasi kasebut, kabeh level bakal dicathet, wiwit saka INFO lan nganti FATAL. Yen level logging iku FATAL, mung log karo level iki sing bakal direkam.

Ngrekam lan ngirim log: Appender

Kita bakal nimbang proses iki nggunakake log4j minangka conto: menehi kesempatan akeh kanggo ngrekam / ngirim log:
  • kanggo nulis menyang file - solusi DailyRollingFileAppender ;
  • kanggo nampa data menyang console aplikasi - ConsoleAppender ;
  • kanggo nulis log menyang database - JDBCAppender ;
  • kanggo ngontrol transmisi liwat TCP/IP - TelnetAppender ;
  • kanggo mesthekake yen logging ora mengaruhi kinerja - AsyncAppender .
Ana sawetara implementasine liyane: dhaptar lengkap bisa ditemokake ing kene . Miturut cara, yen appender sing dibutuhake ora kasedhiya, iki ora dadi masalah. Sampeyan bisa nulis appender dhewe kanthi ngetrapake antarmuka Appender , sing mung nampa log4j.

Node logging

Kanggo demonstrasi kita bakal nggunakake antarmuka slf4j, lan implementasine saka log4j. Nggawe logger gampang banget: sampeyan kudu nulis ing ngisor iki ing kelas sing jenenge MainDemo, ing ngendi logging bakal ditindakake:
org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(MainDemo.class);
Iki bakal nggawe logger kanggo kita. Kanggo nggawe entri log, sampeyan bisa nggunakake akeh cara sing nuduhake ing tingkat apa entri bakal digawe. Tuladhane:
logger.trace("Method 1 started with argument={}", argument);
logger.debug("Database updated with script = {}", script);
logger.info("Application has started on port = {}", port);
logger.warn("Log4j didn't find log4j.properties. Please, provide them");
logger.error("Connection refused to host = {}", host);
Sanadyan kita liwat kelas, ing pungkasan iku jeneng lengkap kelas karo paket sing ditulis mudhun. Iki rampung supaya sampeyan bisa dibagi log menyang simpul, lan ngatur tingkat logging lan appender kanggo saben simpul. Contone, jeneng kelas: com.github.romankh3.logginglecture.MainDemo- logger digawe ing. Lan iki carane bisa dipérang dadi simpul logging. Simpul utama yaiku RootLogger null . Iki minangka simpul sing nampa kabeh log saka kabeh aplikasi. Liyane bisa digambarake kaya ing ngisor iki: Logging: apa, carane, ngendi lan karo apa?  - 4Appenders ngatur karyane khusus ing simpul log. Saiki, nggunakake log4j.properties minangka conto , kita bakal ndeleng carane ngatur.

Langkah dening langkah persiyapan saka Log4j.properties

Saiki kita bakal nyetel kabeh langkah demi langkah lan ndeleng apa sing bisa ditindakake:
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
Baris iki nyatakake yen kita ndhaptar appender CONSOLE sing nggunakake implementasine org.apache.log4j.ConsoleAppender. Appender iki nulis data menyang console. Sabanjure, ayo ndhaptar appender liyane sing bakal nulis menyang file:
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
Penting kanggo dicathet yen appenders isih kudu dikonfigurasi. Sawise kita wis kadhaptar appenders, kita bisa nemtokake apa tingkat logging bakal ing node lan appenders bakal digunakake.

log4j.rootLogger=DEBUG, CONSOLE, FILE

  • log4j.rootLogger tegese kita bakal ngatur simpul utama, sing ngemot kabeh log;
  • sawise tandha witjaksono, tembung pisanan nuduhake ing tingkat apa lan luwih dhuwur log bakal direkam (ing kasus kita, iki DEBUG);
  • banjur sawise koma kabeh appenders sing bakal digunakake dituduhake.
Kanggo ngatur simpul logging tartamtu, sampeyan kudu nggunakake entri ing ngisor iki:
log4j.logger.com.github.romankh3.logginglecture=TRACE, OWN, CONSOLE
ing ngendi log4j.logger.digunakake kanggo ngatur simpul tartamtu, ing kasus kita com.github.romankh3.logginglecture. lan saiki ayo ngomong babagan nyetel appender CONSOLE:
# CONSOLE appender customisation
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.threshold=DEBUG
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-5p] : %c:%L : %m%n
Ing kene kita bisa ndeleng manawa kita bisa nyetel level sing bakal diproses appender. Kahanan nyata: pesen kanthi level info ditampa dening simpul log lan diterusake menyang appender sing ditugasake, nanging appender, kanthi level peringatan lan luwih dhuwur, nampa log iki, nanging ora nindakake apa-apa. Sabanjure, sampeyan kudu mutusake cithakan apa sing bakal ana ing pesen kasebut. Aku nggunakake PatternLayout ing conto, nanging ana akeh solusi metu ana. Padha ora bakal dibeberke ing artikel iki. Conto nyetel appender FILE:
# File appender customisation
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=./target/logging/logging.log
log4j.appender.FILE.MaxFileSize=1MB
log4j.appender.FILE.threshold=DEBUG
log4j.appender.FILE.MaxBackupIndex=2
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[ %-5p] - %c:%L - %m%n
Ing kene sampeyan bisa ngatur file sing bakal ditulis log, kaya sing bisa dideleng
log4j.appender.FILE.File=./target/logging/logging.log
Rekaman kasebut menyang file logging.log. Kanggo ngindhari masalah karo ukuran file, sampeyan bisa nyetel maksimum: ing kasus iki, 1MB. MaxBackupIndex - ngandhani carane akeh file kasebut bakal ana. Yen luwih saka nomer iki digawe, file pisanan bakal dibusak. Kanggo ndeleng conto nyata ing ngendi logging dikonfigurasi, sampeyan bisa pindhah menyang repositori mbukak ing GitHub.

Ayo nggabungake asil

Coba tindakake kabeh sing diterangake dhewe:
  • Gawe proyek sampeyan dhewe sing padha karo conto ing ndhuwur.
  • Yen sampeyan duwe kawruh babagan nggunakake Maven, kita bakal nggunakake; yen ora, iki link menyang artikel sing nerangake carane nyambungake perpustakaan.

Ayo padha nyimpulake

  1. Kita ngomong babagan solusi apa sing ana ing Jawa.
  2. Meh kabeh perpustakaan logging sing dikenal ditulis ing kontrol siji wong :D
  3. Kita sinau apa sing kudu dicathet lan apa sing ora.
  4. Kita nemtokake tingkat logging.
  5. Kita kenal karo node logging.
  6. We katon ing apa appender lan apa iku kanggo.
  7. Kita ngatur file log4j.proteties langkah dening langkah.

Bahan tambahan

  1. JavaRush: Logging. Unwind bal saka stectrace
  2. JavaRush: Kuliah Logger
  3. Habr: Jawa logging. Hello donya
  4. Habr: Java logging: crita ngipi elek
  5. Youtube: Kursus Golovach. logging. Part 1 , Part 2 , Part 3 , Part 4
  6. Log4j: lampiran
  7. Log4j: tata letak
Deleng uga artikelku liyane:
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION