CodeGym /Blog Jawa /Acak /Java Logging
John Squirrels
tingkat
San Francisco

Java Logging

Diterbitake ing grup
Hi! Nalika nulis pawulangan, aku utamané nandheske yen ana topik tartamtu sing bakal pancen penting ing karya nyata. Dadi, LISTEN UP! Topik sing bakal kita bahas dina iki mesthi bakal migunani ing kabeh proyek sampeyan wiwit dina pertama kerja. Kita bakal ngomong babagan Java Logging. Topik iki ora rumit (aku malah ngomong gampang). Nanging sampeyan bakal duwe cukup prekara sing jelas kanggo ditekan ing proyek sing sepisanan, mula luwih becik sampeyan ngerti kanthi lengkap saiki :) Inggih, ayo miwiti.

Apa logging ing Jawa?

Logging minangka tumindak ngrekam data babagan operasi program. Panggonan ing ngendi kita ngrekam data kasebut diarani "log". Loro pitakonan langsung muncul: data apa sing ditulis lan ing ngendi? Ayo dadi miwiti karo "ngendi". Sampeyan bisa nulis data babagan karya program ing macem-macem panggonan. Contone, nalika sinau, sampeyan kerep System.out.println()kanggo output data menyang console. Iki pancen logging, sanajan ing wangun sing paling gampang. Mesthi, iki ora trep banget kanggo pangguna utawa tim dhukungan produk: jelas, dheweke ora pengin nginstal IDE lan ngawasi konsol :) Ana format sing luwih umum kanggo ngrekam informasi: file teks. Manungsa luwih seneng maca data ing format iki, lan mesthi luwih trep kanggo nyimpen data! Saiki pitakonan kapindho: data program apa sing kudu dicathet? Iku kabeh nganti sampeyan! Sistem logging Jawa fleksibel banget. Sampeyan bisa ngatur kanggo log kabeh sing program Panjenengan. Ing tangan siji, iki apik. Nanging ing sisih liya, bayangake sepira gedhene log Facebook utawa Twitter yen ditulis kabeh. Perusahaan gedhe iki bisa uga duwe kemampuan kanggo nyimpen data sing akeh. Nanging mbayangno carane angel golek informasi babagan kesalahan kritis ing 500 gigabyte log teks? Iku bakal luwih ala tinimbang nggoleki jarum ing tumpukan jerami. Mulane, Jawa bisa dikonfigurasi kanggo log mung data kesalahan. Utawa malah mung kasalahan kritis! Sing jarene, ora sakabehe akurat kanggo ngomong babagan sistem logging asli Jawa. Kasunyatane yaiku programer mbutuhake logging sadurunge fungsi iki ditambahake ing basa kasebut. Nalika Jawa ngenalake perpustakaan logging dhewe, kabeh wong wis nggunakake perpustakaan log4j. Sejarah logging ing tanah Jawa pancen dawa banget lan informatif. Singkate, Jawa duwe perpustakaan logging dhewe, nanging meh ora ana sing nggunakake :) Mengko, nalika sawetara perpustakaan logging beda muncul lan wiwit digunakake dening programer, masalah kompatibilitas muncul. Kanggo mungkasi wong saka reinventing setir ing rolas perpustakaan beda karo antarmuka beda, digawe framework SLF4J abstrak ("Service Logging Facade Kanggo Jawa") digawe. Iku diarani abstrak, amarga sanajan sampeyan nggunakake lan nelpon cara saka kelas SLF4J, ing hood padha bener nggunakake kabeh frameworks logging sing teka sadurunge: log4j, java.util.logging standar, lan liya-liyane. Yen ing sawetara titik sampeyan perlu sawetara fitur tartamtu saka Log4j kurang ing perpustakaan liyane, nanging sampeyan ora pengin langsung link project kanggo perpustakaan iki, mung nggunakake SLF4J. Lan banjur nelpon cara Log4j. Yen sampeyan ngganti pikiran lan mutusake manawa sampeyan ora butuh fitur Log4j maneh, sampeyan mung kudu ngatur maneh "kene , lan perpustakaan Log4j kene . Sabanjure, unpack arsip lan gunakake IntelliJ IDEA kanggo nambah file JAR menyang classpath. Item menu: File -> Struktur Proyek -> Pustaka Pilih file JAR sing dibutuhake lan tambahake menyang proyek kasebut (arsip sing diundhuh ngemot akeh file JAR - deleng gambar kanggo ndeleng sing dibutuhake) Elinga yen instruksi iki kanggo siswa kasebut Napa kita kudu logging - 2Napa kita kudu logging - 3. sing ora ngerti carane nggunakake Maven. Yen sampeyan ngerti carane nggunakake Maven, iku biasane luwih (luwih gampang) nyoba kanggo miwiti ana. Yen sampeyan nggunakake Maven , tambahake dependensi iki:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
apik tenan! We figured metu setelan :) Ayo kang ndeleng carane SLF4J dianggo. Kepiye carane nggawe manawa karya program kasebut direkam ing endi wae? Kanggo nindakake iki, kita butuh rong perkara: logger lan appender. Ayo dadi miwiti karo pisanan. Logger minangka obyek sing nyedhiyakake kontrol logging kanthi lengkap. Nggawe logger gampang banget: kita nindakake iki nggunakake cara statis LoggerFactory.getLogger () . Parameter metode yaiku kelas sing operasi bakal dicathet. Ayo mbukak kode kita:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
Output konsol:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
Apa sing kita deleng ing kene? Kaping pisanan, kita ndeleng pesen kesalahan. Iki minangka akibat saka kasunyatan manawa saiki kita ora duwe setelan sing dibutuhake. Mulane, logger kita saiki mung bisa ngirim pesen kesalahan (ERROR) lan mung menyang console. Cara logger.info() ora bisa. Nanging logger.error() iya! Ing konsol, kita ndeleng tanggal saiki, cara kesalahan kedadeyan ( utama), tembung "ERROR", lan pesen kita! ERROR minangka level logging. Umumé, yen entri log ditandhani karo tembung "ERROR", banjur ana kesalahan ing titik iki ing program. Yen entri kasebut ditandhani nganggo tembung "INFO", pesen kasebut mung nuduhake informasi saiki babagan operasi normal program kasebut. Perpustakaan SLF4J duwe macem-macem level logging sing ngidini sampeyan ngatur log kanthi fleksibel. Kabeh iku gampang banget kanggo ngatur: kabeh logika sing dibutuhake wis ana ing kelas Java Logger . Sampeyan mung kudu nelpon cara sing cocog. Yen sampeyan pengin mlebu pesen rutin, nelpon cara logger.info() . Kanggo pesen kesalahan, gunakake logger.error() . Kanggo bebaya, gunakake logger.warn()

