Setiap kerangka kerja dalam berbagai kerangka kerja yang diproduksi oleh Java (seperti Spring, dll.) Akan menggunakan sistem log yang berbeda. Akan ada masalah tertentu dengan mencampur beberapa log berbeda dalam satu JVM. Di sini kita akan memilah kerangka log umum dalam sistem Java, memperkenalkan hubungan dengan setiap kerangka log yang berpusat pada SFL4J, dan memperkenalkan cara mengelola berbagai kerangka log di lingkungan produksi.
1. Pengantar antarmuka
Dalam sistem Java, sebagian besar ada dua antarmuka sistem log: SLF4J dan gambaran umum. Ada banyak kerangka kerja untuk diimplementasikan, seperti logback, log4j, dll.
Tentu saja, meskipun keduanya antarmuka, keduanya juga dapat mencapai output proxy log timbal balik melalui paket jembatan.
Implementasi log dari pemasangan gol-umum sering kali log4J. Selama inisialisasi, jika tidak ada spesifikasi khusus untuk siapa yang harus dipasang, itu akan secara otomatis dipakai dalam urutan di atas. LOG4JLOGGER merangkum logger log4j dan memanggil log4j saat mencetak log.
2. Jembatan dan dijembatani di SLF4J
Sebagai definisi antarmuka, SLF4J dapat memiliki banyak kerangka kerja implementasi di bagian bawah, dan juga dapat mendukung implementasi log atau kerangka kerja lainnya untuk SFL4J. Implementasinya didasarkan pada paket jembatan yang berbeda.
2.1 Jembatan SLF4J
Sebagai definisi antarmuka, ada banyak implementasi di bawah ini. Prinsip implementasi adalah untuk melakukan inisialisasi saat mendapatkan IloggerFactory. Proses inisialisasi mengikat objek implementasi: Muat semua kelas yang mengimplementasikan staticloggerbinder, dan kemudian dapatkan singletonnya. Saat mengeksekusi GetLogger, metode kelas singleton ini dipanggil untuk mendapatkan objek logger yang sesuai dengan implementasi spesifik fungsi logging. Jika ada beberapa implementasi, maka ikat salah satunya. Situasi ini membutuhkan penghapusan kelas implementasi log yang tidak diinginkan.
2.2 slf4j dijembatani
Gambar di atas menunjukkan bagaimana sistem log lain terhubung ke sistem log SLF4J. Prinsip dasarnya adalah dengan proksi sistem log masing -masing dan mengeluarkannya ke antarmuka SFL4J. Untuk implementasi tertentu, Anda dapat melihat implementasi paket jembatan. Pada dasarnya, implementasi log asli telah diimplementasikan kembali, dan metode yang mendasari benar -benar memanggil output log adalah ke SLF4J.
Hanya Jul yang merupakan pengecualian, karena Java dilengkapi dengan implementasi JDK, dan tidak mungkin untuk merevisi kembali kelas-kelas itu. Tempat ini mengimplementasikan handler SLF4J berdasarkan mekanisme ekstensi pawang JUL dan kemudian menulis log ke slf4j. Agar berlaku, Anda juga harus memodifikasi JRE/LIB/LOGGING.Properties untuk mengonfigurasi pawang baru ke properti .Handlers. Secara umum, produksi tidak akan dilakukan seperti ini.
2.3 Aplikasi
Saat menerapkan proyek yang sebenarnya, berhati -hatilah agar paket yang dijembatani dan jembatan tidak dapat muncul pada saat yang sama, jika tidak, loop mati akan terjadi. Misalnya, SFL4J menjembatani Log4j dan Log4j, maka panggilan output log4J akan menunjuk ke SLF4J, dan SLF4J menunjuk ke log4j di loop ini. Pastikan untuk menghilangkan paket yang tidak berguna.
Saran produksi: Implementasi SLF4J-API yang dipasang hanya mempertahankan logback, dan jembatan pencetakan log atas dapat ada semua yang menunjuk ke SLF4J.
Lihat dependensi berikut, dan semua paket log lainnya dikecualikan:
<Dependencies> <dependency> <GroupId> org.slf4j </groupid> <ArTifactId> slf4j-api </t Artifactid> <version> 1.7.24 </version> </dependency> </Version> </Version12. <dependency> <GroupId> org.slf4j </groupid> <ArtifactId> jcl-over-slf4j </arttifactid> <version> 1.7.14 </version> </dependency> <pendepriceD> </org.slf4j </groupid> <ArTifactid> Log4j-over-out </Dependency> <dependency> <GroupId> org.slf4j </groupid> <ArTifactId> jul-to-slf4j </artifactid> <version> 1.7.7 </versi
3. Implementasi kode uji dan pom
Kode uji
TestLoggers kelas publik { / ** * slf4j-api-> slf4j-log4j12-> log4j * / public void testsfl4juPlog4j () {org.slf4j.logger Logger = loggerFactory.getLogger (testLogGers.class.getname ()); logger.info ("slf4j cetak gunakan log4j"); } /** * slf4j-api --> slf4j-jcl --> common-logging-api (automatically to log4j)--> log4j */ public void testSlf4j2CommonLogging(){ org.slf4j.Logger logger = LoggerFactory.getLogger(TestLoggers.class.getName()); logger.warn ("slf4j mencetak ke logging umum"); } / ** * LOG4J-EVER-SLF4J-API-> LOGBACK-CLASSIC * / public void testlog4j2slf4j () {org.apache.log4j.logger Logger = org.apache.log4j.logger.getLogger (testloggers.apache.log4j.logger.getLogger (testLoggers.apache.apache.log4j.logger.getLogger (testLoggers.apache.apache.log4j.logger.getLogger (testloggers.apache.apache.);););) ();););););) ();) ;getname (testloggers.apache. Logger.info ("Log4j Print ke Slf4j"); } / ** * jcl-over-slf4j-> sfl4-api-> logback * / public void testCommonLogging2sl4j () {log log = logfactory.getLog (testLoggers.class.getName ()); log.info ("log umum ke slf4j"); }/** * jul (konsol default)-> jul-to-slf4j-> slf4j-> logback * untuk menambahkan org.slf4j.bridge.slf4jbridgeHandler di jre/lib/logging.properties */public void testjul2slf4j () {java.. java.util.logging.logger.getLogger (testLoggers.class.getName ()); logger.info ("jul print to slf4j"); } public static void main (string [] args) {testloggers tester = new testLoggers (); tester.testslf4j2Commonging (); }}Uji dependensi Maven
<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.24</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging-api</artifactId> <version>1.1</version> </dependency> <!-<dependency>-> <!-<groupId> org.slf4j </groupId>-> <!-<t ArtifactId> jcl-over-slf4j </artifactid>-> <!-<version> 1.7.14 </versi>->-</dependency>-> <version> <sroupdid> <grouplf.sorg.sorg.sr4 <ArtifactId> log4j-over-slf4j </stifactid> <version> 1.7.24 </version> </dependency> <!-<dependency>-> <!-<groupid> org.slf4j </groupid>-> <Artifactid> versi <t Artifactid> Jul-to-Slf4j </Artifactid> <t Artifactid> <t ArtifactD> <!-</dependency>-> <!-<dep dependency>-> <!-<sroupid> ch.qos.logback </groupid>-> <!-<t Artifactid> Logback-Classic </artifactid>-> <!-<version> 1.2.1 </versi>-> <!-</dependency>-> <!-<version> 1.2.1 </versi>-> <!-</dependency>-> <!-<version> 1.2.1 </versi>-> <!-</dependency>-> <!-<version> 1.2.1 </versi>-> <!-</dependency>-> <!-<version> 1.2.1 </versi>-> <!-</dependency>-> <! <!-<GroupId> org.slf4j </proupid>-> <!-<t ArtifactId> slf4j-log4j12 </stifactid>-> <!-<version> 1.7.5 </version>-> <!-</dependency>-<groupid> <groupid> LOG4J </groupid> <t Artact>-> <clependency> <roupid> <croupid> <croupt> <sroupid> <t Artifact> <septandency> <clependency> <roupid> <croupt> <croupsid> <t Artifact> <septandency> <clependency> <roupId> <croupTID> <TRUPIPID> <TROPACT> <version> 1.2.17 </version> </dependency> <dependency> <GroupId> org.slf4j </groupid> <ArtifactId> slf4j-jcl </artifactid> <version> 1.7.24 </version> </dependency> </dependencies>
Artikel di atas secara singkat membahas penggunaan kompatibilitas SLF4J dengan sistem log lainnya adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.