System.out.println vs Loggers

1. Mengapa Loggers?

Saat menulis program atau mengembangkan aplikasi produksi perusahaan, menggunakan System.out.println tampaknya menjadi pilihan yang paling sederhana dan termudah. Tidak ada pustaka tambahan yang akan ditambahkan ke classpath dan tidak ada konfigurasi tambahan yang harus dibuat.

Tetapi menggunakan System.out.println hadir dengan beberapa kelemahan yang mempengaruhi kegunaannya dalam banyak situasi. Dalam tutorial ini, kita akan membahas mengapa dan kapan kita ingin menggunakan Logger melalui System.out dan System.err yang lama . Kami juga akan menunjukkan beberapa contoh cepat menggunakan kerangka kerja logging Log4J2.

2. Penyiapan

Sebelum kita mulai, mari kita lihat dependensi dan konfigurasi Maven yang diperlukan.

2.1. Dependensi Maven

Mari kita mulai dengan menambahkan ketergantungan Log4J2 ke pom.xml kita :

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

Kami dapat menemukan versi terbaru dari log4j-api dan log4j-core di Maven Central.

2.2. Konfigurasi Log4J2

Penggunaan System.out tidak memerlukan konfigurasi tambahan apa pun. Namun, untuk menggunakan Log4J2, kita memerlukan file konfigurasi log4j.xml :

Hampir semua kerangka kerja logger akan memerlukan beberapa tingkat konfigurasi, baik secara terprogram atau melalui file konfigurasi eksternal, seperti file XML yang ditampilkan di sini.

3. Memisahkan Output Log

3.1. System.out dan System.err

Saat kami menerapkan aplikasi kami ke server seperti Tomcat, server menggunakan pencatatnya sendiri. Jika kita menggunakan System.out , log berakhir di catalina.out . Jauh lebih mudah untuk men-debug aplikasi kita jika log diletakkan di file terpisah. Dengan Log4j2, kita perlu menyertakan file appender dalam konfigurasi untuk menyimpan log aplikasi dalam file terpisah.

Selain itu, dengan System.out.println , tidak ada kontrol atau pemfilteran log mana yang akan dicetak. Satu-satunya cara yang mungkin untuk memisahkan log adalah dengan menggunakan System.out.println untuk log informasi dan System.err.println untuk log kesalahan:

System.out.println("This is an informational message"); System.err.println("This is an error message");

3.2. Tingkat Pencatatan Log4J2

Dalam lingkungan debug atau pengembangan, kami ingin melihat semua informasi yang dicetak aplikasi. Namun dalam aplikasi perusahaan langsung, lebih banyak log berarti peningkatan latensi. Kerangka kerja logger seperti Log4J2 menyediakan beberapa kontrol level log:

  • FATAL
  • KESALAHAN
  • MEMPERINGATKAN
  • INFO
  • DEBUG
  • JEJAK
  • SEMUA

Dengan menggunakan level ini, kita dapat dengan mudah memfilter kapan dan di mana akan mencetak informasi apa :

logger.trace("Trace log message"); logger.debug("Debug log message"); logger.info("Info log message"); logger.error("Error log message"); logger.warn("Warn log message"); logger.fatal("Fatal log message");

Kami juga dapat mengonfigurasi level untuk setiap paket kode sumber secara individual. Untuk detail selengkapnya tentang konfigurasi tingkat log, lihat artikel Java Logging kami.

4. Menulis Log ke File

4.1. Mengubah Rute System.out dan System.err

Dimungkinkan untuk merutekan System.out.println ke file menggunakan metode System.setOut () :

PrintStream outStream = new PrintStream(new File("outFile.txt")); System.setOut(outStream); System.out.println("This is a baeldung article");

Dan dalam kasus System.err :

PrintStream errStream = new PrintStream(new File("errFile.txt")); System.setErr(errStream); System.err.println("This is a baeldung article error");

Saat mengarahkan output ke file menggunakan System.out atau System.err , kami tidak dapat mengontrol ukuran file , sehingga file terus bertambah selama menjalankan aplikasi.

Seiring bertambahnya ukuran file, mungkin sulit untuk membuka atau menganalisis log yang lebih besar ini.

4.2. Masuk ke File Dengan Log4J2

Log4J2 menyediakan mekanisme untuk menulis log di file secara sistematis dan juga menggulung file berdasarkan kebijakan tertentu. Misalnya, kita dapat mengonfigurasi file yang akan digulirkan berdasarkan pola tanggal / waktu :

Atau kita dapat menggulung file berdasarkan ukuran setelah mencapai ambang tertentu :

...   %d{yyyy-MM-dd HH:mm:ss} %p %m%n      

5. Masuk ke Sistem Eksternal

Seperti yang telah kita lihat di bagian sebelumnya, kerangka kerja logger memungkinkan penulisan log ke file. Demikian pula, mereka juga menyediakan appenders untuk mengirim log ke sistem dan aplikasi lain . Hal ini memungkinkan untuk mengirim log ke Aliran Kafka atau database Elasticsearch menggunakan appenders Log4J daripada menggunakan System.out.println.

Silakan merujuk ke artikel appender Log4j kami untuk rincian lebih lanjut tentang bagaimana menggunakan appender tersebut.

6. Menyesuaikan Output Log

Dengan menggunakan Logger, kita dapat menyesuaikan informasi apa yang akan dicetak bersama dengan pesan yang sebenarnya. Informasi yang dapat kita cetak meliputi nama paket, level log, nomor baris, stempel waktu, nama metode, dll.

While this would be possible with System.out.println, it would require a lot of manual work, while logging frameworks provide this functionality out of the box. With loggers, we can simply define a pattern in the logger configuration:

If we consider Log4J2 for our logger framework, there are several patterns that we can choose from or customize. Refer to the official Log4J2 documentation to learn more about them.

7. Conclusion

This article explains various reasons why to use a logger framework and why not to rely only on System.out.println for our application logs. While it is justifiable to use System.out.println for small test programs, we'd prefer not to use it as our main source of logging for an enterprise production application.

As always, the code examples in the article are available over on GitHub.