Java: menciutkan log multi-baris ke log satu-baris menggunakan Spring dan Logback atau Log4j2

Logback dan Log4j2 adalah beberapa kerangka kerja logging JAVA yang paling terkenal. Kerangka kerja Logback hanya digunakan bersama dengan pustaka SLF4J, yang merupakan antarmuka untuk sistem pencatatan peristiwa. Log4j2 adalah versi logger log4 kedua yang ditingkatkan, pustaka logging di mana API dan implementasinya terpisah, yang memungkinkan Anda untuk menggunakan API Log4j 2 bersamaan dengan implementasi logger lain.

Spring Music adalah aplikasi untuk menggunakan layanan basis data lingkungan Cloud Foundry bersamaan dengan Spring Framework dan Spring Boot. Itu dibuat untuk menyimpan objek domain yang sama di salah satu dari banyak repositori yang berbeda - objek-relasional, berorientasi pada dokumen atau didistribusikan (key-value store).



Dua logger yang paling umum digunakan dengan Spring / Spring Boot adalah Logback dan Log4j2. Hingga baru-baru ini, pengembang memiliki lebih banyak kebebasan bertindak mengenai format log dan file-file itu sendiri yang digunakan untuk logging. Namun, dalam dunia modern penerapan dan penskalaan kontainer, logging biasanya menawarkan solusi perusahaan yang memerlukan tingkat standardisasi tertentu.

Salah satu masalah terbesar adalah bahwa pengecualian Java biasanya menghasilkan pelacakan multi-line besar dalam log. Karena itu, alih-alih peristiwa log tunggal yang menunjukkan pengecualian atau pesan kesalahan, Anda mendapatkan lebih dari 100 log yang berbeda, satu untuk setiap baris jejak tumpukan, diselingi dengan peristiwa log lainnya dari layanan lain atau layanan contoh.

Artikel ini menjelaskan cara mengonfigurasi aplikasi Boot Spring untuk menciutkan pengecualian dalam satu baris untuk Logger logger dan Log4j2. Ini memungkinkan kami untuk mempertimbangkan penebangan pengecualian dan pelacakan tumpukan sebagai satu log peristiwa.


Kelas Kesalahan dan Pengecualian di JAWA


Pengecualian Pengecualian. Tidak Dicentang dan Tidak Dicentang

Aplikasi Musik Musim Semi


Dalam artikel ini, untuk log kustom, versi kustom aplikasi musik musim semi digunakan, yang diperlukan untuk pengoperasian logback dan Log4j2 logger. Pertama, Anda perlu memastikan bahwa kami dapat membuatnya kembali dari sumbernya. Proyek ini membutuhkan Java8, jadi langkah pertama adalah menginstal Java8 pada host Ubuntu Anda.



Lalu kami mengambil kode sumber proyek dengan github dan membuat perakitan menggunakan skrip bawaan sistem pembangunan Gradle:



Perkecil pengecualian multi-baris menggunakan Logback


Mari kita lanjutkan dan membuat arsip jar dari proyek jar dengan implementasi Logback logger menggunakan perintah Gradle standar:



File "build / libs / spring-music.jar" dijalankan sendiri dan berisi Tomcat bawaan yang terikat ke localhost: 8080. File jar disebut menggunakan perintah:



Memanggil http: // localhost: 8080 di browser akan menampilkan halaman dengan daftar Album, dan baris log yang terlihat seperti ini akan ditampilkan di konsol:



Sintaks baris log ini didefinisikan dalam " src / main / resources / logback-spring.xml " menggunakan templat kustom:



Variabel $ {...} diekstraksi dari application.properties dan properti sistem, yang dapat dilihat pada halaman di http: // localhost: 8080 / env . Namun, bagian dari kode yang kita butuhkan terletak tepat setelah pesan (% m).



Kata 'MULTIEXCEPTION' tidak memiliki arti khusus, itu hanya penanda string unik yang memungkinkan kita untuk mengetahui di mana pesan berakhir (% m) dan pengecualian dimulai. Jika mau, Anda dapat meninggalkan penanda ini.

Selanjutnya, alih-alih hanya memasukkan% xException placeholder yang akan membuang jejak tumpukan besar dengan karakter baris baru, kami mengonversi nilai menggunakan fungsi% replace dan mengganti semua karakter baris baru dengan ekspresi "\ u2028", yang merupakan tampilan pembatas string Unicode. .

