นี่คือวิธีที่คุณทำแอปพลิเคชันใหม่ คุณจะพบปัญหาต่าง ๆ เมื่อวานนี้ฉันเพิ่งแก้ไขปัญหาของชั้นเรียนไม่สามารถมองเห็นได้จากตัวโหลดคลาสเมื่อโหลดคลาสที่แน่นอน วันนี้ฉันพบปัญหาที่ไม่พบไฟล์บันทึกซึ่งเกี่ยวข้องกับไลบรารีของบุคคลที่สอง มาพูดคุยกันทีละคน
ภายใต้สถานการณ์ปกติให้วางไฟล์การกำหนดค่า logback-spring.xml ในไดเรกทอรี SRC/Main/Resources (ใช้ระบบบันทึกการบันทึก) ดังแสดงในรูปด้านล่าง
ตั้งค่า Spring.application.name = Spring-Boot-Demo-Application ใน Application.properties
แพ็คเกจสองพรรคมี logback.xml อยู่ในนั้น
ตามการกำหนดค่าข้างต้นหลังจากทำงานภายใต้สถานการณ์ปกติเราหวังว่าไฟล์บันทึกแอปพลิเคชันควรรวมอยู่ในผู้ใช้งาน Home/Spring-Boot-Demo-Application/Logs Directory แต่ไม่ได้ แม้แต่โฟลเดอร์ Spring-Boot-Demo-Application ก็ยังไม่ได้ถูกสร้างขึ้น
ลองมาดูกันว่าระบบบันทึกค้นหาและแยกวิเคราะห์ไฟล์การกำหนดค่าบันทึกอย่างไร Springboot ใช้คลาส LoggingApplicationListener เพื่อเริ่มต้นระบบบันทึก LoggingApplicationListener ใช้อินเทอร์เฟซ ApplicationListener จากนั้นเราจะเห็นว่าวิธีการ OnApplicationEvent ของ LoggingApplicationListener ทำอย่างไรผ่านแผนภูมิเวลา:
รหัส (8) ค้นหาไฟล์การกำหนดค่าบันทึกมาตรฐาน มาตรฐานคืออะไร? จากนั้นดูรหัสของรหัส (9):
สตริงที่ได้รับการป้องกัน [] getStandardConfigLocations () {ส่งคืนสตริงใหม่ [] {"logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml"}; -เช่น "logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml" เหล่านี้เป็นมาตรฐาน
ดังนั้นวิธีการค้นหานั้นขึ้นอยู่กับรหัส (10):
สตริงส่วนตัว findConfig (สตริง [] ตำแหน่ง) {สำหรับ (ตำแหน่งสตริง: ตำแหน่ง) {classPathResource resource = ใหม่ classPathResource (ตำแหน่ง, this.classloader); if (resource.exists ()) {return "classpath:" + ตำแหน่ง; }} return null; -จะเห็นได้ว่าการใช้คลาส classpathresource เพื่อค้นหาให้ดูวิธีการที่มีอยู่ของ classpathresource:
บูลีนสาธารณะมีอยู่ () {return (resolveurl ()! = null); } URL ที่ได้รับการป้องกันการแก้ไข () {ถ้า (this.clazz! = null) {return this.clazz.getResource (this.path); } อื่นถ้า (this.classloader! = null) {return this.classloader.getResource (this.path); } else {return classloader.getSystemResource (this.path); -จะเห็นได้ว่า this.classloader.getResource (this.path); เพื่อค้นหา classloader เป็น appclassloader
หากรหัส (8) ไม่พบการกำหนดค่าจุดดำเนินการ (12) ตรรกะและรหัส (8) คล้ายกัน แต่ชื่อไฟล์แตกต่างกัน มาดูกันเถอะ:
สตริงที่ได้รับการป้องกัน [] getSpringConfiglocations () {สตริง [] ตำแหน่ง = getStandardConfigLocations (); สำหรับ (int i = 0; i <locations.length; i ++) {string extension = stringUtils.getFilenameExtension (ตำแหน่ง [i]); ตำแหน่ง [i] = ตำแหน่ง [i] .substring (0, ตำแหน่ง [i] .length () - extension.length () - 1) + "-spring" + ส่วนขยาย; } คืนสถานที่; -จะเห็นได้ว่าสปริงจะถูกประกบกับชื่อไฟล์ของ GetStandardConfiglocations และชื่อไฟล์ spliced คือ:
“ `“ logback-test-spring.groovy”,“ logback-test-spring.xml”,“ logback-spring.groovy”,“ logback-spring.xml”
หากต้องการรวมสปริงโบทค้นหาไฟล์การกำหนดค่าบันทึกมาตรฐานก่อน หากคุณไม่พบไฟล์ที่กำหนดค่าสปริง splices
ดังนั้นข้างต้นเราบอกว่าแพ็คเกจ JAR ที่มี logback.xml ถูกนำเข้าสู่แอปพลิเคชันและแพ็คเกจ JAR นี้ก็โหลดโดยใช้ AppClassLoader ดังนั้นเมื่อดำเนินการขั้นตอน (8) พบว่า logback.xml ในแพ็คเกจ JAR ถูกพบดังนั้นเราจะไม่ดำเนินการขั้นตอน (12) อีกต่อไปเพื่อค้นหา logback-spring.xml ที่กำหนดเองของเรา
โซลูชันที่ 1: แก้ไขไฟล์การกำหนดค่าของเราเป็น logback.xml ดังนั้นในขั้นตอน (8) คุณจะค้นหา logback.xml ก่อนซึ่งควรพบ
การแก้ปัญหา 2: หลีกเลี่ยงแพ็คเกจสองพรรคที่มี logback.xml ในกรณีนี้จะไม่มีปัญหาว่าการกำหนดค่าของเราเองคือ logback-spring.xml หรือ logback.xml
ในการพัฒนารายวันแพ็คเกจของบุคคลที่สองไม่ควรมีไฟล์การกำหนดค่าบันทึก บันทึกที่ใช้ในไลบรารีของบุคคลที่สองโดยทั่วไปจะถูกสร้างขึ้นโดยใช้รหัส
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น