แต่ละเฟรมเวิร์กในเฟรมเวิร์กต่างๆที่ผลิตโดย Java (เช่นฤดูใบไม้ผลิ ฯลฯ ) จะใช้ระบบบันทึกที่แตกต่างกัน จะมีปัญหาบางอย่างเกี่ยวกับการผสมบันทึกที่แตกต่างกันหลายรายการในหนึ่ง JVM ที่นี่เราจะจัดเรียงเฟรมเวิร์กบันทึกทั่วไปในระบบ Java แนะนำความสัมพันธ์กับแต่ละเฟรมเวิร์กบันทึกที่มีศูนย์กลางอยู่ที่ SFL4J และแนะนำวิธีการจัดการเฟรมเวิร์กบันทึกต่างๆในสภาพแวดล้อมการผลิต
1. บทนำสู่อินเทอร์เฟซ
ในระบบ Java ส่วนใหญ่มีอินเทอร์เฟซระบบบันทึกสองส่วน: SLF4J และการบันทึกทั่วไป มีเฟรมเวิร์กมากมายที่จะนำไปใช้เช่น logback, log4j ฯลฯ
แน่นอนแม้ว่าทั้งคู่จะเป็นอินเทอร์เฟซ แต่ทั้งสองก็สามารถบรรลุเอาต์พุตพร็อกซีบันทึกร่วมกันผ่านแพ็คเก็ตบริดจ์
การใช้งานบันทึกการติดตั้งแบบสามัญมักจะเป็น log4j ในระหว่างการเริ่มต้นหากไม่มีข้อกำหนดพิเศษสำหรับผู้ที่จะเมานต์มันจะถูกสร้างอินสแตนซ์โดยอัตโนมัติตามลำดับข้างต้น log4jlogger ห่อหุ้ม logger ของ log4j และการโทร log4j เมื่อพิมพ์บันทึก
2. สะพานและถูกเชื่อมต่อใน SLF4J
ในฐานะที่เป็นคำจำกัดความของอินเทอร์เฟซ SLF4J สามารถมีกรอบการใช้งานจำนวนมากที่ด้านล่างและยังสามารถรองรับการใช้งานบันทึกอื่น ๆ หรือเฟรมเวิร์กไปยัง SFL4J การใช้งานจะขึ้นอยู่กับแพ็คเกจสะพานที่แตกต่างกัน
2.1 สะพาน SLF4J
ในฐานะที่เป็นคำจำกัดความของอินเทอร์เฟซมีการใช้งานมากมายด้านล่าง หลักการดำเนินการคือการเริ่มต้นการเริ่มต้นเมื่อได้รับ IloggerFactory กระบวนการเริ่มต้นจะเชื่อมโยงวัตถุการใช้งาน: โหลดคลาสทั้งหมดที่ใช้ StaticLoggerBinder จากนั้นรับ Singleton เมื่อดำเนินการ getLogger วิธีการของคลาสซิงเกิลนี้จะถูกเรียกให้รับวัตถุ logger ที่เกี่ยวข้องกับการใช้งานเฉพาะของฟังก์ชั่นการบันทึก หากมีการใช้งานหลายอย่างให้ผูกหนึ่งในนั้น สถานการณ์นี้ต้องการการลบคลาสการใช้งานบันทึกที่ไม่พึงประสงค์
2.2 SLF4J เป็นสะพานเชื่อม
รูปด้านบนแสดงให้เห็นว่าระบบบันทึกอื่น ๆ เชื่อมต่อกับระบบบันทึก SLF4J ได้อย่างไร หลักการพื้นฐานคือการพร็อกซีระบบบันทึกที่เกี่ยวข้องและส่งออกไปยังอินเตอร์เฟส SFL4J สำหรับการใช้งานเฉพาะคุณสามารถเห็นการใช้งานแพ็คเกจบริดจ์ โดยทั่วไปการใช้งานบันทึกต้นฉบับได้รับการปรับปรุงใหม่และวิธีการพื้นฐานของการเรียกเอาต์พุตบันทึกจริงคือ SLF4J
มีเพียง ก.ค. เท่านั้นที่เป็นข้อยกเว้นเนื่องจาก Java มาพร้อมกับการใช้งาน JDK และเป็นไปไม่ได้ที่จะสร้างชั้นเรียนเหล่านั้นใหม่อีกครั้ง สถานที่แห่งนี้ใช้ตัวจัดการ SLF4J ตามกลไกการขยาย Handler JUL จากนั้นเขียนบันทึกเป็น SLF4J เพื่อให้เกิดผลคุณต้องแก้ไข JRE/LIB/Logging.properties เพื่อกำหนดค่าตัวจัดการใหม่ให้เป็นคุณสมบัติ. handlers โดยทั่วไปการผลิตจะไม่ทำเช่นนี้
2.3 แอปพลิเคชัน
เมื่อใช้โครงการจริงโปรดระวังว่าแพ็คเกจ Bridged และ Bridged ไม่สามารถปรากฏขึ้นได้ในเวลาเดียวกันมิฉะนั้นจะมีการวนซ้ำที่ตายแล้ว ตัวอย่างเช่น SFL4J เชื่อมทั้ง log4j และ log4j จากนั้นการเรียกเอาต์พุต log4j จะชี้ไปที่ SLF4J และ SLF4J ชี้ไปที่ log4j ในลูปนี้ อย่าลืมกำจัดแพ็คเกจที่ไร้ประโยชน์
ข้อเสนอแนะการผลิต: การใช้งาน SLF4J-API ที่ติดตั้งจะยังคงรักษาไว้เท่านั้นและสะพานการพิมพ์บันทึกด้านบนสามารถมีอยู่ทั้งหมดที่ชี้ไปที่ SLF4J
อ้างถึงการพึ่งพาต่อไปนี้และแพ็คเกจบันทึกอื่น ๆ ทั้งหมดได้รับการยกเว้น:
<การพึ่งพา> <การพึ่งพา> <loupId> org.slf4j </groupId> <ratifactid> slf4j-api </artifactid> <version> 1.7.24 </version> </predency> <การพึ่งพา> <roupId> org.slf4j </groupId> <ratifactid> jcl-over-slf4j </artifactid> <version> 1.7.14 </version> </การพึ่งพา> <การพึ่งพา> <loupid> org.slf4j </groupid> </dermentency> <การพึ่งพา> <loupId> org.slf4j </groupId> <ratifactId> Jul-to-slf4j </artifactid> <version> 1.7.7 </version>
3. การใช้รหัสทดสอบและ POM
รหัสทดสอบ
TestLoggers ระดับสาธารณะ { / ** * SLF4J-API-> SLF4J-LOG4J12-> log4j * / โมฆะสาธารณะ testsfl4juplog4j () {org.slf4j.logger logger = loggerFactory.getLogger logger.info ("slf4j พิมพ์ใช้ log4j"); } / ** * slf4j-api-> slf4j-jcl-> Common-Logging-Api (โดยอัตโนมัติเพื่อ log4j)-> log4j * / โมฆะสาธารณะ testslf4j2commonlogging () {org.slf4j.logger logger = loggeractory.getLogger logger.warn ("slf4j พิมพ์ไปยังการบันทึกทั่วไป"); } / ** * log4j-over-slf4j-api-> logback-classic * / โมฆะสาธารณะ testlog4j2slf4j () {org.apache.log4j.logger logger = org.apache.log4j.logger.getLogger logger.info ("log4j พิมพ์เป็น 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 */โมฆะสาธารณะ java.util.logging.logger.getLogger (testloggers.class.getName ()); logger.info ("PRINT TO SLF4J"); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {testloggers tester = testloggers ใหม่ (); tester.testslf4j2commonlogging (); -ทดสอบการพึ่งพา maven
<การพึ่งพา> <การพึ่งพา> <roupId> org.slf4j </groupId> <ratifactId> SLF4J-API </ArtifactId> <Sersion> 1.7.24 </Sident> </การพึ่งพา> <Dernency> <!-<การพึ่งพาอาศัย>-> <!-<RoupID> org.slf4j </groupId>-> <!-<ArtIfactId> JCL-Over-SLF4J </artifactid>-> <!-<Sersion> 1.7.14 </เวอร์ชัน>-> <! <ArtIfactId> log4j-over-slf4j </artifactid> <sersion> 1.7.24 </เวอร์ชัน> </การพึ่งพา> <!-<predency>-> <!-<GroupId> org.slf4j </groupid>-> <! <!-</การพึ่งพาอาศัย>-> <!-<การพึ่งพาอาศัย>-> <!-<loupId> ch.qos.logback </groupId>-> <!-<ratifactid> logback-classic </artifactid>-> <! <!-<roupId> org.slf4j </groupId>-> <!-<ArtIfactId> SLF4J-LOG4J12 </artifactId>-> <!-<Sersion> 1.7.5 </Sersion>-> <!-</การพึ่งพา <Sersion> 1.2.17 </Servive> </การพึ่งพา> <การพึ่งพา> <roupId> org.slf4j </groupId> <ratifactId> SLF4J-JCL </artifactId> <version> 1.7.24 </Serve>
บทความข้างต้นกล่าวถึงการใช้ความเข้ากันได้ของ SLF4J กับระบบบันทึกอื่น ๆ โดยสังเขปเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น