เหตุใดจึงต้องใช้หนึ่งในแพ็คเกจต่อไปนี้แทนแพ็กเกจอื่น ๆ
- การบันทึก Java
- การบันทึกคอมมอนส์
- log4j
- SLF4J
- Logback
เหตุใดจึงต้องใช้หนึ่งในแพ็คเกจต่อไปนี้แทนแพ็กเกจอื่น ๆ
คำตอบ:
ตามลำดับเวลาของการปรากฏของ API (เท่าที่ฉันรู้):
logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
// Note that it's actually *more* efficient than this - see Huxi's comment below...
logger.debug("The entry is " + entry + ".");
}
ฉันพบว่าการเข้าสู่ระบบ Java ทำให้สับสนไม่สอดคล้องกันเอกสารไม่ดีและโดยเฉพาะอย่างยิ่งส่งเดช นอกจากนี้ยังมีความคล้ายคลึงกันจำนวนมากระหว่างเฟรมเวิร์กการบันทึกเหล่านี้ซึ่งส่งผลให้เกิดความพยายามซ้ำซ้อนและเกิดความสับสนว่าคุณอยู่ในสภาพแวดล้อมการบันทึกแบบใดโดยเฉพาะอย่างยิ่งหากคุณกำลังทำงานในสแต็กเว็บแอ็พพลิเคชัน Java ที่ร้ายแรงคุณมักจะอยู่ในหลายอย่างการบันทึกสภาพแวดล้อมในครั้งเดียว (เช่น hibernate อาจใช้ log4j และ tomcat java.util.logging) Apache commons มีไว้เพื่อเชื่อมโยงเฟรมเวิร์กการบันทึกที่แตกต่างกัน แต่เพิ่มความซับซ้อนมากขึ้นเท่านั้น หากคุณไม่ทราบล่วงหน้าสิ่งนี้จะทำให้สับสนอย่างที่สุด เหตุใดข้อความบันทึกของฉันจึงไม่พิมพ์ออกมาที่คอนโซล ฯลฯ โอ้เพราะฉันกำลังดูบันทึก Tomcat ไม่ใช่ log4j การเพิ่มความซับซ้อนอีกชั้นหนึ่งแอ็พพลิเคชันเซิร์ฟเวอร์อาจมีการกำหนดค่าการบันทึกส่วนกลางที่อาจไม่รู้จักการกำหนดค่าภายในสำหรับเว็บแอปพลิเคชันเฉพาะ สุดท้ายนี้เฟรมเวิร์กการบันทึกทั้งหมดเหล่านี้เป็นวิธีที่ซับซ้อนเกินไป การเข้าสู่ระบบ Java เป็นเรื่องยุ่งเหยิงทำให้นักพัฒนาอย่างฉันหงุดหงิดและสับสน
Java เวอร์ชันก่อนหน้าไม่มีกรอบการบันทึกในตัวที่นำไปสู่สถานการณ์นี้
มีประเด็นสำคัญอย่างหนึ่งที่ไม่ได้กล่าวถึงมาก่อน:
SLF4J (และทั้ง Logback และ LOG4J เป็นแบ็กเอนด์การบันทึก) รองรับสิ่งที่เรียกว่า Mapped Diagnostic Context (MDC ดูjavadocและเอกสารประกอบ )
โดยพื้นฐานแล้วนี่คือแผนที่ <String, String> เธรด - โลคัลซึ่งคุณสามารถใช้เพื่อเพิ่มข้อมูลบริบทเพิ่มเติมให้กับเหตุการณ์การบันทึกของคุณ สถานะปัจจุบันของ MDC ติดอยู่กับทุกเหตุการณ์
สิ่งนี้จะมีประโยชน์อย่างเหลือเชื่อหากคุณใส่สิ่งต่างๆเช่นชื่อผู้ใช้และ URL ของคำขอ (ในกรณีของเว็บแอป) ลงไป สามารถทำได้โดยอัตโนมัติโดยใช้ตัวกรองตัวอย่างเช่น
ดูคำตอบของคำถามแนวทางปฏิบัติที่ดีที่สุดในการบันทึกข้อผิดพลาดคืออะไร โดยเฉพาะ:
มีปัญหาการโหลดคลาสที่อาจเกิดขึ้นกับ Commons Logging
Log4J และ SLF4J ได้รับการพัฒนาโดยบุคคลเดียวกันโดยเรียนรู้จากปัญหาที่พบในทางปฏิบัติด้วย Log4J
ในโครงการของ บริษัท เราใช้ LOG4j และใช้งานง่ายมากเหมือนที่ Stephen แสดงในตัวอย่างของเขา นอกจากนี้เรายังได้เขียนคลาสรูปแบบของเราเองสำหรับ LOG4j เพื่อให้คุณสามารถสร้างสคีมาไฟล์เอาต์พุตของคุณเองได้ คุณสามารถอธิบายว่าไฟล์บันทึกของคุณควรมีลักษณะอย่างไร เป็นไปได้ที่จะปรับปรุงคลาส log4j ดั้งเดิม
คุณสมบัติ LOG4j ทั้งหมดที่คุณสามารถเปลี่ยนได้ในไฟล์ log4j.properties ดังนั้นคุณสามารถใช้ไฟล์ที่แตกต่างกันสำหรับโปรเจ็กต์ต่างๆ
การบันทึก Java ไม่ใช่รายการโปรดของฉัน แต่อาจเป็นเพราะฉันใช้ log4j ตั้งแต่เริ่มต้น
ภาพรวมการเข้าสู่ระบบคอมมอนส์ให้เหตุผลสำหรับการดำรงอยู่ของมัน: การเข้าสู่ระบบจากโค้ดห้องสมุดเมื่อคุณมีการควบคุมมากกว่ากรอบการเข้าสู่ระบบพื้นฐานไม่มี สำคัญมากสำหรับโครงการ Apache ต่างๆซึ่งจะเชื่อมโยงกับแอปพลิเคชันภายนอก บางทีอาจไม่สำคัญสำหรับโครงการไอทีภายในซึ่งคุณสามารถควบคุมได้ทั้งหมด
ที่กล่าวว่าฉันเขียนถึง Commons Logging เช่นเดียวกับนักพัฒนาคนอื่น ๆ ที่ฉันรู้จัก เหตุผลก็คือเพื่อลดภาระทางจิตใจให้น้อยที่สุด: คุณสามารถเปลี่ยนโครงการหรืองานและไม่ต้องเรียนรู้กรอบงานใหม่ (หากงาน / โครงการใหม่ใช้ CL ด้วยและ / หรือคุณสามารถโน้มน้าวให้พวกเขาย้ายไปได้)
นอกจากนี้ยังมีคุณค่าในการสร้าง Wrapper ของคุณเองรอบ ๆ กรอบงานที่คุณใช้ ตามที่อธิบายไว้ที่นี่ฉันต้องการใช้อ็อบเจ็กต์ LogWrapper เพื่อจัดเตรียมสตริงที่กำหนดเอง (สำคัญ) และลดความยุ่งเหยิงของข้อความบันทึก (สำคัญน้อยกว่า)
โดยทั่วไปฉันจะใช้ Log4J เป็นค่าเริ่มต้น
ฉันจะใช้ Java Logging ถ้าฉันไม่สนใจการพึ่งพา Java 1.4 แต่ฉันยังคงใช้ Log4J ตามความต้องการ
ฉันจะใช้ Commons Logging ถ้าฉันกำลังปรับปรุงบางอย่างที่ใช้อยู่แล้ว
ฉันขอแนะนำให้สร้างซุ้มการบันทึกแบบบางที่สามารถเขียนลงในเฟรมเวิร์กการบันทึกใด ๆ ณ จุดนั้นการเลือกเอนจินสำรองจะกลายเป็นจุดที่ค่อนข้างสงสัย