SLF4J - Pesan Kesalahan

Dalam bab ini, kita akan membahas berbagai pesan kesalahan atau peringatan yang kita dapatkan saat bekerja dengan SLF4J dan penyebab / arti dari pesan tersebut.

Gagal memuat kelas "org.slf4j.impl.StaticLoggerBinder".

Ini adalah peringatan yang terjadi jika tidak ada binding SLF4J yang disediakan di classpath.

Berikut adalah peringatan lengkapnya -

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.

Untuk mengatasi ini, Anda perlu menambahkan salah satu binding framework logging. Ini dijelaskan diHello world bab dari tutorial ini.

Note - Ini terjadi pada versi SLF4J yang berada di antara 1.6.0 dan 1.8.0-beta2.

Tidak ada penyedia SLF4J yang ditemukan

Dalam slf4j-1.8.0-beta2, peringatan di atas lebih jelas “No SLF4J providers were found”.

Berikut adalah peringatan lengkapnya -

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

Classpath berisi binding SLF4J yang menargetkan versi slf4j-api sebelum 1.8

Jika Anda menggunakan SLF4J versi 1.8 dan Anda memiliki binding dari versi sebelumnya di classpath tetapi tidak memiliki binding 1.8, Anda akan melihat peringatan seperti yang ditunjukkan di bawah ini.

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions prior to
1.8.
SLF4J: Ignoring binding found at
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#ignoredBindings for an explanation.

NoClassDefFoundError: org / apache / commons / logging / LogFactory

Jika Anda bekerja dengan slf4j-jcl dan jika Anda hanya punya slf4j-jcl.jar di classpath Anda, Anda akan mendapatkan pengecualian seperti yang diberikan di bawah ini.

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/commons/logging/LogFactory
   at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.ClassNotFoundException:
org.apache.commons.logging.LogFactory
   at java.net.URLClassLoader.findClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   ... 3 more

Untuk mengatasi ini, Anda perlu menambahkan commons-logging.jar ke jalur kelas Anda.

Mendeteksi jcl-over-slf4j.jar DAN terikat slf4j-jcl.jar di classpath ..

Pengikatan slf4j-jcl.jar mengalihkan panggilan dari logger slf4j ke JCL dan jcl-over-slf4j.jarmengalihkan panggilan JCL logger ke slf4j. Oleh karena itu, Anda tidak dapat memiliki keduanya di classpath proyek Anda. Jika Anda melakukannya, Anda akan mendapatkan pengecualian seperti yang diberikan di bawah ini.

SLF4J: Detected both jcl-over-slf4j.jar AND bound slf4j-jcl.jar on the class
path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#jclDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
   at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:71)
   at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:42)
   at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
   at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
   at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar
AND bound slf4j-jcl.jar on the class path, preempting StackOverflowError. See
also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
   at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:54)
   ... 7 more

Untuk mengatasi ini, hapus salah satu file jar.

Ketidakcocokan nama logger yang terdeteksi

Anda dapat membuat objek Logger dengan -

  • Meneruskan nama logger yang akan dibuat sebagai argumen ke getLogger() metode.

  • Meneruskan kelas sebagai argumen untuk metode ini.

Jika Anda mencoba membuat objek pabrik pencatat dengan meneruskan kelas sebagai argumen, dan jika Anda telah menyetel properti sistem slf4j.detectLoggerNameMismatch menjadi true, maka nama kelas yang Anda berikan sebagai argumen ke getLogger() metode dan kelas yang Anda gunakan harus sama jika tidak, Anda akan menerima peringatan berikut -

“Ketidakcocokan nama logger yang terdeteksi.

Perhatikan contoh berikut.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
   public static void main(String[] args) {
      System.setProperty("slf4j.detectLoggerNameMismatch", "true");
      
      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(Sample.class);

      //Logging the information
      logger.info("Hi Welcome to Tutorilspoint");
   }
}

Di sini, kami telah menyetel properti slf4j.detectLoggerNameMismatch ke true. Nama kelas yang kami gunakan adalahSLF4JExample dan nama kelas yang telah kita berikan ke metode getLogger () adalah Sample karena keduanya tidak sama kita akan mendapatkan peringatan berikut.

SLF4J: Detected logger name mismatch. Given name: "Sample"; computed name:
"SLF4JExample".
SLF4J: See http://www.slf4j.org/codes.html#loggerNameMismatch for an
explanation
Dec 10, 2018 12:43:00 PM SLF4JExample main
INFO: Hi Welcome to Tutorilspoint

Note - Ini terjadi setelah slf4j 1.7.9

Classpath berisi beberapa binding SLF4J.

Anda seharusnya hanya memiliki satu pengikatan di classpath. Jika Anda memiliki lebih dari satu binding, Anda akan mendapatkan peringatan yang mencantumkan binding dan lokasinya.

Misalnya, jika kita memiliki binding slf4j-jdk14.jar dan slf4j-nop.jar di classpath kita akan mendapatkan peringatan berikut.

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-nop-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]

Mendeteksi log4j-over-slf4j.jar DAN terikat slf4j-log4j12.jar di jalur kelas

Untuk mengalihkan panggilan logger log4j ke slf4j, Anda perlu menggunakan log4j-over-slf4j.jar mengikat dan jika Anda ingin mengalihkan panggilan slf4j ke log4j, Anda harus menggunakan slf4j-log4j12.jar mengikat.

Oleh karena itu, Anda tidak dapat memiliki keduanya di classpath. Jika Anda melakukannya, Anda akan mendapatkan pengecualian berikut.

SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the
class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
   at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
   at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
   at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
   at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
   at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar
AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.