2.1 Logger pisanan - log4j

Kaya sing wis dingerteni, sejarah log diwiwiti kanthi System.err.println()output rekaman menyang konsol. Iki isih aktif digunakake kanggo debugging, contone, Intellij IDEA digunakake kanggo nampilake pesen kesalahan menyang console. Nanging pilihan iki ora duwe setelan, mula ayo nerusake.

Logger pisanan lan paling populer diarani Log4j. Iku solusi apik lan Highly customizable. Amarga macem-macem kahanan, keputusan iki ora nate mlebu ing JDK, sing ngganggu kabeh masarakat.

Logger iki ora mung bisa log, iki digawe dening programer kanggo programer lan ngidini kanggo ngatasi masalah sing terus-terusan muncul ing sambungan karo logging.

Kaya sing wis dingerteni, log ditulis ing pungkasan supaya sawetara wong bisa maca lan nyoba ngerti apa sing kedadeyan sajrone operasi program - apa lan kapan salah kaya sing dikarepake.

Ana log4jtelung perkara kanggo iki:

  • logging subpaket;
  • set appenders (asil);
  • setelan muat ulang panas.

Kaping pisanan, setelan kasebut log4jbisa ditulis kanthi cara supaya bisa mlebu ing siji paket lan mateni ing paket liyane. Contone, iku bisa kanggo ngaktifake log in ing com.codegym.server, nanging mateni ing com.codegym.server.payment. Iki nggawe bisa mbusak informasi sing ora perlu kanthi cepet saka log.

Kapindho, log4jngidini nulis asil logging menyang sawetara file log bebarengan. Lan output kanggo saben bisa diatur kanthi individu. Contone, ing siji file mung bisa nulis informasi babagan kesalahan serius, ing liyane - log saka modul tartamtu, lan ing katelu - log kanggo wektu tartamtu.

Saben file log wis disetel kanggo jinis tartamtu saka masalah samesthine. Iki banget nyederhanakake urip programer sing ora seneng nggoleki file log gigabyte kanthi manual.

Lan pungkasane, kaping telune, log4jngidini ngganti setelan log langsung nalika program kasebut mlaku, tanpa miwiti maneh. Iki migunani banget nalika perlu kanggo mbenerake karya log supaya bisa nemokake informasi tambahan babagan kesalahan tartamtu.

Penting! Ana rong versi log log4j: 1.2.x lan 2.xx , sing ora cocog karo siji liyane .

Sampeyan bisa nyambungake logger menyang proyek nggunakake kode:

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
  </dependency>
 
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
  </dependency>
</dependencies>

2.2 Log resmi pisanan - JUL: java.util.logging

Sawise kebun binatang penebang muncul ing komunitas Jawa, para pangembang JDKmutusake nggawe siji logger standar sing bakal digunakake saben wong. Iki carane logger muncul JUL: paket java.util.logging.

Nanging, sajrone pangembangane, pencipta logger njupuk minangka basis ora log4j, nanging varian saka logger saka IBM, sing dipengaruhi perkembangane. Kabar apik yaiku logger JULkalebu JDK, kabar sing ora apik yaiku sawetara wong sing nggunakake.

JUL

Ora mung pangembang JULnggawe "standar universal liyane" , dheweke uga nggawe tingkat logging dhewe, sing beda karo sing ditampa dening para penebang kayu populer ing wektu kasebut.

Lan iku masalah gedhe. Sawise kabeh, produk Javaasring diklumpukake saka perpustakaan sing akeh, lan saben perpustakaan kasebut duwe logger dhewe. Dadi perlu kanggo ngatur kabeh logger sing ana ing aplikasi kasebut.

Senajan logger dhewe cukup apik. 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 diwenehake khusus supaya bisa ngerti saka ngendi logging kasebut.

Mung kanthi rilis, para pangembang ngrampungake masalah penting, sawise iku JULpancen trep kanggo digunakake. Sadurunge iku, iku sawetara jinis logger tingkat kapindho.

Logger iki uga ndhukung ekspresi lambda lan evaluasi kesed. Miwiti Java 8, sampeyan bisa lulus Supplier<String>. Iki mbantu kanggo maca lan nggawe senar mung nalika iku pancene needed, lan ora saben wektu, kaya sadurunge.

Metode karo argumen Supplier<String> msgSupplierkaton kaya iki:

public void info(Supplier msgSupplier) {
   log(Level.INFO, msgSupplier);
}

2.3 Pembungkus logger pisanan - JCL: jakarta commons logging

Suwe-suwe ora ana standar siji-sijine ing antarane para penebang kayu, JULmesthine dadi siji, nanging luwih elek log4j, mula standar siji-sijine ora katon. Nanging kabeh kebun binatang logger muncul, sing saben-saben pengin dadi padha.

JCL

Nanging, pangembang Jawa biasa ora seneng yen meh saben perpustakaan duwe logger dhewe lan kudu dikonfigurasi kanthi cara khusus. Mulane, masyarakat mutusaké kanggo nggawe pambungkus khusus liwat penebang liyane - iki caraneJCL: jakarta commons logging

