Ketidakcocokan kerangka kerja logging

109

Saya sedang membangun aplikasi Java kecil dan berharap menggunakan logback untuk logging.

Aplikasi saya memiliki ketergantungan pada proyek lama yang melakukan pencatatan melalui

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

... jadi rencanaku adalah menggunakan

org.slf4j | jcl-over-slf4j | 1.5.6

... untuk mengalihkan logging JCL ke

org.slf4j | slf4j-api | 1.6.0

... dan akhirnya

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

sehingga aplikasi saya dapat masuk melalui logback melalui API slf4j sementara kode perpustakaan lama dapat masuk ke lokasi yang sama melalui pengalihan.

Sayangnya, ini menghasilkan

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)

Saya telah mencoba nomor verifikasi yang lebih tinggi dan lebih rendah pada beberapa toples ini dan juga menggali dokumentasi API dan semacamnya ... tetapi saya tidak dapat menemukan dan menyelesaikan masalah.

Tolonglah?

Meskipun logback dianggap sebagai kerangka logging "strategis", saya memiliki beberapa kelonggaran di mana mekanisme logging akhirnya saya gunakan. Saya berharap bisa menggunakan logback atau log4j, dan saya pasti ingin menggabungkan proses masuk proyek lama ke dalam kerangka kerja logging "baru" apa pun yang akhirnya, melalui konfigurasi umum.

Carl Smotricz
sumber

Jawaban:

111

Anda sedang mencampur versi 1.5.6 dari jcl bridge dengan versi 1.6.0 dari slf4j-api; ini tidak akan berfungsi karena beberapa perubahan di 1.6.0. Gunakan versi yang sama untuk keduanya, yaitu 1.6.1 (terbaru). Saya menggunakan jembatan jcl-over-slf4j sepanjang waktu dan berfungsi dengan baik.

Holger Hoffstätte
sumber
2
Itu langsung berhasil, tentu saja; Terima kasih banyak! Saya belum pernah menggunakan 1.6.1 dari stoples itu karena sepertinya tidak tersedia. Saya sangat kesal dengan m2eclipse, yang dimaksudkan untuk menunjukkan kepada saya semua versi yang tersedia namun secara misterius menjatuhkan sejumlah besar dari mereka.
Carl Smotricz
1
Hanya untuk kepentingan orang lain yang mengikuti: Saya berakhir dengan panah merah di grafik ketergantungan karena bahkan logback-core terbaru bersikeras pada slf4j-1.6.0. Butuh beberapa waktu lagi untuk mengotak-atik versi sampai semua panah merah menghilang, tetapi sekarang keduanya berfungsi dan semua panah biru.
Carl Smotricz
1
Bagaimana tepatnya saya melakukan itu.
pengguna1721803
Terima kasih ... Menggunakan 'jcl-over-slf4j' menyelamatkan hari saya.
Tariq M Nasim
41

Versi SLF4J 1.5.11 dan 1.6.0 tidak kompatibel (lihat laporan kompatibilitas ) karena daftar argumenorg.slf4j.spi.LocationAwareLogger.log metode telah diubah (menambahkan 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 )

Lihat laporan kompatibilitas untuk versi SLF4J lainnya di halaman ini .

Anda dapat membuat laporan seperti itu dengan alat pemeriksa kepatuhan-japi .

masukkan deskripsi gambar di sini

linuxbuild
sumber
23

Hanya untuk membantu mereka yang berada dalam situasi yang mirip dengan saya ...

Hal ini dapat terjadi jika pustaka dependen secara tidak sengaja memaketkan slf4j versi lama. Dalam kasus saya, tika-0.8. Lihat https://issues.apache.org/jira/browse/TIKA-556

Solusinya adalah mengecualikan komponen dan kemudian secara manual bergantung pada versi yang benar atau ditambal.

MISALNYA.

    <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>
Peter L.
sumber
Terima kasih! Saya terkena ini saat mencoba menggunakan Jackrabbit 2.2.5 dengan SLF4J 1.6.1 dan Logback 0.9.28!
Hendy Irawan
Terima kasih. Saya ditautkan ke jawaban Anda di sini: spring-java-ee.blogspot.com/2011/04/…
Hendy Irawan