Pengantar Java Logging

1. Ikhtisar

Logging adalah bantuan yang ampuh untuk memahami dan men-debug perilaku run-time program. Log menangkap dan menyimpan data penting dan membuatnya tersedia untuk analisis kapan saja.

Artikel ini membahas framework logging java paling populer, Log4j 2 dan Logback, bersama dengan pendahulunya Log4j, dan secara singkat menyentuh SLF4J, fasad logging yang menyediakan antarmuka umum untuk framework logging yang berbeda.

2. Mengaktifkan Logging

Semua kerangka kerja logging yang dibahas dalam artikel berbagi gagasan tentang logger, appenders, dan tata letak. Mengaktifkan logging di dalam proyek mengikuti tiga langkah umum:

  1. Menambahkan perpustakaan yang dibutuhkan
  2. Konfigurasi
  3. Menempatkan pernyataan log

Bagian yang akan datang membahas langkah-langkah untuk setiap kerangka secara individual.

3. Log4j 2

Log4j 2 adalah versi baru dan lebih baik dari kerangka kerja logging Log4j. Peningkatan yang paling menarik adalah kemungkinan pembuatan log asinkron. Log4j 2 membutuhkan pustaka berikut:

 org.apache.logging.log4j log4j-api 2.6.1   org.apache.logging.log4j log4j-core 2.6.1 

Versi terbaru dari log4j-api dapat Anda temukan di sini dan log4j-core - di sini.

3.1. Konfigurasi

Konfigurasi Log4j 2 didasarkan pada file log4j.xml konfigurasi utama . Hal pertama yang harus dikonfigurasi adalah appender.

Ini menentukan ke mana pesan log akan dirutekan. Tujuan dapat berupa konsol, file, soket, dll.

Log4j 2 memiliki banyak pelengkap untuk tujuan yang berbeda, Anda dapat menemukan informasi lebih lanjut di situs resmi Log4j 2.

Mari kita lihat contoh konfigurasi sederhana:

Anda dapat menetapkan nama untuk setiap appender, misalnya menggunakan konsol nama sebagai ganti stdout .

Perhatikan elemen PatternLayout - ini menentukan bagaimana pesan akan terlihat. Dalam contoh kita, pola diatur berdasarkan parameter pola , di mana % d menentukan pola tanggal, % p - keluaran tingkat log, % m - keluaran pesan yang dicatat dan % n - menambahkan simbol baris baru. Info lebih lanjut tentang pola dapat Anda temukan di halaman resmi Log4j 2.

Terakhir - untuk mengaktifkan appender (atau beberapa), Anda perlu menambahkannya bagian:

3.2. Masuk ke File

Terkadang Anda perlu menggunakan logging ke file, jadi kami akan menambahkan fout logger ke konfigurasi kami:

   %d{yyyy-MM-dd HH:mm:ss} %-5p %m%nw   

Penambah file memiliki beberapa parameter yang dapat dikonfigurasi:

  • file - menentukan nama file dari file log
  • append - Nilai default untuk param ini adalah true, artinya secara default, File appender akan menambahkan ke file yang sudah ada dan tidak memotongnya.
  • PatternLayout yang dijelaskan di contoh sebelumnya.

Untuk mengaktifkan File appender, Anda perlu menambahkannya bagian:

3.3. Logging Asinkron

Jika Anda ingin membuat Log4j 2 asinkron, Anda perlu menambahkan pustaka disruptor LMAX ke pom.xml Anda . Disruptor LMAX adalah pustaka komunikasi antar-utas tanpa kunci.

Menambahkan pengganggu ke pom.xml:

 com.lmax disruptor 3.3.4 

Disruptor versi terbaru dapat ditemukan di sini.

Jika Anda ingin menggunakan disruptor LMAX, Anda perlu menggunakan dari pada dalam konfigurasi Anda.

Atau Anda dapat mengaktifkan pembuatan log asinkron dengan menyetel properti sistem Log4jContextSelector ke org.apache.logging.log4j.core.async.AsyncLoggerContextSelector .

Anda tentu saja dapat membaca lebih lanjut tentang konfigurasi logger async Log4j2 dan melihat beberapa diagram performa di halaman resmi Log4j2.

