จะส่ง java.util.logging ไปที่ log4j ได้อย่างไร?


84

ฉันมีแอปพลิเคชันที่มีอยู่ซึ่งทำการบันทึกทั้งหมดกับ log4j เราใช้ไลบรารีอื่น ๆ จำนวนมากที่ใช้ log4j ด้วยหรือล็อกกับ Commons Logging ซึ่งลงท้ายด้วยการใช้ log4j ภายใต้การครอบคลุมในสภาพแวดล้อมของเรา การอ้างอิงอย่างหนึ่งของเรายังบันทึกกับ slf4j ซึ่งทำงานได้ดีเนื่องจากในที่สุดก็มอบหมายให้ log4j เช่นกัน

ตอนนี้ฉันต้องการเพิ่ม ehcache ในแอปพลิเคชันนี้สำหรับความต้องการในการแคช ehcache เวอร์ชันก่อนหน้าใช้การบันทึกแบบคอมมอนส์ซึ่งจะทำงานได้อย่างสมบูรณ์ในสถานการณ์นี้ แต่ในเวอร์ชัน 1.6-beta1พวกเขาได้ลบการพึ่งพาการบันทึกแบบคอมมอนส์และแทนที่ด้วย java.util.logging แทน

ไม่ค่อยคุ้นเคยกับการบันทึก JDK ในตัวที่มีอยู่ใน java.util.logging มีวิธีง่ายๆในการส่งข้อความบันทึกไปยัง JUL ที่บันทึกกับ log4j หรือไม่ดังนั้นฉันจึงสามารถใช้การกำหนดค่าที่มีอยู่และตั้งค่าสำหรับการบันทึกที่กำลังจะมาถึง จาก ehcache?

เมื่อดู javadocs สำหรับ JUL ดูเหมือนว่าฉันสามารถตั้งค่าตัวแปรสภาพแวดล้อมจำนวนมากเพื่อเปลี่ยนLogManagerการใช้งานที่ใช้และอาจใช้เพื่อห่อ log4j Loggers ในLoggerคลาสJUL นี่เป็นแนวทางที่ถูกต้องหรือไม่?

น่าขันที่การใช้การบันทึก JDK ในตัวของห้องสมุดจะทำให้ปวดหัวเมื่อ (ส่วนใหญ่) ทั่วโลกใช้ไลบรารีของบุคคลที่สามแทน

คำตอบ:


37

แนวทางหนึ่งที่ฉันใช้จนประสบความสำเร็จคือการใช้slf4jเป็น API การบันทึกหลักของฉัน จากนั้นฉันมี slf4j ผูกกับ log4j การอ้างอิงของบุคคลที่สามโดยใช้เฟรมเวิร์กอื่น (เช่น JUL) สามารถเชื่อมโยงกับ slf4j


2
ลิงค์ดี แต่ฉันคิดว่าคุณหมายถึง # jul-to-slf4j
araqnid

