เรากำลังใช้ log4j ที่อยู่เบื้องหลังเสื้อคลุมตัวเอง เราวางแผนที่จะใช้คุณสมบัติอื่น ๆ อีกมากมายในตอนนี้
เราควรอัพเดทเป็น logback หรือไม่?
(ฉันหมายถึงกรอบไม่ใช่ซุ้มเช่น SLF4J)
เรากำลังใช้ log4j ที่อยู่เบื้องหลังเสื้อคลุมตัวเอง เราวางแผนที่จะใช้คุณสมบัติอื่น ๆ อีกมากมายในตอนนี้
เราควรอัพเดทเป็น logback หรือไม่?
(ฉันหมายถึงกรอบไม่ใช่ซุ้มเช่น SLF4J)
คำตอบ:
การเข้าสู่ระบบใช้ SLF4J API ซึ่งหมายความว่าหากคุณใช้ logback คุณกำลังใช้ SLF4J API จริงๆ ในทางทฤษฎีคุณสามารถใช้ internals ของ logback API โดยตรงสำหรับการบันทึก แต่นั่นก็เป็นสิ่งที่ท้อแท้อย่างมาก เอกสารประกอบการบันทึกกลับและตัวอย่างทั้งหมดเกี่ยวกับตัวบันทึกถูกเขียนเป็นเงื่อนไขของ SLF4J API
ดังนั้นโดยใช้ logback คุณจะใช้ SLF4J จริง ๆ และถ้าคุณต้องการสลับกลับไปเป็น log4j ไม่ว่าด้วยเหตุผลใดก็ตามคุณสามารถทำได้ภายในไม่กี่นาทีโดยเพียงแค่วาง slf4j-log4j12.jar เข้าสู่เส้นทางในชั้นเรียนของคุณ
เมื่อย้ายจาก logback เพื่อ log4j ชิ้นส่วน logback ที่เฉพาะเจาะจงเฉพาะผู้ที่อยู่ในlogback.xmlแฟ้มการกำหนดค่าจะยังคงต้องมีการอพยพไปเทียบเท่า log4j ของมันคือlog4j.properties เมื่อทำการโยกย้ายในทิศทางอื่นการกำหนดค่า log4j เช่นlog4j.propertiesจะต้องถูกแปลงให้เทียบเท่ากับการบันทึกกลับของมัน มีเครื่องมือออนไลน์สำหรับสิ่งนั้น ปริมาณของงานที่เกี่ยวข้องในการย้ายไฟล์การกำหนดค่ามากน้อยกว่าการทำงานที่จำเป็นในการตัดไม้โทรโยกย้ายเผยแพร่ทั่วรหัสที่มาซอฟต์แวร์ทั้งหมดของคุณและพึ่งพา
คุณควร ใช่แล้ว
ทำไม? Log4Jได้รับเป็นหลักเลิกโดยLogback
มันเร่งด่วนเหรอ? อาจจะไม่.
มันไม่เจ็บปวดเหรอ? อาจเป็นไปได้ แต่มันอาจขึ้นอยู่กับงบการบันทึกของคุณ
โปรดทราบว่าถ้าคุณอยากที่จะใช้ประโยชน์จาก LogBack (หรือ SLF4J) แล้วคุณจริงๆต้องเขียนงบการเข้าสู่ระบบที่เหมาะสม สิ่งนี้จะให้ประโยชน์เช่นโค้ดที่เร็วกว่าเนื่องจากการประเมินแบบสันหลังยาวและโค้ดน้อยกว่าเพราะคุณสามารถหลีกเลี่ยงการ์ดได้
ในที่สุดฉันขอแนะนำ SLF4J (ทำไมต้องสร้างล้อด้วยส่วนหน้าของคุณเอง)
ในโลกการบันทึกมี Facades (เช่น Apache Commons Logging, slf4j หรือแม้แต่ Log4j 2.0 API) และการใช้งาน (Log4j 1 + 2, java.util.logging, TinyLog, Logback)
โดยทั่วไปคุณควรเปลี่ยนเสื้อคลุมของคุณเองด้วย slf4j IF และเฉพาะในกรณีที่คุณไม่พอใจกับมันด้วยเหตุผลบางอย่าง ในขณะที่ Apache Commons Logging ไม่ได้ให้ API ที่ทันสมัย แต่อย่างใด slf4j และ Fac4 Log2j ใหม่นั้นให้สิ่งนั้น เนื่องจากมีแอพพลิเคชั่นจำนวนมากที่ใช้งาน slf4j เพื่อใช้ห่อหุ้ม
slf4j ให้จำนวน API น้ำตาลที่ดีเช่นตัวอย่างนี้จากเอกสาร slf4j:
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
มันเป็นการทดแทนตัวแปร นอกจากนี้ยังได้รับการสนับสนุนโดย Log4j 2
อย่างไรก็ตามคุณต้องระวังว่า slf4j ได้รับการพัฒนาโดย QOS ซึ่งดูแลการล็อกอิน Log4j 2.0 ถูกอบใน Apache Software Foundation ในช่วงสามปีที่ผ่านมาชุมชนที่คึกคักและมีชีวิตชีวาได้เติบโตขึ้นอีกครั้ง หากคุณซาบซึ้งในโอเพ่นซอร์สเนื่องจาก Apache Software Foundation ทำหน้าที่รับประกันคุณสามารถพิจารณาใช้ slf4j เพื่อใช้ Log4j 2 โดยตรง
โปรดทราบ:
ใน log4j 1 ที่ผ่านมาไม่ได้รับการบำรุงรักษาอย่างแข็งขันในขณะที่ Logback เดิมคือ แต่วันนี้สิ่งต่าง ๆ Log4j 2 ได้รับการบำรุงรักษาอย่างแข็งขันและเผยแพร่ตามกำหนดเวลาเกือบปกติ นอกจากนี้ยังมีคุณสมบัติที่ทันสมัยมากมายและ -imho- ทำให้สองอย่างดีกว่า Logback บางครั้งนี่เป็นเพียงเรื่องของรสนิยมและคุณควรสรุปของคุณเอง
ฉันเขียนภาพรวมอย่างรวดเร็วเกี่ยวกับคุณสมบัติใหม่ของ Log4j 2.0: http://www.grobmeier.de/the-new-log4j-2-0-05122012.html
เมื่ออ่านคุณจะเห็นว่า Log4j 2 ได้รับแรงบันดาลใจจาก Logback แต่รวมถึงเฟรมเวิร์กการบันทึกอื่น ๆ แต่ฐานรหัสนั้นแตกต่างกัน มันไม่ได้แชร์อะไรเลยกับ Log4j 1 และศูนย์ด้วย Logback นำไปสู่การปรับปรุงบางอย่างเช่นในตัวอย่าง Log4j 2 ทำงานด้วย bytestreams แทน Strings ภายใต้ประทุน นอกจากนี้ยังไม่ทำให้กิจกรรมต่างๆหลวมในขณะที่กำหนดค่าใหม่
Log4j 2 สามารถบันทึกด้วยความเร็วสูงกว่าเฟรมเวิร์กอื่นที่ฉันรู้: http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html
และยังคงเป็นชุมชนผู้ใช้ที่ใหญ่กว่า Logbacks: http://www.grobmeier.de/apache-log4j-is-the-the-leading-logging-framework-06082013.html
ทุกคนกล่าวว่าความคิดที่ดีที่สุดคือคุณเลือกกรอบการบันทึกที่เหมาะสมที่สุดกับสิ่งที่คุณต้องการบรรลุ ฉันจะไม่เปลี่ยนเฟรมเวิร์กเต็มรูปแบบหากฉันจะปิดใช้งานการเข้าสู่ระบบในสภาพแวดล้อมการผลิตและเพียงแค่ทำการบันทึกขั้นพื้นฐานในแอปของฉัน อย่างไรก็ตามถ้าคุณทำอะไรเพิ่มเติมกับการบันทึกเพียงแค่ดูคุณสมบัติที่มีให้โดยเฟรมเวิร์กและนักพัฒนาของพวกเขา ในขณะที่คุณได้รับการสนับสนุนทางการค้าสำหรับ Logback ผ่าน QOS (ฉันได้ยิน) ปัจจุบันยังไม่มีการสนับสนุนทางการค้าสำหรับ Log4j 2. ในทางกลับกันถ้าคุณต้องการทำการบันทึกการตรวจสอบและต้องการประสิทธิภาพสูงโดยผู้ให้บริการ async ตรวจสอบ log4j 2
โปรดทราบว่าแม้จะมีความสะดวกสบายให้ แต่อาคารก็กินการแสดงเล็กน้อย มันอาจจะไม่ส่งผลกระทบต่อคุณ แต่ถ้าคุณอยู่ในแหล่งข้อมูลต่ำคุณอาจต้องบันทึกทุกสิ่งที่คุณมี
แทบจะเป็นไปไม่ได้ที่จะให้คำแนะนำ เพียงแค่: อย่าเปลี่ยนเพียงเพราะผู้คนจำนวนมากเปลี่ยน เปลี่ยนเพียงเพราะคุณเห็นคุณค่าของมัน และการโต้แย้งว่า log4j นั้นตายแล้วจะไม่นับอีกต่อไป มันมีชีวิตอยู่และมันร้อน
หมายเหตุ: ขณะนี้ฉันเป็น VP, Apache Logging Services และมีส่วนร่วมใน log4j เช่นกัน
ไม่ตอบคำถามของคุณอย่างแน่ชัด แต่ถ้าคุณสามารถย้ายออกจากเสื้อคลุมที่ทำเองได้จะมีSimple Logging Facade สำหรับ Java (SLF4J)ซึ่ง Hibernate เปลี่ยนไปแล้ว (แทนที่จะเป็นการบันทึกทั่วไป)
SLF4J ไม่ประสบปัญหาตัวโหลดคลาสหรือการรั่วไหลของหน่วยความจำที่สังเกตได้จาก Jakarta Commons Logging (JCL)
SLF4J รองรับการบันทึก JDK, log4j และ logback ดังนั้นจึงควรเปลี่ยนจาก log4j เป็น logback ค่อนข้างง่ายเมื่อถึงเวลา
แก้ไข: ขอโทษที่ฉันไม่ได้ทำให้ตัวเองชัดเจน ฉันแนะนำให้ใช้ SLF4J เพื่อแยกตัวคุณเองออกจากการเลือกระหว่าง log4j หรือ logback
การตัดสินใจของคุณควรเป็นไปตาม
คุณควรต้านทานการเปลี่ยน API เพียงเพราะ "ใหม่กว่าดีกว่าดีกว่า" ฉันทำตามนโยบายของ "ถ้ามันไม่แตกอย่าเตะ"
หากแอปพลิเคชันของคุณต้องการเฟรมเวิร์กการบันทึกที่ซับซ้อนมากคุณอาจต้องพิจารณาสาเหตุ
โครงการที่พัฒนาแล้วหรือแม้แต่โครงการที่เจาะลึกลงไปในขั้นตอนการพัฒนาอาจจะสูญเสียมากกว่าการได้รับจากการอัพเกรด IMHO การย้อนกลับเป็นขั้นสูงมากขึ้นในชุดของคะแนน แต่ไม่ถึงขนาดสำหรับการแทนที่ที่สมบูรณ์ในระบบการทำงาน แน่นอนฉันจะพิจารณา logback สำหรับการพัฒนาใหม่ แต่ log4j ที่มีอยู่นั้นดีพอและเป็นผู้ใหญ่สำหรับทุกสิ่งที่เปิดตัวแล้วและพบกับผู้ใช้ปลายทาง นี่เป็นทัศนะที่มากคุณควรเห็นคุณค่าของตัวเอง