Pengenalan ke Log4j2 - Penambah, Tata Letak, dan Filter

1. Ikhtisar

Peristiwa pencatatan merupakan aspek penting dari pengembangan perangkat lunak. Meskipun ada banyak kerangka kerja yang tersedia di ekosistem Java, Log4J telah menjadi yang paling populer selama beberapa dekade, karena fleksibilitas dan kesederhanaan yang disediakannya.

Log4j 2 adalah versi baru dan lebih baik dari kerangka kerja Log4j klasik.

Dalam artikel ini, kami akan memperkenalkan appender, tata letak, dan filter yang paling umum melalui contoh praktis.

Di Log4J2, appender hanyalah tujuan untuk kejadian log; dapat sesederhana konsol dan dapat menjadi kompleks seperti RDBMS lainnya. Tata letak menentukan bagaimana log akan disajikan dan memfilter data sesuai dengan berbagai kriteria.

2. Penyiapan

Untuk memahami beberapa komponen logging dan konfigurasinya, mari kita siapkan kasus penggunaan uji yang berbeda, masing-masing terdiri dari file konfigurasi log4J2.xml dan kelas uji JUnit 4 .

Dua dependensi maven umum untuk semua contoh:

 org.apache.logging.log4j log4j-core 2.7   org.apache.logging.log4j log4j-core 2.7 test-jar test 

Selain paket log4j-core utama, kita perlu menyertakan 'test jar' yang termasuk dalam paket tersebut untuk mendapatkan akses ke aturan konteks yang diperlukan untuk menguji file konfigurasi dengan nama yang tidak umum.

3. Konfigurasi Default

ConsoleAppender adalah konfigurasi default dari paket inti Log4J 2 . Ini mencatat pesan ke konsol sistem dalam pola sederhana:

Mari kita menganalisis tag dalam konfigurasi XML sederhana ini:

  • Konfigurasi : Elemen root dari file konfigurasi Log4J 2 dan status atribut adalah tingkat peristiwa Log4J internal yang ingin kita catat
  • Penambah : Elemen ini memegang satu atau lebih pelengkap. Di sini kita akan mengonfigurasi appender yang menghasilkan ke konsol sistem secara standar
  • Logger : Elemen ini dapat terdiri dari beberapa elemen Logger yang dikonfigurasi . Dengan tag Root khusus , Anda dapat mengonfigurasi logger standar tanpa nama yang akan menerima semua pesan log dari aplikasi. Setiap logger dapat disetel ke tingkat log minimum
  • AppenderRef : Elemen ini mendefinisikan referensi ke elemen dari bagian Appenders . Oleh karena itu atribut ' ref ' ditautkan dengan atribut appenders ' name '

Tes unit yang sesuai juga akan sederhana. Kami akan mendapatkan referensi Logger dan mencetak dua pesan:

@Test public void givenLoggerWithDefaultConfig_whenLogToConsole_thanOK() throws Exception { Logger logger = LogManager.getLogger(getClass()); Exception e = new RuntimeException("This is only a test!"); logger.info("This is a simple message at INFO level. " + "It will be hidden."); logger.error("This is a simple message at ERROR level. " + "This is the minimum visible level.", e); } 

4. ConsoleAppender Dengan PatternLayout

Mari kita tentukan appender konsol baru dengan pola warna yang disesuaikan dalam file XML terpisah, dan sertakan itu dalam konfigurasi utama kita:

File ini menggunakan beberapa variabel pola yang digantikan oleh Log4J 2 saat runtime:

  • % style {…} {colorname} : Ini akan mencetak teks pada pasangan kurung siku pertama ( ) dalam warna tertentu ( colorname ).
  • % highlight {…} {FATAL = colorname,…} : Ini mirip dengan variabel 'style'. Tetapi warna yang berbeda dapat diberikan untuk setiap level log.
  • % date {format} : Ini akan diganti dengan tanggal sekarang dalam format yang ditentukan . Di sini kami menggunakan format DateTime 'DEFAULT', ' yyyy -MM-dd HH: mm: ss, SSS' .
  • % -5level : Mencetak level pesan log dengan gaya rata kanan.
  • % message : Mewakili pesan log mentah

Tapi ada lebih banyak variabel dan pemformatan di PatternLayout . Anda dapat merujuk mereka ke dokumentasi resmi Log4J 2.

Sekarang kami akan menyertakan appender konsol yang ditentukan ke dalam konfigurasi utama kami:

Tes unit:

@Test public void givenLoggerWithConsoleConfig_whenLogToConsoleInColors_thanOK() throws Exception { Logger logger = LogManager.getLogger("CONSOLE_PATTERN_APPENDER_MARKER"); logger.trace("This is a colored message at TRACE level."); ... } 

5. Async File Appender Dengan JSONLayout dan BurstFilter

Terkadang berguna untuk menulis pesan log dengan cara asinkron. Misalnya, jika kinerja aplikasi memiliki prioritas di atas ketersediaan log.

Dalam kasus penggunaan seperti itu, kita dapat menggunakan AsyncAppender.

Untuk contoh kami, kami mengonfigurasi file log JSON asinkron . Selanjutnya, kami akan menyertakan filter burst yang membatasi output log pada kecepatan yang ditentukan:

   ...          ...        