3.4. Pemakaian

Berikut ini adalah contoh sederhana yang menunjukkan penggunaan Log4j untuk logging:

import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; public class Log4jExample { private static Logger logger = LogManager.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

Setelah berjalan, aplikasi akan mencatat pesan berikut ke konsol dan file bernama baeldung.log:

2016-06-16 17:02:13 INFO Info log message 2016-06-16 17:02:13 ERROR Error log message

Jika Anda menaikkan level log root ke ERROR :

Outputnya akan terlihat seperti berikut:

2016-06-16 17:02:13 ERROR Error log message

Seperti yang Anda lihat, mengubah level log ke parameter atas menyebabkan pesan dengan level log lebih rendah tidak akan dicetak ke appenders.

Metode logger.error juga dapat digunakan untuk mencatat pengecualian yang terjadi:

try { // Here some exception can be thrown } catch (Exception e) { logger.error("Error log message", throwable); }

3.5. Konfigurasi Tingkat Paket

Katakanlah Anda perlu menampilkan pesan dengan tingkat log PELACAKAN - misalnya dari paket tertentu seperti com.baeldung.log4j2 :

logger.trace("Trace log message");

Untuk semua paket lain, Anda hanya ingin melanjutkan pencatatan pesan INFO.

Perlu diingat bahwa TRACE lebih rendah dari INFO level log root yang kami tentukan di konfigurasi.

To enable logging only for one of packages you need to add the following section before to your log4j.xml:

It will enable logging for com.baeldung.log4j package and your output will look like:

2016-06-16 17:02:13 TRACE Trace log message 2016-06-16 17:02:13 DEBUG Debug log message 2016-06-16 17:02:13 INFO Info log message 2016-06-16 17:02:13 ERROR Error log message

4. Logback

Logback is meant to be an improved version of Log4j, developed by the same developer who made Log4j.

Logback also has a lot more features compared to Log4j, with many of them being introduced into Log4j 2 as well. Here's a quick look at all of the advantages of Logback on the official site.

Let's start by adding the following dependency to the pom.xml:

 ch.qos.logback logback-classic 1.1.7 

This dependency will transitively pull in another two dependencies, the logback-core and slf4j-api. Note that the latest version of Logback can be found here.

4.1. Configuration

Let's now have a look at a Logback configuration example:

 # Console appender   # Pattern of log message for console appender %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n   # File appender  baeldung.log false  # Pattern of log message for file appender %d{yyyy-MM-dd HH:mm:ss} %-5p %m%n   # Override log level for specified package      

Logback uses SLF4J as an interface, so you need to import SLF4J's Logger and LoggerFactory.

4.2. SLF4J

SLF4J provides a common interface and abstraction for most of the Java logging frameworks. It acts as a facade and provides standardized API for accessing the underlying features of the logging framework.

Logback uses SLF4J as native API for its functionality. Following is the example using Logback logging:

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Log4jExample { private static Logger logger = LoggerFactory.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

The output will remain the same as in previous examples.

5. Log4J

Finally, let's have a look at the venerable Log4j logging framework.

At this point it's of course outdated, but worth discussing as it lays the foundation for its more modern successors.

Many of the configuration details match those discussed in Log4j 2 section.

5.1. Configuration

First of all you need to add Log4j library to your projects pom.xml:

 log4j log4j 1.2.17 

Here you should be able to find latest version of Log4j.

Lets take a look at a complete example of simple Log4j configuration with only one console appender:

is open tag of whole configuration which has one property – debug. It determines whether you want to add Log4j debug information to logs.

5.2. Usage

After you have added Log4j library and configuration you can use logger in your code. Lets take a look at a simple example:

import org.apache.log4j.Logger; public class Log4jExample { private static Logger logger = Logger.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); } }

6. Conclusion

Artikel ini menunjukkan contoh yang sangat sederhana tentang bagaimana Anda dapat menggunakan kerangka kerja logging yang berbeda seperti Log4j, Log4j2 dan Logback. Ini mencakup contoh konfigurasi sederhana untuk semua kerangka kerja yang disebutkan.

Contoh yang menyertai artikel dapat ditemukan di GitHub.