ความเข้ากันไม่ได้ของกรอบการบันทึก


110

ฉันกำลังสร้างแอป Java ขนาดเล็กและหวังว่าจะใช้ Logback สำหรับการบันทึก

แอพของฉันมีการพึ่งพาโปรเจ็กต์เก่ากว่าที่ทำการบันทึกผ่านไฟล์

org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1

... ดังนั้นแผนของฉันคือใช้

org.slf4j | jcl-over-slf4j | 1.5.6

... เพื่อเปลี่ยนเส้นทางการบันทึก JCL ไปที่

org.slf4j | slf4j-api | 1.6.0

... และท้ายที่สุดก็คือ

ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22

ดังนั้นแอปของฉันจึงสามารถเข้าสู่ระบบผ่านการล็อกกลับผ่าน slf4j API ในขณะที่รหัสไลบรารีเก่าสามารถล็อกเข้าสู่ตำแหน่งเดียวกันผ่านการเปลี่ยนเส้นทาง

อนิจจาส่งผลให้

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at   org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:141)

ฉันได้ลองใช้ตัวเลขการตรวจสอบที่สูงขึ้นและต่ำลงในไหเหล่านี้และยังขุดผ่านเอกสาร API และอื่น ๆ อีกด้วย ... แต่ฉันไม่พบและแก้ปัญหาได้

ช่วยด้วย?

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

คำตอบ:


112

คุณกำลังผสม jcl bridge เวอร์ชัน 1.5.6 กับเวอร์ชัน 1.6.0 ของ slf4j-api สิ่งนี้ใช้ไม่ได้เนื่องจากมีการเปลี่ยนแปลงเล็กน้อยใน 1.6.0 ใช้เวอร์ชันเดียวกันสำหรับทั้งสองรุ่นคือ 1.6.1 (ล่าสุด) ฉันใช้สะพาน jcl-over-slf4j ตลอดเวลาและใช้งานได้ดี


2
แน่นอนว่าได้ผลทันที ขอบคุณมาก! ฉันไม่ได้ใช้ 1.6.1 ไหเหล่านั้นเพราะดูเหมือนจะไม่มีให้ใช้ ฉันรู้สึกรำคาญอย่างมากที่ m2eclipse ซึ่งอ้างว่าจะแสดงเวอร์ชันที่มีทั้งหมดให้ฉันดู แต่ก็ลดจำนวนลงอย่างลึกลับ
Carl Smotricz

1
เพียงเพื่อความสนใจของคนอื่น ๆ ที่ติดตาม: ฉันลงเอยด้วยลูกศรสีแดงในกราฟการพึ่งพาเพราะแม้แต่ logback-core ล่าสุดก็ยังยืนยันใน slf4j-1.6.0 ต้องใช้เวลามากขึ้นในการใช้เวอร์ชันต่างๆจนกระทั่งลูกศรสีแดงทั้งหมดหายไป แต่ตอนนี้ทั้งสองใช้งานได้และลูกศรสีน้ำเงินทั้งหมด
Carl Smotricz

1
ฉันจะทำอย่างนั้นได้อย่างไร
user1721803

ขอบคุณ ... การใช้ 'jcl-over-slf4j' ช่วยวันของฉัน
Tariq M Nasim

41

เวอร์ชัน SLF4J 1.5.11 และ 1.6.0 เข้ากันไม่ได้ (ดูรายงานความเข้ากันได้ ) เนื่องจากรายการอาร์กิวเมนต์ของorg.slf4j.spi.LocationAwareLogger.logวิธีการมีการเปลี่ยนแปลง (เพิ่ม Object [] p5):

SLF4J 1.5.11:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Throwable p5 )

SLF4J 1.6.0:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Object[] p5, Throwable p6 )

ดูรายงานความเข้ากันได้สำหรับ SLF4J เวอร์ชันอื่น ๆในหน้านี้

คุณสามารถสร้างรายงานดังกล่าวได้โดยใช้เครื่องมือตรวจสอบการปฏิบัติตามข้อกำหนด japi

ใส่คำอธิบายภาพที่นี่


23

เพียงเพื่อช่วยเหลือผู้ที่อยู่ในสถานการณ์คล้ายกับตัวเอง ...

สิ่งนี้อาจเกิดขึ้นเมื่อไลบรารีที่พึ่งพาได้รวม slf4j เวอร์ชันเก่าโดยไม่ได้ตั้งใจ ในกรณีของฉันมันคือ tika-0.8 ดูhttps://issues.apache.org/jira/browse/TIKA-556

วิธีแก้ปัญหาคือไม่รวมคอมโพเนนต์แล้วขึ้นอยู่กับเวอร์ชันที่ถูกต้องหรือแพตช์ด้วยตนเอง

เช่น.

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>0.8</version>
    <exclusions>
        <exclusion>
            <!-- NOTE: Version 4.2 has bundled slf4j -->
            <groupId>edu.ucar</groupId>
            <artifactId>netcdf</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <!-- Patched version 4.2-min does not bundle slf4j -->
    <groupId>edu.ucar</groupId>
    <artifactId>netcdf</artifactId>
    <version>4.2-min</version>
</dependency>

ขอบคุณ! ฉันโดนสิ่งนี้เมื่อพยายามใช้ Jackrabbit 2.2.5 กับ SLF4J 1.6.1 และ Logback 0.9.28!
Hendy Irawan

ขอบคุณ. ฉันเชื่อมโยงกับคำตอบของคุณที่นี่: spring-java-ee.blogspot.com/2011/04/…
Hendy Irawan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.