كل إطار في مختلف الأطر التي تنتجها Java (مثل الربيع ، وما إلى ذلك) سيستخدم أنظمة سجل مختلفة. سيكون هناك بعض المشكلات في خلط سجلات مختلفة متعددة في JVM واحد. سنقوم هنا بفرز أطر عمل السجل المشتركة في نظام Java ، ونقدم العلاقة مع كل إطار عمل تركز على SFL4J ، ونقدم كيفية إدارة أطر السجل المختلفة في بيئة الإنتاج.
1. مقدمة للواجهة
في نظام Java ، هناك بشكل أساسي واجهتان لنظام السجل: SLF4J والتعطيل المشترك. هناك العديد من الأطر التي يجب تنفيذها ، مثل Logback ، Log4J ، إلخ.
بالطبع ، على الرغم من أن كلاهما واجهات ، يمكن للثاني أيضًا تحقيق إخراج وكيل السجل المتبادل من خلال حزم الجسر.
غالبًا ما يكون تنفيذ السجل للتسجيل المشترك Log4J. أثناء التهيئة ، إذا لم يكن هناك مواصفات خاصة لمن يركض ، فسيتم إنشاء مثيل لها تلقائيًا بالترتيب أعلاه. يقوم Log4Jlogger بتغليف سجل Log4J ويتصل بـ Log4J عند الطباعة.
2. الجسر وتجسيد في SLF4J
كتعريف واجهة ، يمكن أن يكون لـ SLF4J العديد من أطر التنفيذ في الأسفل ، ويمكن أيضًا دعم تطبيقات السجل الأخرى أو الأطر إلى SFL4J. يعتمد تنفيذها على حزم الجسر المختلفة.
2.1 جسر SLF4J
كتعريف واجهة ، هناك العديد من التطبيقات أدناه. مبدأ التنفيذ هو تنفيذ التهيئة عند الحصول على IloggerFactory. تربط عملية التهيئة كائن التنفيذ: تحميل جميع الفئات التي تنفذ staticloggerbinder ، ثم الحصول على Singleton. عند تنفيذ GetLogger ، يتم استدعاء طريقة فئة Singleton هذه للحصول على كائن المسجل المقابل مع تنفيذ محدد لوظائف التسجيل. إذا كانت هناك تطبيقات متعددة ، فربط أحدها. يتطلب هذا الموقف إزالة فئات تنفيذ السجل غير المرغوب فيها.
2.2 SLF4J سد
يوضح الشكل أعلاه كيفية توصيل أنظمة السجل الأخرى بنظام سجل SLF4J. المبدأ الأساسي هو تكييف أنظمة السجل الخاصة بهم وإخراجها إلى واجهة SFL4J. للتطبيقات المحددة ، يمكنك رؤية تنفيذ حزمة الجسر. بشكل أساسي ، تم إعادة تنفيذ تطبيق السجل الأصلي ، والطريقة الأساسية لاتخاذ استدعاء السجل هي SLF4J.
JUL فقط هو استثناء ، لأن Java يأتي مع تطبيق JDK ، ومن المستحيل إعادة بناء تلك الفئات. هذا المكان ينفذ معالج SLF4J استنادًا إلى آلية تمديد Jul Handler ثم يكتب السجل إلى SLF4J. لتصبح مفيدة ، يجب عليك أيضًا تعديل JRE/LIB/Logging.Properties لتكوين المعالج الجديد في خاصية .Handlers. بشكل عام ، لن يتم الإنتاج مثل هذا.
2.3 التطبيق
عند تطبيق المشاريع الفعلية ، كن حذرًا من أن الحزمة الجسدية والجرافة لا يمكن أن تظهر في نفس الوقت ، وإلا ستحدث حلقة ميتة. على سبيل المثال ، SFL4J يسد كل من log4j و log4j ، ثم ستشير مكالمة الإخراج log4j إلى SLF4J ، ونقاط SLF4J إلى log4j في هذه الحلقة. تأكد من القضاء على الحزم عديمة الفائدة.
اقتراحات الإنتاج: يحتفظ بتنفيذ SLF4J-API المثبت فقط على التسجيل ، ويمكن أن يوجد جسر طباعة السجل العلوي كل الإشارة إلى SLF4J.
ارجع إلى التبعيات التالية ، ويتم استبعاد جميع حزم السجل الأخرى:
<ependencies> <Rependency> <roupiD> org.slf4j </rougiD> <ArtifactId> slf4j-api </artifactId> <الإصدار> 1.7.24 </version> </respency> <sperency> <sropency> <croupid> ch.qos.logback </groupid> <Rependency> <roupED> org.slf4j </rougiD> <StifactId> jcl-over-slf4j </artifactId> <soper> 1.7.14 </version> </respency> <redence> <roupend> org.slf4j </groupid> </reperency> <reperency> <roupiD> org.slf4j </rougiD> <intifactid> jul-to-slf4j </shintifactid> <الإصدار> 1.7.7 </الإصدار> </respendency> </تبعية>
3. تنفيذ رمز الاختبار و POM
رمز الاختبار
الفئة العامة testloggers { / ** * slf4j-api-> slf4j-log4j12-> log4j * / public void testsfl4juplog4j () {org.slf4j.logger logger = loggerfactory.getlogger (testloggers.class.getname () ؛ logger.info ("slf4j print use log4j") ؛ } / ** * slf4j-api-> slf4j-jcl-> common-logging-api (تلقائيًا إلى log4j)-> log4j * / public void testSlf4j2CommonLogging () {org.slf4j.logger logger = loggerfactory.getlogger (testloggers.class.getname logger.warn ("SLF4J print to Common Logging") ؛ } / ** * log4j-over-slf4j-api-> تسجيل الدخول الكلاسيكي * / public void testlog4j2slf4j () {org.apache.log4j.logger logger = org.apache.log4j.logger.getLogger (testloggers.class.getname () ؛ logger.info ("log4j print to slf4j") ؛ } / ** * jcl-over-slf4j-> sfl4-api-> Logback * / public void testCommonLogging2Sl4J () {log log = logfactory.getLog (testloggers.class.getName ()) ؛ log.info ("سجل مشترك إلى SLF4J") ؛ }/** * يوليو (وحدة التحكم الافتراضية)-> jul-to-slf4j-> slf4j-> logback * لإضافة org.slf4j.bridge.slf4jbridgehandler في jre/lib/logging.properties */public void testjul2slf4j () {java.util.logging. java.util.logging.logger.getLogger (testloggers.class.getName ()) ؛ logger.info ("Jul Print to SLF4J") ؛ } الفراغ الثابت العام (سلسلة [] args) {testloggers tester = new testloggers () ؛ tester.testslf4j2commonlogging () ؛ }}اختبار تبعيات مافن
<Rependencies> <Rependency> <roupiD> org.slf4j </rougiD> <artifactId> slf4j-api </shintifactid> <الإصدار> 1.7.24 </version> </respensidency> <sperency> <croupid> logons-logging </rougiD> <StifactId> <!-<redency>-> <!-<rougiD> org.slf4j </rougeid>-> <!-<StifactId> jcl-over-slf4j </stifactid>-> <!-<splect> 1.7.14 </version>-> <! <StifactId> log4j-over-slf4j </shintifactid> <الإصدار> 1.7.24 </version> </dependency> <!-<redency>-> <!-<groupid> org.slf4j </rougeid>-> <!-<artifactId> jul-tlf4j </ethifactid> <!-</rependency>-> <!-<redency>-> <!-<groupId> ch.qos.logback </rougiD>-> <!-<StifactId> كلاسيك التسجيل </artifactid>-> <! <!-<roucid> org.slf4j </rougeid>-> <!-<intifactid> slf4j-log4j12 </shintifactid>-> <!-<الإصدار> 1.7.5 </version>-> <!-</rependency>-> venseDency> <sophy> 1.2.17 </version> </sependency> <redence> <roupiD> org.slf4j </roughid> <intifactid> slf4j-jcl </shintifactid> <soph>
تناقش المقالة أعلاه باختصار استخدام توافق SLF4J مع أنظمة السجل الأخرى هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.