SLF4J - Panduan Cepat
SLF4J adalah singkatan dari Smenerapkan Logging Facade untuk Java. Ini menyediakan abstraksi sederhana dari semua kerangka kerja logging di Java. Jadi, ini memungkinkan pengguna untuk bekerja dengan salah satu kerangka kerja logging seperti Log4j, Logback danJUL(java.util.logging) menggunakan ketergantungan tunggal. Anda dapat bermigrasi ke kerangka kerja logging yang diperlukan pada waktu proses / penerapan.
Ceki Gülcü menciptakan SLF4J sebagai alternatif kerangka kerja umum Jakarta.
Keuntungan dari SLF4J
Berikut adalah keunggulan SLF4J -
Menggunakan kerangka kerja SLF4J, Anda dapat bermigrasi ke kerangka kerja logging yang diinginkan pada saat penerapan.
Slf4J menyediakan binding ke semua framework logging populer seperti log4j, JUL, Simple logging, dan NOP. Oleh karena itu, Anda dapat beralih ke salah satu kerangka kerja populer ini pada saat penerapan.
SLF4J memberikan dukungan ke pesan logging berparameter terlepas dari pengikatan yang Anda gunakan.
Karena SLF4J memisahkan aplikasi dan kerangka kerja logging, Anda dapat dengan mudah menulis aplikasi yang tidak bergantung pada kerangka kerja logging. Anda tidak perlu memikirkan kerangka kerja logging yang digunakan untuk menulis aplikasi.
SLF4J menyediakan alat Java sederhana yang dikenal sebagai migrator. Dengan menggunakan alat ini, Anda dapat memigrasi proyek yang ada, yang menggunakan kerangka kerja logging seperti Jakarta Commons Logging (JCL) atau, log4j atau, Java.util.logging (JUL) ke SLF4J.
Logging dalam pemrograman, mengacu pada kegiatan / peristiwa pencatatan. Biasanya, pengembang aplikasi harus menangani pencatatan.
Untuk mempermudah pekerjaan logging, Java menyediakan berbagai framework - log4J, java.util.logging (JUL), tiny log, logback, dll.
Ikhtisar Kerangka Kerja Logging
Kerangka logging biasanya berisi tiga elemen -
Logger
Menangkap pesan bersama dengan metadatanya.
Formatter
Memformat pesan yang ditangkap oleh logger.
Penangan
Handler atau appender akhirnya mengirimkan pesan baik dengan mencetak di konsol atau, dengan menyimpan dalam database atau, dengan mengirim melalui email.
Beberapa kerangka kerja menggabungkan elemen logger dan appender untuk mempercepat operasi.
Objek Logger
Untuk mencatat pesan, aplikasi mengirimkan objek logger (terkadang bersama dengan pengecualian jika ada) dengan nama dan tingkat keamanan.
Tingkat Keparahan
Pesan yang dicatat akan memiliki berbagai tingkatan. Tabel berikut mencantumkan tingkat umum pencatatan.
Sr Tidak | Tingkat keseriusan & Deskripsi |
---|---|
1 | Fatal Masalah parah yang menyebabkan aplikasi berhenti. |
2 | ERROR Kesalahan runtime. |
3 | WARNING Dalam kebanyakan kasus, kesalahan ini disebabkan oleh penggunaan API yang tidak digunakan lagi. |
4 | INFO Peristiwa yang terjadi saat runtime. |
5 | DEBUG Informasi tentang aliran sistem. |
6 | TRACE Informasi lebih detail tentang aliran sistem. |
Apa itu log4j?
log4j adalah aplikasi yang andal, cepat dan fleksibel logging framework (APIs) written in Java, yang didistribusikan di bawah Lisensi Perangkat Lunak Apache.
log4j sangat dapat dikonfigurasi melalui file konfigurasi eksternal saat runtime. Ini melihat proses pencatatan dalam hal tingkat prioritas dan menawarkan mekanisme untuk mengarahkan informasi pencatatan ke berbagai tujuan, seperti database, file, konsol, UNIX Syslog, dll. (Untuk detail lebih lanjut tentang log4j lihat Tutorial kami ).
Perbandingan SLF4J dan Log4j
Tidak seperti log4j, SLF4J (Smenerapkan Logging Facade untuk Java) bukan merupakan implementasi dari kerangka logging, ini adalah sebuah abstraction for all those logging frameworks in Java similar to log4J. Oleh karena itu, Anda tidak dapat membandingkan keduanya. Namun, selalu sulit untuk memilih salah satu di antara keduanya.
Jika Anda punya pilihan, abstraksi logging selalu lebih disukai daripada framework logging. Jika Anda menggunakan abstraksi logging, khususnya SLF4J, Anda dapat bermigrasi ke framework logging apa pun yang Anda perlukan pada saat penerapan tanpa memilih dependensi tunggal.
Perhatikan diagram berikut untuk mendapatkan pemahaman yang lebih baik.
Pada bab ini, kami akan menjelaskan cara mengatur lingkungan SLF4J di Eclipse IDE. Sebelum melanjutkan dengan penginstalan, pastikan Anda sudah menginstal Eclipse di sistem Anda. Jika tidak, unduh dan instal Eclipse.
Untuk informasi lebih lanjut tentang Eclipse, silakan lihat Tutorial Eclipse kami
Langkah 1: Unduh file JAR ketergantungan
Buka beranda resmi situs web SLF4J dan buka halaman unduhan.
Sekarang, unduh versi stabil terbaru dari slf4j-X.X.tar.gzatau slf4j-XXzip , sesuai dengan sistem operasi Anda (jika file windows .zip atau jika file tar.gz Linux).
Di dalam folder yang diunduh, Anda akan menemukan slf4j-api-XXjar . Ini adalah file Jar yang diperlukan.
Langkah 2: Buat proyek dan setel jalur pembuatan
Buka gerhana dan buat proyek sampel. Klik kanan pada proyek, pilih opsiBuild Path → Configure Build Path… seperti gambar dibawah.
Dalam Java Build Path bingkai di Libraries tab, klik Add External JARs…
Pilih slf4j-api.x.x.jar file diunduh dan klik Apply and Close.
Binding SLF4J
Sebagai tambahannya slf4j-api.x.x.jar mengajukan, SLF4Jmenyediakan beberapa file Jar lainnya seperti yang ditunjukkan di bawah ini. Ini disebutSLF4J bindings.
Dimana setiap pengikatan untuk kerangka logging masing-masing.
Tabel berikut mencantumkan binding SLF4J dan kerangka kerjanya yang sesuai.
Sr Tidak | File jar & Kerangka Kerja Logging |
---|---|
1 | slf4j-nop-x.x.jar Tidak ada operasi, buang semua logging. |
2 | slf4j-simple-x.x.jar Implementasi sederhana di mana pesan untuk info dan yang lebih tinggi dicetak dan, semua output tersisa ke System.err. |
3 | slf4j-jcl-x.x.jar Kerangka kerja Jakarta Commons Logging. |
4 | slf4j-jdk14-x.x.jar Java.util.logging framework (JUL). |
5 | slf4j-log4j12-x.x.jar Pekerjaan kerangka Log4J. Selain itu, Anda perlu memilikilog4j.jar. |
Agar SLF4J berfungsi bersama dengan slf4l-api-xxjar, Anda perlu menambahkan file Jar masing-masing (pengikatan) dari kerangka kerja logger yang diinginkan di jalur kelas proyek (setel jalur pembuatan).
Untuk beralih dari satu kerangka kerja ke kerangka lainnya, Anda perlu mengganti pengikatan masing-masing. Jika tidak ada pembatas yang ditemukan, defaultnya ke mode tanpa operasi.
Pom.xml untuk SLF4J
Jika Anda membuat proyek maven, buka pom.xml dan tempel konten berikut di dalamnya dan segarkan proyek.
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Sample</groupId>
<artifactId>Sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
</project>
Dalam bab ini, kita akan membahas kelas dan metode yang akan kita gunakan pada bab-bab selanjutnya dari tutorial ini.
Antarmuka Logger
Antarmuka logger dari org.slf4jpaket adalah titik masuk dari API SLF4J. Berikut daftar metode penting dari antarmuka ini.
Sr.No. | Metode dan Deskripsi |
---|---|
1 | void debug(String msg) Metode ini mencatat pesan di tingkat DEBUG. |
2 | void error(String msg) Metode ini mencatat pesan di tingkat ERROR. |
3 | void info(String msg) Metode ini mencatat pesan di tingkat INFO. |
4 | void trace(String msg) Metode ini mencatat pesan di tingkat TRACE. |
5 | void warn(String msg) Metode ini mencatat pesan di tingkat PERINGATAN. |
Kelas LoggerFactory
Kelas LoggerFactory dari org.slf4j package adalah kelas utilitas, yang digunakan untuk menghasilkan logger untuk berbagai API logging seperti log4j, JUL, NOP, dan logger sederhana.
Sr.No. | Metode dan Deskripsi |
---|---|
1 | Logger getLogger(String name) Metode ini menerima nilai string yang mewakili nama dan mengembalikan a Logger objek dengan nama yang ditentukan. |
Kelas Profiler
Kelas ini termasuk dalam paket org.slf4jini digunakan untuk tujuan pembuatan profil dan ini dikenal sebagai profiler orang miskin. Dengan menggunakan ini, programmer dapat mengetahui waktu yang dibutuhkan untuk melakukan tugas yang berkepanjangan.
Berikut adalah metode penting dari kelas ini.
Sr.No. | Metode dan Deskripsi |
---|---|
1 | void start(String name) Metode ini akan memulai stopwatch anak baru (diberi nama) dan, menghentikan stopwatch anak sebelumnya (atau, instrumen waktu). |
2 | TimeInstrument stop() Metode ini akan menghentikan stopwatch anak terbaru dan stopwatch global serta mengembalikan Instrumen Waktu saat ini. |
3 | void setLogger(Logger logger) Metode ini menerima objek Logger dan mengaitkan logger yang ditentukan ke Profiler saat ini. |
4 | void log() Mencatat konten instrumen waktu saat ini yang terkait dengan pencatat. |
5 | void print() Mencetak konten instrumen waktu saat ini. |
Pada bab ini, kita akan melihat program logger dasar sederhana yang menggunakan SLF4J. Ikuti langkah-langkah yang dijelaskan di bawah ini untuk menulis logger sederhana.
Langkah 1 - Buat objek antarmuka slf4j.Logger
Sejak slf4j.Logger adalah titik masuk dari SLF4J API, pertama, Anda perlu mendapatkan / membuat objeknya
Itu getLogger() metode dari LoggerFactory kelas menerima nilai string yang mewakili nama dan mengembalikan a Logger objek dengan nama yang ditentukan.
Logger logger = LoggerFactory.getLogger("SampleLogger");
Langkah 2 - Catat pesan yang diperlukan
Itu info() metode dari slf4j.Logger antarmuka menerima nilai string yang mewakili pesan yang diperlukan dan mencatatnya di tingkat info.
logger.info("Hi This is my first SLF4J program");
Contoh
Berikut ini adalah program yang mendemonstrasikan cara menulis logger sampel di Java menggunakan SLF4J.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
public static void main(String[] args) {
//Creating the Logger object
Logger logger = LoggerFactory.getLogger("SampleLogger");
//Logging the information
logger.info("Hi This is my first SLF4J program");
}
}
Keluaran
Saat menjalankan program berikut pada awalnya, Anda akan mendapatkan keluaran berikut, bukan pesan yang diinginkan.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.
Karena kita belum menyetel classpath ke pengikatan apa pun yang mewakili kerangka kerja logging, seperti yang disebutkan sebelumnya dalam tutorial ini, SLF4J secara default menggunakan implementasi tanpa operasi. Jadi, untuk melihat pesan tersebut, Anda perlu menambahkan binding yang diinginkan di project classpath. Karena kami menggunakan eclipse, setbuild path untuk masing-masing file JAR atau, tambahkan dependensinya di file pom.xml.
Misalnya, jika kita perlu menggunakan JUL (framework Java.util.logging), kita perlu menyetel jalur build untuk file jar slf4j-jdk14-x.x.jar. Dan jika kita ingin menggunakan framework logging log4J, kita perlu menyetel jalur build atau, menambahkan dependensi untuk file jarslf4j-log4j12-x.x.jar dan log4j.jar.
Setelah menambahkan binding yang mewakili salah satu framework logging kecuali slf4j-nopx.x.jar ke proyek (classpath), Anda akan mendapatkan keluaran berikut.
Dec 06, 2018 5:29:44 PM SLF4JExample main
INFO: Hi Welcome to Tutorialspoint
Dalam bab ini, kita akan membahas berbagai pesan kesalahan atau peringatan yang kita dapatkan saat bekerja dengan SLF4J dan penyebab / arti dari pesan tersebut.
Gagal memuat kelas "org.slf4j.impl.StaticLoggerBinder".
Ini adalah peringatan yang terjadi jika tidak ada binding SLF4J yang disediakan di classpath.
Berikut adalah peringatan lengkapnya -
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.
Untuk mengatasi ini, Anda perlu menambahkan salah satu binding framework logging. Ini dijelaskan diHello world bab dari tutorial ini.
Note - Ini terjadi pada versi SLF4J yang berada di antara 1.6.0 dan 1.8.0-beta2.
Tidak ada penyedia SLF4J yang ditemukan
Dalam slf4j-1.8.0-beta2, peringatan di atas lebih jelas “No SLF4J providers were found”.
Berikut adalah peringatan lengkapnya -
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
Classpath berisi binding SLF4J yang menargetkan versi slf4j-api sebelum 1.8
Jika Anda menggunakan SLF4J versi 1.8 dan Anda memiliki binding dari versi sebelumnya di classpath tetapi tidak memiliki binding 1.8, Anda akan melihat peringatan seperti yang ditunjukkan di bawah ini.
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions prior to
1.8.
SLF4J: Ignoring binding found at
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#ignoredBindings for an explanation.
NoClassDefFoundError: org / apache / commons / logging / LogFactory
Jika Anda bekerja dengan slf4j-jcl dan jika Anda hanya punya slf4j-jcl.jar di classpath Anda, Anda akan mendapatkan pengecualian seperti yang diberikan di bawah ini.
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/commons/logging/LogFactory
at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.ClassNotFoundException:
org.apache.commons.logging.LogFactory
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 3 more
Untuk mengatasi ini, Anda perlu menambahkan commons-logging.jar ke jalur kelas Anda.
Mendeteksi jcl-over-slf4j.jar DAN terikat slf4j-jcl.jar di classpath ..
Pengikatan slf4j-jcl.jar mengalihkan panggilan dari logger slf4j ke JCL dan jcl-over-slf4j.jarmengalihkan panggilan JCL logger ke slf4j. Oleh karena itu, Anda tidak dapat memiliki keduanya di classpath proyek Anda. Jika Anda melakukannya, Anda akan mendapatkan pengecualian seperti yang diberikan di bawah ini.
SLF4J: Detected both jcl-over-slf4j.jar AND bound slf4j-jcl.jar on the class
path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#jclDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:71)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:42)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar
AND bound slf4j-jcl.jar on the class path, preempting StackOverflowError. See
also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:54)
... 7 more
Untuk mengatasi ini, hapus salah satu file jar.
Ketidakcocokan nama logger yang terdeteksi
Anda dapat membuat objek Logger dengan -
Meneruskan nama logger yang akan dibuat sebagai argumen ke getLogger() metode.
Meneruskan kelas sebagai argumen untuk metode ini.
Jika Anda mencoba membuat objek pabrik pencatat dengan meneruskan kelas sebagai argumen, dan jika Anda telah menyetel properti sistem slf4j.detectLoggerNameMismatch menjadi true, maka nama kelas yang Anda berikan sebagai argumen ke getLogger() metode dan kelas yang Anda gunakan harus sama jika tidak, Anda akan menerima peringatan berikut -
“Ketidakcocokan nama logger yang terdeteksi.
Perhatikan contoh berikut.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
public static void main(String[] args) {
System.setProperty("slf4j.detectLoggerNameMismatch", "true");
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("Hi Welcome to Tutorilspoint");
}
}
Di sini, kami telah menyetel properti slf4j.detectLoggerNameMismatch ke true. Nama kelas yang kami gunakan adalahSLF4JExample dan nama kelas yang telah kita berikan ke metode getLogger () adalah Sample karena keduanya tidak sama kita akan mendapatkan peringatan berikut.
SLF4J: Detected logger name mismatch. Given name: "Sample"; computed name:
"SLF4JExample".
SLF4J: See http://www.slf4j.org/codes.html#loggerNameMismatch for an
explanation
Dec 10, 2018 12:43:00 PM SLF4JExample main
INFO: Hi Welcome to Tutorilspoint
Note - Ini terjadi setelah slf4j 1.7.9
Classpath berisi beberapa binding SLF4J.
Anda seharusnya hanya memiliki satu pengikatan di classpath. Jika Anda memiliki lebih dari satu binding, Anda akan mendapatkan peringatan yang mencantumkan binding dan lokasinya.
Misalnya, jika kita memiliki binding slf4j-jdk14.jar dan slf4j-nop.jar di classpath kita akan mendapatkan peringatan berikut.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-nop-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]
Mendeteksi log4j-over-slf4j.jar DAN terikat slf4j-log4j12.jar di jalur kelas
Untuk mengalihkan panggilan logger log4j ke slf4j, Anda perlu menggunakan log4j-over-slf4j.jar mengikat dan jika Anda ingin mengalihkan panggilan slf4j ke log4j, Anda harus menggunakan slf4j-log4j12.jar mengikat.
Oleh karena itu, Anda tidak dapat memiliki keduanya di classpath. Jika Anda melakukannya, Anda akan mendapatkan pengecualian berikut.
SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the
class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar
AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
Seperti yang dibahas sebelumnya dalam tutorial ini, SLF4J menyediakan dukungan untuk pesan log berparameter.
Anda dapat menggunakan parameter dalam pesan dan meneruskan nilai padanya nanti di pernyataan yang sama.
Sintaksis
Seperti yang ditunjukkan di bawah, Anda perlu menggunakan placeholder ({}) dalam pesan (String) di mana pun Anda butuhkan dan nanti Anda bisa meneruskan nilai untuk placeholder object bentuk, memisahkan pesan dan nilai dengan koma.
Integer age;
Logger.info("At the age of {} ramu got his first job", age);
Contoh
Contoh berikut menunjukkan logging berparameter (dengan parameter tunggal) menggunakan SLF4J.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
public static void main(String[] args) {
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(PlaceHolders.class);
Integer age = 23;
//Logging the information
logger.info("At the age of {} ramu got his first job", age);
}
}
Keluaran
Setelah dieksekusi, program di atas menghasilkan keluaran berikut -
Dec 10, 2018 3:25:45 PM PlaceHolders main
INFO: At the age of 23 Ramu got his first job
Keuntungan dari Parameterized Logging
Di Java, jika kita perlu mencetak nilai dalam pernyataan, kita akan menggunakan operator penggabungan sebagai -
System.out.println("At the age of "+23+" ramu got his first job");
Ini melibatkan konversi nilai integer 23 menjadi string dan penggabungan nilai ini ke string yang mengelilinginya.
Dan jika itu adalah pernyataan pencatatan, dan jika tingkat log tertentu dari pernyataan Anda dinonaktifkan, semua perhitungan ini tidak akan berguna.
Dalam keadaan seperti itu, Anda dapat menggunakan logging berparameter. Dalam format ini, awalnya SLF4J mengkonfirmasi apakah pencatatan untuk tingkat tertentu diaktifkan. Jika demikian, maka itu menggantikan placeholder di pesan dengan nilai masing-masing.
Misalnya, jika kita memiliki pernyataan sebagai
Integer age;
Logger.debug("At the age of {} ramu got his first job", age);
Hanya jika debugging diaktifkan kemudian, SLF4J mengubah usia menjadi integer dan menggabungkannya dengan string jika tidak, SLF4J tidak melakukan apa-apa. Sehingga menimbulkan biaya konstruksi parameter saat tingkat logging dinonaktifkan.
Dua Varian Argumen
Anda juga dapat menggunakan dua parameter dalam sebuah pesan sebagai -
logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);
Contoh
Contoh berikut menunjukkan penggunaan dua placeholder dalam pembuatan log parametrized.
import java.util.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
public static void main(String[] args) {
Integer oldWeight;
Integer newWeight;
Scanner sc = new Scanner(System.in);
System.out.println("Enter old weight:");
oldWeight = sc.nextInt();
System.out.println("Enter new weight:");
newWeight = sc.nextInt();
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);
//Logging the information
logger.info("After the program weight reduced is: "+(oldWeight-newWeight));
}
}
Keluaran
Setelah dieksekusi, program di atas menghasilkan keluaran berikut.
Enter old weight:
85
Enter new weight:
74
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: Old weight is 85. new weight is 74.
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: After the program weight reduced is: 11
Varian Argumen Ganda
Anda juga dapat menggunakan lebih dari dua tempat penampung seperti yang diperlihatkan dalam contoh berikut -
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
public static void main(String[] args) {
Integer age = 24;
String designation = "Software Engineer";
String company = "Infosys";
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("At the age of {} ramu got his first job as a {} at {}", age, designation, company);
}
}
Keluaran
Setelah dieksekusi, program di atas menghasilkan keluaran berikut -
Dec 10, 2018 4:23:52 PM PlaceHolders main
INFO: At the age of 24 ramu got his first job as a Software Engineer at Infosys
Jika Anda memiliki proyek di Jakarta Commons Logging (JCL) atau, log4j atau, java.util.logging (JUL) dan Anda ingin mengonversi proyek ini ke SLF4J, Anda dapat melakukannya dengan menggunakan alat migrator yang disediakan dalam distribusi SLF4J.
Menjalankan Migrator SLF4J
SLF4J adalah file jar tunggal sederhana (slf4j-migrator.jar) dan Anda dapat menjalankannya menggunakan perintah java –jar.
Untuk menjalankannya, di command prompt, telusuri direktori tempat Anda memiliki file jar ini dan jalankan perintah berikut.
java -jar slf4j-migrator-1.8.0-beta2.jar
Starting SLF4J Migrator
Ini memulai migrator dan Anda dapat melihat aplikasi java mandiri sebagai -
Seperti yang ditentukan di jendela, Anda perlu memeriksa jenis migrasi yang ingin Anda lakukan dan memilih direktori proyek dan klik tombol Migrasi Proyek ke SLF4J.
Alat ini masuk ke file sumber yang Anda berikan dan melakukan modifikasi sederhana seperti mengubah baris impor dan deklarasi logger dari kerangka kerja logging saat ini ke SLF4j.
Contoh
Misalnya, anggaplah kita memiliki sampel log4j(2) proyek di gerhana dengan satu file sebagai berikut -
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class Sample {
/* Get actual class name to be printed on */
static Logger log = Logger.getLogger(Sample.class.getName());
public static void main(String[] args)throws IOException,SQLException {
log.debug("Hello this is a debug message");
log.info("Hello this is an info message");
}
}
Untuk memindahkan sampel log4j(2) proyek ke slf4j, kita perlu memeriksa tombol radio from log4j to slf4j dan pilih direktori proyek dan klik Exit untuk bermigrasi.
Migrator mengubah kode di atas sebagai berikut. Di sini jika Anda mengamati pernyataan import dan logger telah dimodifikasi.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class Sample {
static Logger log = LoggerFactory.getLogger(Sample.class.getName());
public static void main(String[] args)throws IOException,SQLException {
log.debug("Hello this is a debug message");
log.info("Hello this is an info message");
}
}
Karena Anda sudah punya log4j.jar dalam proyek Anda, Anda perlu menambahkan slf4j-api.jar dan slf4jlog12.jar file ke proyek untuk menjalankannya.
Batasan SLF4JMigrator
Berikut adalah batasan migrator SLF4J.
Migrator tidak akan mengubah skrip build seperti ant, maven dan, ivy, Anda perlu melakukannya sendiri.
Migrator tidak mendukung pesan selain tipe String.
Migrator tidak mendukung tingkat FATAL.
Saat bekerja dengan log4j, migrator tidak akan memigrasi panggilan ke PropertyConfigurator atau DomConfigurator.
Distribusi SLF4J menyediakan slf4j-ext.jar ini berisi API untuk fungsionalitas seperti profiling, Extended logging, Event logging dan, logging dengan java agent.
Profiling
Kadang-kadang programmer ingin mengukur beberapa atribut seperti penggunaan memori, kompleksitas waktu atau penggunaan instruksi tertentu tentang program untuk mengukur kapabilitas nyata dari program itu. Pengukuran semacam itu tentang program disebut profiling. Profiling menggunakan analisis program dinamis untuk melakukan pengukuran tersebut.
SLF4J menyediakan kelas bernama Profiler dalam org.slf4j.profilerpaket untuk tujuan pembuatan profil. Ini dikenal sebagai profiler orang miskin. Dengan menggunakan ini, programmer dapat mengetahui waktu yang dibutuhkan untuk melakukan tugas yang berkepanjangan.
Pembuatan Profil Menggunakan kelas Profiler
Profiler berisi stopwatch dan stopwatch turunan dan kita bisa memulai dan menghentikannya menggunakan metode yang disediakan oleh kelas profiler.
Untuk melanjutkan pembuatan profil menggunakan kelas profiler, ikuti langkah-langkah yang diberikan di bawah ini.
Langkah 1 - Buat instance kelas profiler
Buat instance kelas Profiler dengan meneruskan nilai String yang mewakili nama profiler. Saat kita membuat instance kelas Profiler, stopwatch global akan dimulai.
//Creating a profiler
Profiler profiler = new Profiler("Sample");
Langkah 2 - Mulai stopwatch anak
Saat kami memanggil start() metode itu akan memulai stopwatch anak baru (bernama) dan, menghentikan stopwatch anak sebelumnya (atau, instrumen waktu).
Panggil start() metode dari Profiler kelas dengan meneruskan nilai String yang mewakili nama stopwatch anak yang akan dibuat.
//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
Setelah membuat stopwatch ini, Anda dapat melakukan tugas Anda atau, menjalankan metode tersebut, yang menjalankan tugas Anda.
Langkah 3: Mulai stopwatch anak lain (jika Anda mau)
Jika perlu, buat stopwatch lain menggunakan start()metode dan melakukan tugas yang diperlukan. Jika Anda melakukannya, stopwatch akan memulai stopwatch baru dan stopwatch sebelumnya (tugas 1).
//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
Langkah 4: Hentikan jam tangan
Saat kami memanggil stop() metode, itu akan menghentikan stopwatch anak terbaru dan stopwatch global dan mengembalikan Instrumen Waktu saat ini.
// Stopping the current child stopwatch and the global stopwatch.
TimeInstrument tm = profiler.stop();
Langkah 5: Cetak konten instrumen waktu.
Cetak isi dari instrumen waktu saat ini menggunakan print() metode.
//printing the contents of the time instrument
tm.print();
Contoh
Contoh berikut menunjukkan pembuatan profil menggunakan kelas Profiler dari SLF4J. Di sini kami telah mengambil dua contoh tugas, mencetak jumlah kuadrat angka dari 1 hingga 10000, mencetak jumlah angka dari 1 hingga 10000. Kami mencoba untuk mendapatkan waktu yang dibutuhkan untuk dua tugas ini.
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample obj = new ProfilerExample();
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//printing the contents of the time instrument
tm.print();
}
}
Keluaran
Setelah dieksekusi, program di atas menghasilkan keluaran berikut -
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000
+ Profiler [BASIC]
|-- elapsed time [Task 1] 2291.827 microseconds.
|-- elapsed time [Task 2] 225.802 microseconds.
|-- Total [BASIC] 3221.598 microseconds.
Mencatat Informasi Profiler
Alih-alih mencetak hasil profiler untuk mencatat informasi ini, Anda perlu -
Buat logger menggunakan LoggerFactory kelas.
Buat profiler dengan membuat instance kelas Profiler.
Kaitkan logger ke profiler dengan meneruskan objek logger yang dibuat ke setLogger() metode dari Profiler kelas.
Akhirnya, alih-alih mencetak log informasi profiler menggunakan log() metode.
Contoh
Dalam contoh berikut, tidak seperti yang sebelumnya (alih-alih mencetak), kami mencoba mencatat konten instrumen waktu.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample_logger {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample_logger obj = new ProfilerExample_logger();
//Creating a logger
Logger logger = LoggerFactory.getLogger(ProfilerExample_logger.class);
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Adding logger to the profiler
profiler.setLogger(logger);
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//Logging the contents of the time instrument
tm.log();
}
}
Keluaran
Setelah dieksekusi, program di atas menghasilkan keluaran berikut.
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000