Pengenalan kepada Log4j2 - Appenders, Layout dan Filter

1. Gambaran keseluruhan

Peristiwa pembalakan adalah aspek penting dalam pembangunan perisian. Walaupun terdapat banyak kerangka kerja yang tersedia di ekosistem Java, Log4J telah menjadi yang paling populer selama beberapa dekad, kerana fleksibilitas dan kesederhanaan yang disediakannya.

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

Dalam artikel ini, kami akan memperkenalkan lampiran, susun atur, dan penapis yang paling biasa melalui contoh praktikal.

Di Log4J2, pelamar hanyalah destinasi untuk acara log; ia semudah konsol dan boleh menjadi kompleks seperti RDBMS mana pun. Susun atur menentukan bagaimana log akan disajikan dan penapis menyaring data mengikut pelbagai kriteria.

2. Persediaan

Untuk memahami beberapa komponen log dan konfigurasi mereka, mari kita sediakan kes penggunaan ujian yang berbeza, masing-masing terdiri daripada fail konfigurasi log4J2.xml dan kelas ujian JUnit 4 .

Dua kebergantungan maven adalah perkara biasa bagi semua contoh:

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

Selain pakej log4j-core utama, kami perlu memasukkan 'test jar' milik pakej untuk mendapatkan akses ke peraturan konteks yang diperlukan untuk menguji fail konfigurasi yang jarang disebut.

3. Konfigurasi Lalai

ConsoleAppender adalah konfigurasi lalai dari pakej teras Log4J 2 . Ia memasukkan mesej ke konsol sistem dengan corak mudah:

Mari kita analisis tag dalam konfigurasi XML sederhana ini:

  • Konfigurasi : Elemen akar dari fail konfigurasi Log4J 2 dan status atribut adalah tahap peristiwa Log4J dalaman, yang ingin kita log
  • Appenders : Elemen ini mengandungi satu atau lebih appenders. Di sini kita akan mengkonfigurasi appender yang keluar ke konsol sistem pada standard standard
  • Pembalak : Elemen ini boleh terdiri daripada pelbagai elemen Logger yang dikonfigurasi . Dengan tag Root khas , anda boleh mengkonfigurasi logger standard tanpa nama yang akan menerima semua mesej log dari aplikasi. Setiap pembalak boleh ditetapkan ke tahap log minimum
  • AppenderRef : Elemen ini menentukan rujukan ke elemen dari bahagian Appenders . Oleh itu sifat ' ref ' dikaitkan dengan 'an appenders nama atribut'

Ujian unit yang sepadan juga mudah. Kami akan mendapatkan rujukan Logger dan mencetak dua mesej:

@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 tentukan pelengkap konsol baru dengan corak warna yang disesuaikan dalam fail XML yang berasingan, dan sertakannya dalam konfigurasi utama kami:

Fail ini menggunakan beberapa pemboleh ubah corak yang digantikan oleh Log4J 2 pada waktu runtime:

  • % style {…} {colorname} : Ini akan mencetak teks pada pasangan kurungan pertama ( ) dalam warna tertentu (nama kolon ).
  • % highlight {…} {FATAL = colorname,…} : Ini serupa dengan pemboleh ubah 'style'. Tetapi warna yang berbeza dapat diberikan untuk setiap tahap log.
  • % tarikh {format} : Ini diganti dengan tarikh semasa dalam format yang ditentukan . Di sini kita menggunakan format DateTime 'DEFAULT', ' yyyy -MM-dd HH: mm: ss, SSS' .
  • % -5level : Mencetak tahap mesej log dengan cara yang tepat.
  • % message : Merupakan mesej log mentah

Tetapi terdapat banyak lagi pemboleh ubah dan pemformatan dalam PatternLayout . Anda boleh merujuknya ke dokumentasi rasmi Log4J 2.

Sekarang kita akan memasukkan pelengkap konsol yang ditentukan ke dalam konfigurasi utama kami:

Ujian 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

Kadang-kadang berguna untuk menulis mesej log dengan cara yang tidak segerak. Contohnya, jika prestasi aplikasi lebih mengutamakan ketersediaan log.

Dalam kes penggunaan seperti itu, kita dapat menggunakan AsyncAppender.

Sebagai contoh, kami mengkonfigurasi fail log JSON tak segerak . Selanjutnya, kami akan menyertakan penuras burst yang menghadkan output log pada kadar yang ditentukan:

   ...          ...        

Perhatikan bahawa:

  • The JSONLayout dikonfigurasikan dengan cara, yang menulis acara satu log setiap baris
  • The BurstFilter akan jatuh setiap peristiwa dengan tahap 'INFO' dan ke atas jika terdapat lebih daripada dua daripada mereka, tetapi pada maksimum 10 jatuh acara
  • The AsyncAppender ditetapkan kepada penampan 80 mesej log; selepas itu, buffer dialirkan ke fail log

Mari lihat ujian unit yang sesuai. Kami mengisi buffer yang dilampirkan dalam satu gelung, biarkan ia menulis ke cakera dan periksa jumlah baris fail 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

Seterusnya, kami akan membuat fail log bergulir. Setelah ukuran fail dikonfigurasi, fail log akan dimampatkan dan diputar.

Kali ini kami menggunakan susun atur XML :

Perhatikan bahawa:

  • The RollingFile appender mempunyai atribut 'filePattern', yang digunakan untuk menamakan fail log diputar dan boleh ditetapkan dengan pembolehubah pemegang tempat. Dalam contoh kami, ia mesti mengandungi tarikh dan pembilang sebelum akhiran fail.
  • Konfigurasi lalai XMLLayout akan menulis objek peristiwa log tunggal tanpa elemen akar.
  • Kami menggunakan dasar berdasarkan ukuran untuk memutar fail log kami.

Kelas ujian unit kami akan kelihatan seperti kelas dari bahagian 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. Lampirkan Syslog

Katakan kita perlu menghantar acara yang dicatat ke mesin jauh melalui rangkaian. Cara termudah untuk melakukannya menggunakan Log4J2 adalah dengan menggunakan Syslog Appender:

   ...     ...        

Atribut dalam tag Syslog :

  • name : mentakrifkan nama pelamar, dan mesti unik. Oleh kerana kita boleh mempunyai beberapa appenders Syslog untuk aplikasi dan konfigurasi yang sama
  • format : ia boleh diatur ke BSD atau RFC5424, dan rekod Syslog akan diformat sesuai
  • host & port : nama host dan port mesin pelayan Syslog jauh
  • protokol : sama ada menggunakan TCP atau UPD
  • kemudahan : untuk kemudahan Syslog acara itu akan ditulis
  • connectTimeoutMillis : jangka masa menunggu sambungan yang terjalin, lalai menjadi sifar
  • reconnectionDelayMillis : masa untuk menunggu sebelum mencuba semula sambungan

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

Appendender JDBC menghantar peristiwa log ke RDBMS, menggunakan JDBC standard. Sambungan boleh diperoleh sama ada menggunakan Sumber Data JNDI atau mana-mana kilang sambungan.

Konfigurasi asas terdiri daripada DataSource atau ConnectionFactory , ColumnConfigs, dan tableName:

Sekarang mari kita mencuba:

@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. Kesimpulannya

Artikel ini menunjukkan contoh yang sangat mudah tentang bagaimana anda boleh menggunakan pelekat, penapis dan susun atur pembalakan yang berbeza dengan Log4J2 dan cara untuk mengkonfigurasinya.

Contoh-contoh yang menyertai artikel ini terdapat di GitHub.