ไปข้างหน้า: ตั้งโปรแกรมไปที่ log4j2 API แทน slf4j
ปลอดภัย: Log4j2 API ให้การรับประกันเช่นเดียวกับ slf4j และอื่น ๆ
ตอนนี้ Log4j2 นั้นแยกออกเป็น API และโมดูลการนำไปใช้งานแล้วไม่มีค่าใด ๆ ในการใช้ SLF4J อีกต่อไป
ใช่การปฏิบัติทางวิศวกรรมที่ดีเพื่อให้ตัวเลือกของคุณเปิดกว้าง คุณอาจต้องการเปลี่ยนเป็นการใช้งานการบันทึกอื่นในภายหลัง
ในช่วง 10 ปีที่ผ่านมาการสร้างความยืดหยุ่นในแอปพลิเคชันของคุณหมายถึงการใช้ Wrapper API เช่น SLF4J ความยืดหยุ่นนี้ไม่ได้มาฟรี แต่ข้อเสียของวิธีนี้คือแอปพลิเคชันของคุณไม่สามารถใช้ชุดคุณลักษณะที่สมบูรณ์ยิ่งขึ้นของไลบรารีการบันทึกที่อยู่เบื้องหลังได้
Log4j2 นำเสนอโซลูชันที่ไม่ต้องการให้แอปพลิเคชันของคุณถูก จำกัด ไว้ที่ตัวส่วนร่วมที่ต่ำที่สุด
วาล์วหนี: log4j-to-slf4j
Log4j2 มีlog4j-to-slf4j
โมดูลบริดจ์ แอปพลิเคชันใด ๆ ที่เข้ารหัสกับ Log4j2 API สามารถเลือกที่จะเปลี่ยนการใช้งานการสำรองข้อมูลเป็นการใช้งานที่สอดคล้องกับ slf4j ได้ทุกเมื่อ
ดังที่ได้กล่าวไว้ในคำถามการใช้ Log4j2 API โดยตรงจะมอบฟังก์ชันการทำงานที่มากกว่าและมีข้อดีที่ไม่ใช้งานได้เมื่อเทียบกับการใช้ wrapper API เช่น slf4j:
- API ข้อความ
- Lambdas สำหรับการบันทึกที่ขี้เกียจ
- บันทึกวัตถุใด ๆ แทนที่จะเป็นเพียงสตริง
- ปลอดขยะ: หลีกเลี่ยงการสร้าง varargs หรือสร้าง Strings หากเป็นไปได้
- CloseableThreadContext จะลบรายการออกจาก MDC โดยอัตโนมัติเมื่อคุณทำเสร็จแล้ว
(ดู10 คุณลักษณะ Log4j2 API ที่ไม่มีใน SLF4Jสำหรับรายละเอียดเพิ่มเติม)
แอปพลิเคชันสามารถใช้คุณลักษณะที่หลากหลายเหล่านี้ของ Log4j2 API ได้อย่างปลอดภัยโดยไม่ถูกล็อกในการใช้งานหลักของ Log4j2
SLF4J ยังคงเป็นวาล์วนิรภัยของคุณ แต่ก็ไม่ได้หมายความว่าแอปพลิเคชันของคุณควรตั้งรหัสเทียบกับ SLF4J API อีกต่อไป
การเปิดเผยข้อมูล: ฉันมีส่วนร่วมใน Log4j2
อัปเดต: ดูเหมือนจะมีความสับสนอยู่บ้างที่การเขียนโปรแกรมบน Log4j2 API แนะนำ "ส่วนหน้าสำหรับซุ้ม" ไม่มีความแตกต่างในแง่นี้ระหว่าง Log4j2 API และ SLF4J
API ทั้งสองต้องการการอ้างอิง 2 รายการเมื่อใช้การใช้งานแบบเนทีฟและ 4 การอ้างอิงสำหรับการใช้งานที่ไม่ใช่เนทีฟ SLF4J และ Log4j2 API เหมือนกันในแง่นี้ ตัวอย่างเช่น:
slf4j
และล็อกแบ็ก (หรือ log4jv1) ฉันควรถูกบังคับให้ติดตั้งคนตัดไม้คนที่สามเพื่อใช้แอปพลิเคชันของคุณหรือไม่? หรือบางทีการรักษาความปลอดภัยขององค์กรอาจตัดสินว่าคุณสามารถใช้java.util.logging
ในการผลิตเท่านั้นแล้วจะเป็นอย่างไร?