Perhatikan itu:

  • The JSONLayout dikonfigurasi dengan cara, yang menulis peristiwa satu log per baris
  • The BurstFilter akan turun setiap peristiwa dengan tingkat 'INFO' dan di atas jika ada lebih dari dua dari mereka, tetapi pada maksimal 10 turun peristiwa
  • The AsyncAppender diatur ke buffer 80 pesan log; setelah itu, buffer di-flush ke file log

Mari kita lihat pengujian unit yang sesuai. Kami mengisi buffer yang ditambahkan dalam satu lingkaran, membiarkannya menulis ke disk dan memeriksa jumlah baris file log:

@Test public void givenLoggerWithAsyncConfig_whenLogToJsonFile_thanOK() throws Exception { Logger logger = LogManager.getLogger("ASYNC_JSON_FILE_APPENDER"); final int count = 88; for (int i = 0; i  0 && logEventsCount <= count); }

6. RollingFile Appender dan XMLLayout

Selanjutnya, kami akan membuat file log bergulir. Setelah ukuran file dikonfigurasi, file log akan dikompresi dan diputar.

Kali ini kami menggunakan layout XML :

Perhatikan itu:

  • The RollingFile appender memiliki 'filePattern' atribut, yang digunakan untuk nama file log diputar dan dapat dikonfigurasi dengan variabel placeholder. Dalam contoh kami, itu harus berisi tanggal dan penghitung sebelum akhiran file.
  • Konfigurasi default XMLLayout akan menulis objek peristiwa log tunggal tanpa elemen root.
  • Kami menggunakan kebijakan berbasis ukuran untuk merotasi file log kami.

Kelas pengujian unit kami akan terlihat seperti yang ada di bagian sebelumnya:

@Test public void givenLoggerWithRollingFileConfig_whenLogToXMLFile_thanOK() throws Exception { Logger logger = LogManager.getLogger("XML_ROLLING_FILE_APPENDER"); final int count = 88; for (int i = 0; i < count; i++) { logger.info( "This is rolling file XML message #{} at INFO level.", i); } }

7. Penambah Syslog

Katakanlah kita perlu mengirim peristiwa yang dicatat ke mesin jarak jauh melalui jaringan. Cara termudah untuk melakukannya menggunakan Log4J2 akan menggunakan Syslog Appender:

   ...     ...        

Atribut di tag Syslog :

  • name : mendefinisikan nama appender, dan harus unik. Karena kita dapat memiliki beberapa appender Syslog untuk aplikasi dan konfigurasi yang sama
  • format : dapat diatur ke BSD atau RFC5424, dan catatan Syslog akan diformat sesuai
  • host & port : nama host dan port mesin server Syslog jarak jauh
  • protokol : apakah akan menggunakan TCP atau UPD
  • fasilitas : ke fasilitas Syslog tempat acara akan ditulis
  • connectTimeoutMillis : periode waktu menunggu koneksi dibuat, defaultnya nol
  • reconnectionDelayMillis : waktu untuk menunggu sebelum mencoba kembali koneksi

8. FailoverAppender

Now there may be instances where one appender fails to process the log events and we do not want to lose the data. In such cases, the FailoverAppender comes handy.

For example, if the Syslog appender fails to send events to the remote machine, instead of losing that data we might fall back to FileAppender temporarily.

The FailoverAppender takes a primary appender and number of secondary appenders. In case the primary fails, it tries to process the log event with secondary ones in order until one succeeds or there aren't any secondaries to try:

Let's test it:

@Test public void givenLoggerWithFailoverConfig_whenLog_thanOK() throws Exception { Logger logger = LogManager.getLogger("FAIL_OVER_SYSLOG_APPENDER"); Exception e = new RuntimeException("This is only a test!"); logger.trace("This is a syslog message at TRACE level."); logger.debug("This is a syslog message at DEBUG level."); logger.info("This is a syslog message at INFO level. This is the minimum visible level."); logger.warn("This is a syslog message at WARN level."); logger.error("This is a syslog message at ERROR level.", e); logger.fatal("This is a syslog message at FATAL level."); }

9. JDBC Appender

Penambah JDBC mengirimkan peristiwa log ke RDBMS, menggunakan JDBC standar. Koneksi dapat diperoleh baik menggunakan Sumber Data JNDI atau pabrik koneksi apa pun.

Konfigurasi dasar terdiri dari DataSource atau ConnectionFactory , ColumnConfigs, dan tableName:

Sekarang mari kita coba:

@Test public void givenLoggerWithJdbcConfig_whenLogToDataSource_thanOK() throws Exception { Logger logger = LogManager.getLogger("JDBC_APPENDER"); final int count = 88; for (int i = 0; i < count; i++) { logger.info("This is JDBC message #{} at INFO level.", count); } Connection connection = ConnectionFactory.getConnection(); ResultSet resultSet = connection.createStatement() .executeQuery("SELECT COUNT(*) AS ROW_COUNT FROM logs"); int logCount = 0; if (resultSet.next()) { logCount = resultSet.getInt("ROW_COUNT"); } assertTrue(logCount == count); }

10. Kesimpulan

Artikel ini menunjukkan contoh yang sangat sederhana tentang bagaimana Anda dapat menggunakan appender logging yang berbeda, filter dan tata letak dengan Log4J2 dan cara untuk mengkonfigurasinya.

Contoh yang menyertai artikel tersedia di GitHub.