Saiki ayo ngomong babagan appender

Appender minangka papan kanggo data sampeyan. Ing cara, ngelawan saka sumber data, IE "titik B". Kanthi gawan, data diowahi menyang console. Elinga yen ing conto sadurunge kita ora kudu ngatur apa-apa: teks katon ing console, lan log4j perpustakaan log4j mung bisa output pesen ERROR-tingkat kanggo console. Temenan, luwih trep kanggo wong maca lan nulis log ing file teks. Kanggo ngganti prilaku standar logger, kita kudu ngatur appender file. Kanggo miwiti, sampeyan kudu nggawe file log4j.xml langsung ing folder src. Sampeyan wis kenal karo format XML: kita bubar sinau babagan iki :) Iki isi file kasebut:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
Ora ana sing khusus utawa angel ing kene :) Nanging, ayo dideleng konten kasebut.
<Configuration status="INFO">
Iki sing diarani StatusLogger. Ora ana hubungane karo logger lan digunakake ing proses internal Log4j. Yen sampeyan nyetel status = "TRACE" tinimbang status = "INFO", lan kabeh informasi babagan karya internal Log4j bakal ditampilake ing console (StatusLogger nampilake data ing console, sanajan appender kita minangka file). Saiki kita ora butuh, mula ayo ditinggalake.

<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
Kene kita nggawe appender kita. Tag <File> nuduhake yen bakal dadi appender file. name = "MyFileAppender" nyetel jeneng appender. fileName = "C:\Users\Username\Desktop\testlog.txt" nuduhake path menyang file log ngendi kabeh data bakal ditulis. append="true" nuduhake manawa data kudu ditulis ing mburi file. Ing kasus kita, iki persis sing bakal kita lakoni. Yen sampeyan nyetel nilai dadi palsu, banjur isi lawas file log bakal dibusak saben wektu program diwiwiti. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>nuduhake setelan format. Ing kene kita bisa nggunakake ekspresi reguler kanggo ngatur format teks ing log kita.

<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
Ing kene kita nuduhake level root. Kita wis nyetel level "INFO", tegese kabeh pesen sing levele luwih dhuwur tinimbang INFO (miturut tabel sing kita deleng ing ndhuwur) ora bakal dicathet. Program kita bakal duwe 3 pesen: siji INFO, siji WARN lan siji ERROR. Kanthi konfigurasi saiki, kabeh 3 pesen bakal mlebu. Yen sampeyan ngganti tingkat ROOT kanggo ERROR, mung pesen pungkasan saka LOGGER.error () telpon cara bakal mungkasi munggah ing log. Kajaba iku, referensi kanggo appender uga ana ing kene. Kanggo nggawe referensi kasebut, sampeyan kudu nggawe tag <ApprenderRef> ing tag <Root> lan nambah atribut ref = 'jeneng appender sampeyan' . Yen sampeyan lali, ing kene kita nyetel jeneng appender: <. Lan iki kode kita!

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
Mesthi, iku sethitik whacky (nyekel RuntimeException idea pitakonan), nanging iku sampurna kanggo tujuan kita :) Ayo kita mbukak utama () cara 4 kaping saurutan lan katon ing file testlog.txt. Sampeyan ora perlu nggawe sadurunge: perpustakaan bakal nindakake iki kanthi otomatis. Kabeh bisa! :) Saiki sampeyan duwe logger sing wis dikonfigurasi. Sampeyan bisa muter-muter karo sawetara program lawas, nambah telpon logger kanggo saben cara. Banjur deleng log sing diasilake :) Iku nganggep topik logging kanthi jero. Iku bakal tantangan kanggo maca kabeh ing siji lungguh. Sing jarene, ngemot akeh informasi tambahan sing migunani. Contone, sampeyan bakal sinau carane ngatur logger supaya nggawe file teks anyar yen kita testlog.txt file tekan ukuran tartamtu :) Lan rampung kelas kita! Dina iki sampeyan wis kenal karo topik sing penting banget, lan kawruh iki mesthi bakal mbantu sampeyan ing karya ing mangsa ngarep. Nganti wektu sabanjure! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION