log4j vs logback [ปิด]


152

เรากำลังใช้ log4j ที่อยู่เบื้องหลังเสื้อคลุมตัวเอง เราวางแผนที่จะใช้คุณสมบัติอื่น ๆ อีกมากมายในตอนนี้

เราควรอัพเดทเป็น logback หรือไม่?

(ฉันหมายถึงกรอบไม่ใช่ซุ้มเช่น SLF4J)


1
logback ฟังดูคล้ายกับการบันทึกของ jakarta ซึ่งแตกต่างกันมาก
matt b

12
SLF4J (ซึ่งเป็นด้านหน้า) เสียงคล้ายกับคอมมอนส์ ข้อแตกต่างที่สำคัญคือ SLF4J ใช้การรวมแบบสแตติกขณะที่คอมมอนส์กำลังใช้กลยุทธ์การแก้ปัญหาบางอย่าง การย้อนกลับ (การดำเนินการ "ดั้งเดิม" (เช่นไม่มีเลเยอร์ wrapper เพิ่มเติม) ของส่วนหน้า) เทียบได้กับ LOG4J แต่มี API ที่สมบูรณ์ยิ่งขึ้น
Huxi

คำตอบ:


190

การเข้าสู่ระบบใช้ 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จะต้องถูกแปลงให้เทียบเท่ากับการบันทึกกลับของมัน มีเครื่องมือออนไลน์สำหรับสิ่งนั้น ปริมาณของงานที่เกี่ยวข้องในการย้ายไฟล์การกำหนดค่ามากน้อยกว่าการทำงานที่จำเป็นในการตัดไม้โทรโยกย้ายเผยแพร่ทั่วรหัสที่มาซอฟต์แวร์ทั้งหมดของคุณและพึ่งพา


28
โอกาสที่จะได้คุยกับนักพัฒนาซอฟต์แวร์ที่ได้รับความนิยมอย่างแพร่หลาย ขอบคุณ Ceki สำหรับ log4j
Srujan Kumar Gulla

7
คำเตือน: ผู้ชายคนนี้เป็นผู้พัฒนาเดิมของ Log4j, SLF4J และ Logback แต่จะไม่ทำงานอีกต่อไปสำหรับ Log4j
Victor Stafusa

56

คุณควร ใช่แล้ว

ทำไม? Log4Jได้รับเป็นหลักเลิกโดยLogback

มันเร่งด่วนเหรอ? อาจจะไม่.

มันไม่เจ็บปวดเหรอ? อาจเป็นไปได้ แต่มันอาจขึ้นอยู่กับงบการบันทึกของคุณ

โปรดทราบว่าถ้าคุณอยากที่จะใช้ประโยชน์จาก LogBack (หรือ SLF4J) แล้วคุณจริงๆต้องเขียนงบการเข้าสู่ระบบที่เหมาะสม สิ่งนี้จะให้ประโยชน์เช่นโค้ดที่เร็วกว่าเนื่องจากการประเมินแบบสันหลังยาวและโค้ดน้อยกว่าเพราะคุณสามารถหลีกเลี่ยงการ์ดได้

ในที่สุดฉันขอแนะนำ SLF4J (ทำไมต้องสร้างล้อด้วยส่วนหน้าของคุณเอง)


48
หมายเหตุ: โปรเจ็กต์ log4j ไม่พิจารณาว่า log4j เลิกใช้แล้ว
Thorbjørn Ravn Andersen

17
คำศัพท์ควรมีการชี้แจง; แจ่มแจ้งผู้เขียนของโครงการ log4jพิจารณาlogback จะเป็นทายาทของ log4j มันเป็นผู้เขียนเดียวกันของทั้งสองโครงการดังนั้นความเห็นของเขาควรมีน้ำหนัก "log4j project" นั้นไม่ได้ "พิจารณา" อะไรจริงๆ กลุ่มคนปัจจุบันที่เกี่ยวข้องกับ log4j มีความคิดเห็นที่แตกต่างกันไป (บางคนเห็นด้วยจริงๆบางคนไม่เห็นด้วยอย่างแปลกใจ) ด้วยประวัติอีกเล็กน้อยที่อยู่ข้างหลังเรา (3 ปีหลังจากความคิดเห็นเดิม) SLF4J + Logback จะยังคงมีอยู่เหนือ Log4j
ไมเคิล

@michael_n โปรดทราบว่า Log4j 1 ไม่ได้ถูกเขียนโดยบุคคลเดียว มันผิดที่จะพูดว่า "ผู้เขียนเดียวกัน" เซกิเป็นนักเขียนคนสำคัญไม่ต้องสงสัยเลย แต่ไม่ใช่คนเดียว ในความเป็นจริงผู้คนจำนวนมากช่วยทำให้ Log4j 1 เป็นสิ่งที่มันเป็น
Christian

