คุ้มไหมที่จะใช้ slf4j กับ log4j2


114

ฉันไม่สามารถตัดสินใจได้ว่าจะใช้ slf4j หรือไม่กับ log4j2 จากโพสต์ออนไลน์ดูเหมือนว่ามันจะมีผลงานที่ยอดเยี่ยม แต่จำเป็นจริงๆ

จุดเหล่านี้ยังสนับสนุน log4j2:

  • SLF4J บังคับให้แอปพลิเคชันของคุณบันทึกสตริง Log4j 2 API รองรับการบันทึก CharSequence ใด ๆ หากคุณต้องการบันทึกข้อความ แต่ยังสนับสนุนการบันทึก Object ใด ๆ ตามที่เป็นอยู่
  • Log4j 2 API รองรับการบันทึกอ็อบเจ็กต์ Message, Java 8 lambda expression และการบันทึกแบบไม่ใช้ขยะ (หลีกเลี่ยงการสร้างอาร์เรย์ vararg และหลีกเลี่ยงการสร้าง Strings เมื่อล็อกอ็อบเจ็กต์ CharSequence)

2
อาจจะ. จะเกิดอะไรขึ้นหากแอปพลิเคชันเซิร์ฟเวอร์ของฉันรวมslf4jและล็อกแบ็ก (หรือ log4jv1) ฉันควรถูกบังคับให้ติดตั้งคนตัดไม้คนที่สามเพื่อใช้แอปพลิเคชันของคุณหรือไม่? หรือบางทีการรักษาความปลอดภัยขององค์กรอาจตัดสินว่าคุณสามารถใช้java.util.loggingในการผลิตเท่านั้นแล้วจะเป็นอย่างไร?
Elliott Frisch

ขอบคุณสำหรับการเขียน แต่ถ้าทุกคนใช้ log4j org แบบกว้างอาร์กิวเมนต์ข้างต้นจะถือว่าไม่ถูกต้อง
Andy897

4
การใช้ SLF4J หมายความว่าการแทนที่การนำไปใช้นั้นทำได้ง่ายมากหากนโยบายของ บริษัท มีการเปลี่ยนแปลงเช่นเมื่อ บริษัท ของคุณถูกซื้อกิจการและนโยบายใหม่ที่บังคับกับคุณ การใช้ SLF4J ตอนนี้เมื่อคุณเขียนโค้ดจะใช้เวลาไม่นานไปกว่าการใช้ Log4j โดยตรง การเปลี่ยนการโทร Log4j โดยตรงในภายหลังจะใช้เวลามาก SLF4J คือการลงทุน / ประกันฟรีสำหรับอนาคต สิ่งนั้นสำคัญกว่าฟีเจอร์ Log4j 2 API หรือไม่? มีเพียงคุณ (หรือนโยบายของ บริษัท ) เท่านั้นที่สามารถตัดสินใจได้
Andreas

มีวิธีใช้ slf4j กับ log4j2 ไหมถ้าคุณต้องการ? หน้านี้แสดงการใช้งานกับ log4j - เวอร์ชัน 1.2 - ซึ่งสิ้นสุดอายุการใช้งาน) แต่ไม่มีตัวเลือกสำหรับ log4j2 ถ้ามีวิธีทำไม slf4j ถึงไม่พูดถึง
J Woodchuck

คำตอบ:


162

ไปข้างหน้า: ตั้งโปรแกรมไปที่ log4j2 API แทน slf4j

ปลอดภัย: Log4j2 API ให้การรับประกันเช่นเดียวกับ slf4j และอื่น ๆ

ตอนนี้ Log4j2 นั้นแยกออกเป็น API และโมดูลการนำไปใช้งานแล้วไม่มีค่าใด ๆ ในการใช้ SLF4J อีกต่อไป

ใช่การปฏิบัติทางวิศวกรรมที่ดีเพื่อให้ตัวเลือกของคุณเปิดกว้าง คุณอาจต้องการเปลี่ยนเป็นการใช้งานการบันทึกอื่นในภายหลัง

ในช่วง 10 ปีที่ผ่านมาการสร้างความยืดหยุ่นในแอปพลิเคชันของคุณหมายถึงการใช้ Wrapper API เช่น SLF4J ความยืดหยุ่นนี้ไม่ได้มาฟรี แต่ข้อเสียของวิธีนี้คือแอปพลิเคชันของคุณไม่สามารถใช้ชุดคุณลักษณะที่สมบูรณ์ยิ่งขึ้นของไลบรารีการบันทึกที่อยู่เบื้องหลังได้

Log4j2 นำเสนอโซลูชันที่ไม่ต้องการให้แอปพลิเคชันของคุณถูก จำกัด ไว้ที่ตัวส่วนร่วมที่ต่ำที่สุด

วาล์วหนี: log4j-to-slf4j

Log4j2 มีlog4j-to-slf4jโมดูลบริดจ์ แอปพลิเคชันใด ๆ ที่เข้ารหัสกับ Log4j2 API สามารถเลือกที่จะเปลี่ยนการใช้งานการสำรองข้อมูลเป็นการใช้งานที่สอดคล้องกับ slf4j ได้ทุกเมื่อ

log4j เพื่อ 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 และ Log4j 2 API


7
ฉันเข้าใจ. ให้ฉันเรียบเรียงคำถามใหม่ มีการใช้งาน log4j2 API ที่เป็นอิสระนอกเหนือจาก log4j2 หรือไม่
Ceki

5
Log4j2 API และนัยไม่ "คู่กันอย่างแน่นหนา" การใช้งาน SLF4J ทั้งหมดนี้พร้อมใช้งานทั้งหมด: แอปพลิเคชันที่เข้ารหัสโดยใช้ Log4j2 API สามารถเลือกการlog4j-to-slf4jอ้างอิงแทนlog4j-coreและเลือกการใช้งาน SLF4J ใด ๆ ที่คุณกล่าวถึง จำนวนของพื้นเมืองของการใช้งานของ Log4j2 API เป็นที่ไม่เกี่ยวข้อง
Remko Popma

19
ปัญหาคือคุณมักจะมีการพึ่งพาไลบรารีที่ตัวเองใช้ slf4j ดังนั้นจึงง่ายกว่าที่จะยึดติดกับสิ่งนั้น
Davio

18
ดังนั้นฉันควรใช้อินเทอร์เฟซสำหรับอินเทอร์เฟซสำหรับการใช้งาน? ใช่ไม่ขอบคุณ ... Slf4j เอาชนะ log4j ได้อย่างต่อเนื่องโดยการให้อินเทอร์เฟซที่ดีสำหรับการใช้งานสำหรับการบันทึก ... log4j2 ควรใช้ slf4j api - หากมีคุณสมบัติที่ขาดหายไปให้ส่งคืนหาก slf4j จะไม่ใช้สิ่งใหม่ จากนั้นอาจมีกรณีสำหรับอินเตอร์เฟส log4j2 api ....
RockMeetHardplace

4
@RemkoPopma - คุณยังคงต่อต้านการใช้อินเทอร์เฟซ log4j ใช่ฉันเข้าใจแล้ว - ฉันสามารถเชื่อมต่ออินเทอร์เฟซของ log4j2 -> อินเทอร์เฟซของ slf4j -> การใช้งานใด ๆ ก็ตาม แต่ฉันไม่ต้องการทำให้นามธรรมเป็นนามธรรม - ขอบคุณ แต่ไม่ขอบคุณ
RockMeetHardplace
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.