Lan maneh, proyek sing digawe kanggo dadi pimpinan, ora dadi siji. Sampeyan ora bisa nggawe pemenang, sampeyan mung bisa dadi pemenang. Fungsi kasebut JCLmiskin banget lan ora ana sing pengin nggunakake. Logger, dirancang kanggo ngganti kabeh logger, ketemu nasib sing padha JULora digunakake.

Sanajan wis ditambahake ing akeh perpustakaan sing dirilis dening komunitas Apache, kebun binatang para penebang kayu mung berkembang.

2.4 Logger pungkasan pisanan - Logback

Nanging ora mung kuwi. Pangembang log4jmutusake yen dheweke paling pinter (uga, umume wong nggunakake logger) lan mutusake kanggo nulis logger anyar sing apik sing bakal nggabungake kaluwihan log4jsaka logger liyane.

Penebang anyar diarani Logback. Iki logger sing mesthine bakal dadi logger tunggal sing bakal digunakake saben wong. Iku adhedhasar idea padha ing log4j.

Sampeyan bisa nyambungake logger iki menyang proyek nggunakake kode:


<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

Bedane ana ing Logback:

  • kinerja apik;
  • ditambahake dhukungan asli slf4j;
  • opsi nyaring ditambahi.

Kauntungan liyane saka logger iki yaiku nduweni setelan gawan sing apik banget. Lan sampeyan kudu ngatur logger mung yen sampeyan pengin ngganti soko. Uga, file setelan luwih diadaptasi menyang piranti lunak perusahaan - kabeh konfigurasi disetel minangka xml/.

Kanthi gawan, Logbackora mbutuhake setelan lan ngrekam kabeh log saka tingkat DEBUGlan ndhuwur. Yen sampeyan mbutuhake prilaku sing beda, bisa dikonfigurasi liwat xmlkonfigurasi:

<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>

2.5 Logger universal paling anyar - SLF4J: Prasaja Logging Facade kanggo Jawa

Suwene suwene bisa nemokake tegese emas ...

Ing taun 2006, salah sawijining pencipta log4jninggalake proyek kasebut lan mutusake kanggo nyoba maneh nggawe logger universal. Nanging wektu iki dudu logger anyar, nanging standar universal anyar (wrapper) sing ngidini logger beda bisa sesambungan bebarengan.

Iki logger jenenge slf4j — Simple Logging Facade for Java, iku bungkus mubeng log4j, JUL, common-loggins and logback. Logger iki ngrampungake masalah nyata - ngatur kebun binatang penebang, mula kabeh wong langsung nggunakake.

Kita kanthi heroik ngatasi masalah sing kita gawe dhewe. Kaya sing sampeyan ngerteni, kemajuan wis tekan titik sing nggawe bungkus ing bungkus ...

Bungkus dhewe kasusun saka rong bagéan:

  • API, sing digunakake ing aplikasi;
  • Implementasi sing ditambahake minangka dependensi kapisah kanggo saben logger.

Sampeyan bisa nyambungake logger menyang proyek nggunakake kode:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.17.2</version>
</dependency>

Cukup kanggo nyambungake implementasine sing bener lan mung: kabeh proyek bakal bisa digunakake.

2.6 Optimization ing slf4j

Slf4jndhukung kabeh fitur anyar kayata format string kanggo logging . Sadurunge iki ana masalah kuwi. Contone, sampeyan pengin nyithak pesen menyang log:

log.debug("User " + user + " connected from " + request.getRemoteAddr());

Ana masalah karo kode iki. Upaminipun aplikasi sampeyan bisa digunakake productionlan ora nulis apa wae menyang log DEBUG-messages, nanging metode kasebut log.debug()isih bakal diarani, lan nalika diarani, metode ing ngisor iki uga bakal diarani:

  • user.toString();
  • request.getRemoteAddr();

Nelpon cara iki slows mudhun aplikasi. Telpon kasebut mung dibutuhake sajrone debugging, nanging uga diarani.

Saka sudut pandang logika, masalah iki kudu ditanggulangi ing perpustakaan logging dhewe. Lan ing versi pisanan log4j solusi kasebut muncul:

if (log.isDebugEnabled()) {
    log.debug("User " + user + " connected from " + request.getRemoteAddr());
}

Tinimbang siji baris kanggo log, saiki kudu nulis telu. Kang dramatically worsened readability saka kode, lan sudo popularitas saka log4j.

Logger slf4jbisa rada nambah kahanan kanthi menehi logging cerdas. Iku katon kaya iki:

log.debug("User {} connected from {}", user, request.getRemoteAddr());

ngendi {}nuduhake sisipan bantahan sing liwati ing cara. Yaiku, sing pisanan {}cocog karo pangguna, sing nomer loro {}kanggo request.getRemoteAddr().

Parameter kasebut bakal digabung dadi pesen siji mung yen level logging ngidini logging. Ora sampurna, nanging luwih apik tinimbang kabeh opsi liyane.

Sawise iku, SLF4Jwiwit tuwuh kanthi cepet ing popularitas, saiki iki minangka solusi sing paling apik.

Mulane, kita bakal nimbang logging nggunakake conto bundel slf4j-log4j12.