@ คริสเตียน "ไม่ได้เขียน ... " แน่นอนว่าควรจะบอกเป็นนัย ๆ สำหรับโครงการ Apache ผู้ใหญ่ (และคุณสมบัติของฉัน "กลุ่มคนปัจจุบันที่เกี่ยวข้องกับ log4j"); อย่างไรก็ตามถ้าฉันสามารถแก้ไขความคิดเห็นฉันจะพูดว่า "ประพันธ์เดิม " เป็นบทความวิกิพีเดียยังระบุ Re: "ในความเป็นจริงผู้คนจำนวนมากช่วยกันทำ Log4j 1 ว่ามันคืออะไร"ซึ่งเป็นความจริงอย่างแน่นอนซึ่งกันและกัน (นั่นคือดีขึ้นหรือแย่ลง); และในทางเล็ก ๆ บางส่วนในการเริ่มต้นของ slf4j + logback :-)
ไมเคิล

3
ดังนั้นมีอะไรในตัวคุณที่จะต่อสู้กับห้องสมุดนี้หรือว่า? เหตุใดเราจึงพยายามฆ่า / ส่งเสริมห้องสมุด อย่างน้อยก็ให้เหตุผลอย่างมีเหตุผลทำไมคนหนึ่งถึงดีกว่าอีกเหตุผลหนึ่ง พระเจ้าล้นกองเป็นระเบียบ
ผู้ใช้

48

ในโลกการบันทึกมี 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 เช่นกัน


19

ไม่ตอบคำถามของคุณอย่างแน่ชัด แต่ถ้าคุณสามารถย้ายออกจากเสื้อคลุมที่ทำเองได้จะมีSimple Logging Facade สำหรับ Java (SLF4J)ซึ่ง Hibernate เปลี่ยนไปแล้ว (แทนที่จะเป็นการบันทึกทั่วไป)

SLF4J ไม่ประสบปัญหาตัวโหลดคลาสหรือการรั่วไหลของหน่วยความจำที่สังเกตได้จาก Jakarta Commons Logging (JCL)

SLF4J รองรับการบันทึก JDK, log4j และ logback ดังนั้นจึงควรเปลี่ยนจาก log4j เป็น logback ค่อนข้างง่ายเมื่อถึงเวลา

แก้ไข: ขอโทษที่ฉันไม่ได้ทำให้ตัวเองชัดเจน ฉันแนะนำให้ใช้ SLF4J เพื่อแยกตัวคุณเองออกจากการเลือกระหว่าง log4j หรือ logback


3
ฉันรู้ SLF4J แต่ฉันขอกรอบการบันทึกไม่ใช่สำหรับซุ้ม!

4
ขอโทษ. สิ่งที่ฉันแนะนำคือถ้าคุณใช้ SLF4J แทนที่จะเป็นซุ้มที่คุณกำหนดเองการเปลี่ยนจาก log4j เป็น logback จะเจ็บปวดน้อยลงหรือไม่
ชุดเครื่องมือ

แหล่งที่มาของการอ้างอิงนั้นคืออะไร? การบันทึกคอมมอนส์เป็นองค์ประกอบที่พยายามและทดสอบแล้ว ฉันไม่เคยมีหน่วยความจำรั่ว
Kshitiz Sharma

1
@KshitizSharma - จากลิงก์เอกสาร SLF4J ที่ฉันมีให้: slf4j.org/manual.html
ชุดเครื่องมือ

13

การตัดสินใจของคุณควรเป็นไปตาม

  • ความต้องการที่แท้จริงของคุณสำหรับ "คุณสมบัติเพิ่มเติม" เหล่านี้; และ
  • ค่าใช้จ่ายที่คาดหวังของคุณในการดำเนินการเปลี่ยนแปลง

คุณควรต้านทานการเปลี่ยน API เพียงเพราะ "ใหม่กว่าดีกว่าดีกว่า" ฉันทำตามนโยบายของ "ถ้ามันไม่แตกอย่าเตะ"

หากแอปพลิเคชันของคุณต้องการเฟรมเวิร์กการบันทึกที่ซับซ้อนมากคุณอาจต้องพิจารณาสาเหตุ


3

โครงการที่พัฒนาแล้วหรือแม้แต่โครงการที่เจาะลึกลงไปในขั้นตอนการพัฒนาอาจจะสูญเสียมากกว่าการได้รับจากการอัพเกรด IMHO การย้อนกลับเป็นขั้นสูงมากขึ้นในชุดของคะแนน แต่ไม่ถึงขนาดสำหรับการแทนที่ที่สมบูรณ์ในระบบการทำงาน แน่นอนฉันจะพิจารณา logback สำหรับการพัฒนาใหม่ แต่ log4j ที่มีอยู่นั้นดีพอและเป็นผู้ใหญ่สำหรับทุกสิ่งที่เปิดตัวแล้วและพบกับผู้ใช้ปลายทาง นี่เป็นทัศนะที่มากคุณควรเห็นคุณค่าของตัวเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.