Menghapus karakter "\ n" dari jejak tumpukan berarti bahwa sekarang jejak tumpukan sekarang akan dikirim dalam bentuk baris tunggal. Untuk membuktikan ini, buka http: // localhost: 8080 / errors / throw , di mana ada Pengontrol Kesalahan yang dengan sengaja melempar NullPointerException dengan kode berikut:



Ini menciptakan garis log di konsol, yang ditunjukkan di bawah ini:



Dapat dilihat di sini bahwa ungkapan "u2028" memisahkan apa yang dulunya merupakan umpan garis dalam jejak tumpukan. Sekarang pesan pengecualian dan jejak tumpukan akan dikirim sebagai satu unit.



Perkecil pengecualian multiline menggunakan Log4j2


Untuk mengganti skrip build default dan menggunakan Log4j2 sebagai implementasi cadangan proyek ini, Anda perlu menggunakan file β€œbuild-log4j2.gradle”.



File "build / libs / spring-music.jar" dijalankan sendiri dan menggunakan Tomcat bawaan, yang terikat dengan localhost: 8080. Seperti pada contoh sebelumnya, file jar disebut menggunakan perintah:



Memanggil http: // localhost: 8080 menggunakan browser akan menampilkan halaman dengan daftar Album dengan output garis log ke konsol yang terlihat seperti ini:



Sintaks baris log ini didefinisikan dalam " src / main / resources / log4j2.xml " menggunakan templat kustom:



Variabel $ {...} diekstraksi dari application.properties dan properti sistem, yang dapat dilihat pada halaman di http: // localhost: 8080 / env . Namun, bagian dari kode yang kita butuhkan terletak tepat setelah pesan (% m).



Kata 'MULTIEXCEPTION' tidak memiliki arti khusus, itu hanya penanda garis yang unik dari pilihan kami, yang memungkinkan Anda untuk mengetahui di mana pesan berakhir (% m) dan pengecualian dimulai. Jika mau, Anda bisa meninggalkannya.

Namun setelah itu, alih-alih hanya menyisipkan placeholder% xException yang akan membuang jejak tumpukan besar dengan karakter baris baru, kami mengonversi nilai dengan fungsi% replace, yang menggantikan semua karakter baris baru dengan ekspresi "\ u2028", yang merupakan pembatas String Unicode .

Menghapus karakter "\ n" dari jejak tumpukan berarti bahwa sekarang jejak tumpukan sekarang akan dikirim sebagai satu baris. Untuk membuktikan ini, buka http: // localhost: 8080 / errors / throw , di mana ada Pengontrol Kesalahan yang dengan sengaja melempar NullPointerException dengan kode berikut:



Ini menciptakan garis log di konsol, yang ditunjukkan di bawah ini:



Seperti yang Anda lihat, di sini ungkapan β€œu2028” memisahkan apa yang dulunya merupakan umpan baris dalam jejak tumpukan. Sekarang pesan pengecualian dan jejak tumpukan akan dikirim sebagai satu unit.

Kesimpulan


Kemampuan untuk memecah jejak multi-baris tumpukan Java menjadi satu baris berarti bahwa teknik ini dapat dianggap sebagai solusi logging terpusat tunggal.
Tidak ada alasan untuk menyia-nyiakan sumber daya komputasi dan manusia dalam memulihkan jejak tumpukan di sisi tujuan menggunakan pengidentifikasi korelasi, ukuran tumpukan besar, pemanfaatan prosesor tinggi, dan penguraian pintar jika jauh lebih efisien untuk melakukan pelipatan ini di sisi sumber.

Dalam kasus ini, karakter Unicode selalu dapat diganti di sisi pengumpulan log (misalnya, di sisi pipa untuk mengumpulkan, memfilter, dan menormalkan log Logstash) untuk mengembalikan pesan dalam format aslinya.

Bahan referensi



Sedikit iklan :)


Terima kasih telah tinggal bersama kami. Apakah Anda suka artikel kami? Ingin melihat materi yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikan kepada teman Anda VPS berbasis cloud untuk pengembang mulai $ 4,99 , analog unik dari server entry-level yang diciptakan oleh kami untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps mulai dari $ 19 atau cara membagi server? (opsi tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).

Dell R730xd 2 kali lebih murah di pusat data Equinix Tier IV di Amsterdam? Hanya kami yang memiliki 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV dari $ 199 di Belanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - mulai dari $ 99! Baca tentang Cara Membangun Infrastruktur Bldg. kelas menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?

Source: https://habr.com/ru/post/id482804/


All Articles