Tính không tương thích của khung ghi nhật ký


109

Tôi đang xây dựng một ứng dụng Java nhỏ và hy vọng sử dụng logback để ghi nhật ký.

Ứng dụng của tôi phụ thuộc vào một dự án cũ hơn, thực hiện ghi nhật ký của nó qua

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

... vì vậy kế hoạch của tôi là sử dụng

org.slf4j | jcl-over-slf4j | 1.5.6

... để chuyển hướng ghi nhật ký JCL đến

org.slf4j | slf4j-api | 1.6.0

... và cuối cùng là

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

để ứng dụng của tôi có thể đăng nhập thông qua logback thông qua API slf4j của nó trong khi mã thư viện cũ có thể đăng nhập vào cùng một vị trí thông qua chuyển hướng.

Than ôi, điều này dẫn đến

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)

Tôi đã thử số verision cao hơn và thấp hơn trên một số lọ này và cũng đang tìm hiểu tài liệu API và những thứ tương tự ... nhưng tôi không thể tìm và giải quyết vấn đề.

Giúp tôi với?

Mặc dù logback được coi là khuôn khổ ghi nhật ký "chiến lược", nhưng cuối cùng tôi sẽ sử dụng cơ chế ghi nhật ký nào đó. Tuy nhiên, tôi hy vọng sẽ sử dụng logback hoặc log4j và tôi chắc chắn muốn hợp nhất việc ghi nhật ký của dự án cũ vào bất kỳ thứ gì mà khuôn khổ ghi nhật ký "mới" kết thúc, thông qua một cấu hình chung.

Câu trả lời:


111

Bạn đang trộn phiên bản 1.5.6 của cầu jcl với phiên bản 1.6.0 của slf4j-api; điều này sẽ không hoạt động vì một số thay đổi trong 1.6.0. Sử dụng các phiên bản giống nhau cho cả hai, tức là 1.6.1 (mới nhất). Tôi sử dụng cầu jcl-over-slf4j mọi lúc và nó hoạt động tốt.


2
Tất nhiên là có tác dụng ngay lập tức; Cảm ơn rât nhiều! Tôi đã không sử dụng 1.6.1 trong số những lọ đó vì chúng dường như không có sẵn. Tôi rất khó chịu với m2eclipse, nó có mục đích hiển thị cho tôi tất cả các phiên bản có sẵn nhưng lại giảm một cách bí ẩn một số lượng đáng kể.
Carl Smotricz

1
Chỉ vì sự quan tâm của bất kỳ ai khác đang theo dõi: Tôi đã kết thúc với một mũi tên màu đỏ trong biểu đồ phụ thuộc bởi vì ngay cả lõi logback mới nhất cũng nhấn mạnh vào slf4j-1.6.0. Phải mất nhiều thời gian hơn với các phiên bản cho đến khi tất cả các mũi tên màu đỏ biến mất, nhưng bây giờ nó đang hoạt động và tất cả các mũi tên màu xanh.
Carl Smotricz

1
Làm thế nào chính xác để tôi làm điều đó.
user1721803

Cảm ơn ... Việc sử dụng 'jcl-over-slf4j' đã cứu rỗi một ngày của tôi.
Tariq M Nasim

41

Các phiên bản SLF4J 1.5.11 và 1.6.0 không tương thích (xem báo cáo tương thích ) vì danh sách đối số của org.slf4j.spi.LocationAwareLogger.logphương pháp đã bị thay đổi (thêm Đối tượng [] 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 )

Xem báo cáo khả năng tương thích cho các phiên bản SLF4J khác trên trang này .

Bạn có thể tạo các báo cáo như vậy bằng công cụ kiểm tra tuân thủ japi .

nhập mô tả hình ảnh ở đây


23

Chỉ để giúp những người có hoàn cảnh tương tự như tôi ...

Điều này có thể xảy ra khi một thư viện phụ thuộc đã vô tình đóng gói phiên bản cũ của slf4j. Trong trường hợp của tôi, nó là tika-0,8. Xem https://issues.apache.org/jira/browse/TIKA-556

Công việc xung quanh là loại trừ thành phần và sau đó phụ thuộc thủ công vào phiên bản chính xác hoặc bản vá.

VÍ DỤ.

    <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>

Cảm ơn! Tôi đã gặp phải vấn đề này khi cố gắng sử dụng Jackrabbit 2.2.5 với SLF4J 1.6.1 và Logback 0.9.28!
Hendy Irawan

Cảm ơn. Tôi đã liên kết đến câu trả lời của bạn ở đây: spring-java-ee.blogspot.com/2011/04/…
Hendy Irawan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.