ดูเหมือนจะเป็นแนวทางที่ดียกเว้นว่าฉันไม่สามารถใช้งานได้ :(
แมตต์ข

2
นอกจากนี้ฉันไม่อยากเชื่อเลยว่าไลบรารีที่ได้รับความนิยมอย่าง ehcache จะเปลี่ยนไปใช้ java.util.logging - ดูเหมือนจะเป็นกระดูกมาก
matt b

1
@matt b, JUL มีอยู่ในรันไทม์ Java เสมอดังนั้นจึงต้องการการอ้างอิงภายนอกน้อยที่สุด อย่างไรก็ตามในสายตาของฉันเป็นตัวอย่างที่แท้จริงของโค้ดที่เขียนโดยผู้ที่ไม่มีประสบการณ์เกี่ยวกับการใช้งานโค้ดนั้น ระบบกำหนดค่าค่อนข้างไม่สะดวก
Thorbjørn Ravn Andersen

1
ปัญหาที่คุณพบคือถ้าคุณเชื่อม SLF4J กับ JUL ประสิทธิภาพการบันทึกจะน่าตกใจ โดยเฉพาะแต่ละรายการบันทึกที่คุณสร้างผลลัพธ์ในข้อยกเว้นที่โยนเพื่อกำหนดบริบทของตัวบันทึกที่จะใช้ ซึ่งทำให้เกิดค่าใช้จ่ายจำนวนมากและทำให้กระบวนการทำงานช้าลง
เช่น

19

เราใช้SLF4Jในโครงการปัจจุบันของเราและได้ผลดีสำหรับเรา SLF4J เขียนโดย Ceki Gülcüผู้สร้าง Log4J และเขาทำงานได้ยอดเยี่ยมมาก ในโค้ดของเราเราใช้ API การบันทึก SLF4J โดยตรงและเรากำหนดค่า SLF4J เพื่อให้การเรียกจากJakarta Commons Logging (JCL), java.util.logging (JUL) และLog4J API ทั้งหมดเชื่อมโยงกับ SLF4J API เราจำเป็นต้องทำเช่นนั้นเพราะเช่นเดียวกับคุณเราใช้ไลบรารีของบุคคลที่สาม (โอเพนซอร์ส) ที่เลือก API การบันทึกที่แตกต่างกัน

ที่ด้านล่างของ SLF4J คุณกำหนดค่าให้ใช้การใช้งานคนตัดไม้โดยเฉพาะ มันมาพร้อมกับภายในหรือ "ง่าย" คนตัดไม้และคุณสามารถแทนที่นี้กับ Log4J ก.ค. หรือLogback การกำหนดค่าทำได้ง่ายๆโดยการวางไฟล์ jar ต่างๆใน classpath ของคุณ

เดิมเราใช้การใช้งาน Logback ซึ่งเขียนโดย Ceki Gülcü นี่มีพลังมาก อย่างไรก็ตามเราตัดสินใจที่จะปรับใช้แอปพลิเคชันของเรากับแอปพลิเคชันเซิร์ฟเวอร์ Glassfish Java EE ซึ่งโปรแกรมดูบันทึกคาดว่าจะมีข้อความในรูปแบบ JUL ดังนั้นวันนี้ฉันจึงเปลี่ยนจาก Logback เป็น JUL และในเวลาเพียงไม่กี่นาทีฉันก็เปลี่ยนโหล Logback สองอันด้วยโถ SLF4J ที่เชื่อมต่อกับการใช้งาน JUL

เช่นเดียวกับ @overthink ฉันขอแนะนำให้ใช้ SLF4J ในการตั้งค่าของคุณ


8
Ceki ต้องสร้างกรอบการบันทึก / Fascade ใหม่กี่ครั้ง?
mP.

@mP: การบันทึกอาจไม่สวยงาม แต่เป็นความต้องการที่สำคัญสำหรับซอฟต์แวร์ระดับเชิงพาณิชย์ขนาดใหญ่ และ SLF4J แก้ปัญหาการรวมโค้ดที่ใช้กรอบการบันทึกที่แตกต่างกัน (ทำให้เร่งด่วนมากขึ้นโดย Sun เลือกที่จะพัฒนา java.utils.logging แทนการใช้ Log4J)
Jim Ferrans

3
@mP, slf4j จำเป็นเพราะงานแย่ ๆ ที่อาทิตย์ทำกับ JUL Logback เป็นส่วนหนึ่งของ log4j ไม่ใช่โปรเจ็กต์ใหม่
Thorbjørn Ravn Andersen

3
ฉันพบว่าการบันทึกกลับเป็นสิ่งที่จำเป็นหากไม่มีอะไรอื่นไม่ใช่ Apache และเป็นเอกสารจริง
Spencer Kormos

13

มีทางเลือกที่ง่ายกว่า SLF4J ในการเชื่อมต่อ JUL กับ log4j โปรดดูhttp://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html

คุณต้องใส่ jul-log4j-bridge บน classpath และเพิ่มคุณสมบัติของระบบ:

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager

jul-log4j-bridge ไม่ได้อยู่ใน Maven Central และสามารถดึงข้อมูลได้จากที่เก็บนี้:

<repository>
  <id>psmith</id>
  <url>http://people.apache.org/~psmith/logging.apache.org/repo</url>
  <releases>
    <enabled>false</enabled>
  </releases>
</repository>

แล้วใช้กับ:

<dependency>
  <groupId>org.apache.logging</groupId>
  <artifactId>apache-jul-log4j-bridge</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>log4j</groupId>
      <artifactId>apache-log4j-component</artifactId>
    </exclusion>
  </exclusions>
</dependency>

นอกจากนี้ยังสามารถสร้างใหม่จากแหล่งที่มาด้วยขั้นตอนต่อไปนี้:

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. แก้ไข pom.xml แทนที่การอ้างอิงบน log4j: log4j: 1.2.15 ด้วย log4j: apache-log4j-extras: 1.2.17 และลบการพึ่งพาบนส่วนประกอบ apache-log4j
  3. แพ็คเกจ mvn

4
ฉันคิดว่ามันง่ายกว่าเพราะสามารถทำได้โดยไม่ต้องเปลี่ยนรหัสของคุณคุณแค่ต้องเพิ่มคุณสมบัติของระบบ SLF4J ยังไม่เสนอกลไกที่คล้ายกันคุณอาจเปลี่ยนรหัสหรือlogging.propertiesไฟล์
Emmanuel Bourg

1
สิ่งนี้ไม่มีอยู่ใน log4j2 ขออภัย :(
BeepDog

JulLog4jBridge.assimilate();o_0
Bastian Voigt

2
คำเตือน! jul-log4j-bridgeใช้apache-log4j-companionsบันเดิลที่ไม่เคยปล่อย(แบ็คพอร์ตจากที่ถูกทิ้งlog4j 1.3) คุณจะต้องสร้างมันขึ้นมาอย่างยากลำบาก โดยธรรมชาติแล้วสะพานนี้ก็ถูกทิ้งร้างก่อนการเปิดตัวเช่นกัน
ivan_pozdeev

@ivan_pozdeev จุดดีขอบคุณ ฉันได้เพิ่มคำแนะนำในการสร้างแล้ว
Emmanuel Bourg

9

ตุลาคม 2557

เนื่องจาก log4j เวอร์ชัน 2.1 มีส่วนประกอบ log4j-jul ซึ่งอนุญาตให้ใช้สิ่งนี้ได้ อย่างไรก็ตามในกรณีที่คุณใช้ log4j 1 คุณต้องอัปเกรดเป็น log4j2 เพื่อใช้แนวทางนี้

JDK Logging Adapter

Class LogManager

ย้ายจาก log4j 1.x เป็น log4j 2


2
ณ ตอนนี้ (กลางปี ​​2018) นี่ควรเป็นคำตอบที่ยอมรับ
rmuller

สำหรับผู้อ่านในอนาคต: ฉันยืนยันว่าใช้งานได้ โดยพื้นฐานแล้ว (1) เพิ่มสิ่งนี้ใน pom mvnrepository.com/artifact/org.apache.logging.log4j/log4j-julและ (2) เพิ่มคุณสมบัติระบบในลิงค์แรก (เช่นในพารามิเตอร์ JVM ให้เพิ่ม -Djava util.logging.manager = org.apache.logging.log4j.jul.LogManager)
Hossam El-Deen

3

ไซต์ slf4j ฉันเชื่อว่ามีสะพานสำหรับส่งผ่านเหตุการณ์ java.util.logging ผ่าน slf4j (และด้วยเหตุนี้จึงไปที่ log4j)

ใช่การดาวน์โหลด SLF4J มี jul-to-slf4j ซึ่งฉันเชื่อว่าทำได้แค่นั้น มีตัวจัดการ JUL เพื่อส่งต่อเรกคอร์ดไปยัง SLF4J


2

@ Yishai - ขอบคุณสำหรับการโพสต์ลิงก์ไปยัง wiki ของฉัน ตัวอย่างดังกล่าวเปลี่ยนเส้นทาง JUL ไปยัง Log4J และฉันเคยใช้งานในระบบการผลิตมาสองสามปีแล้ว JBoss 5.x เปลี่ยนเส้นทาง JUL เป็น Log4J แล้วดังนั้นฉันจึงนำมันออกมาเมื่อเราอัปเกรด ฉันมีสิ่งใหม่กว่าที่เปลี่ยนเส้นทางไปยัง SLF4J ซึ่งฉันใช้กับบางสิ่งในตอนนี้ ฉันจะโพสต์ว่าเมื่อฉันมีโอกาส

อย่างไรก็ตาม SLF4J มีอยู่แล้ว:

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j


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