SLF4J - Thông báo lỗi
Trong chương này, chúng tôi sẽ thảo luận về các thông báo lỗi hoặc cảnh báo khác nhau mà chúng tôi nhận được khi làm việc với SLF4J và nguyên nhân / ý nghĩa của các thông báo đó.
Không tải được lớp "org.slf4j.impl.StaticLoggerBinder".
Đây là một cảnh báo được gây ra khi không có liên kết SLF4J nào được cung cấp trong classpath.
Sau đây là cảnh báo đầy đủ -
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.
Để giải quyết vấn đề này, bạn cần thêm một trong các ràng buộc của khung ghi nhật ký. Điều này được giải thích trongHello world chương của hướng dẫn này.
Note - Điều này xảy ra trong các phiên bản SLF4J từ 1.6.0 đến 1.8.0-beta2.
Không tìm thấy nhà cung cấp SLF4J nào
Trong slf4j-1.8.0-beta2, cảnh báo trên nói rõ hơn “No SLF4J providers were found”.
Sau đây là cảnh báo đầy đủ -
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 chứa các liên kết SLF4J nhắm mục tiêu các phiên bản slf4j-api trước 1.8
Nếu bạn đang sử dụng phiên bản SLF4J 1.8 và bạn có các ràng buộc của các phiên bản trước trong classpath nhưng không có các ràng buộc của 1.8, bạn sẽ thấy một cảnh báo như hình dưới đây.
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
Nếu bạn đang làm việc với slf4j-jcl và nếu bạn chỉ có slf4j-jcl.jar trong classpath của bạn, bạn sẽ nhận được một ngoại lệ chẳng hạn như một ngoại lệ được đưa ra bên dưới.
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
Để giải quyết vấn đề này, bạn cần thêm commons-logging.jar vào classpath của bạn.
Đã phát hiện cả jcl-over-slf4j.jar VÀ liên kết slf4j-jcl.jar trên classpath ..
Các ràng buộc slf4j-jcl.jar chuyển hướng các lệnh gọi của trình ghi slf4j đến JCL và jcl-over-slf4j.jarchuyển hướng các cuộc gọi của trình ghi nhật ký JCL đến slf4j. Do đó, bạn không thể có cả hai trong classpath của dự án của mình. Nếu bạn làm như vậy, bạn sẽ nhận được một ngoại lệ chẳng hạn như trường hợp được đưa ra bên dưới.
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
Để giải quyết vấn đề này, hãy xóa một trong các tệp jar.
Tên trình ghi nhật ký đã phát hiện không khớp
Bạn có thể tạo một đối tượng Logger bằng cách -
Chuyển tên của trình ghi nhật ký được tạo làm đối số cho getLogger() phương pháp.
Truyền một lớp làm đối số cho phương thức này.
Nếu bạn đang cố gắng tạo đối tượng nhà máy ghi nhật ký bằng cách chuyển một lớp làm đối số và nếu bạn đã đặt thuộc tính hệ thống slf4j.detectLoggerNameMismatch thành true, sau đó là tên của lớp bạn truyền làm đối số cho getLogger() và lớp bạn sử dụng phải giống nhau nếu không bạn sẽ nhận được cảnh báo sau:
“Tên trình ghi nhật ký đã phát hiện không khớp.
Hãy xem xét ví dụ sau.
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");
}
}
Ở đây, chúng tôi đã đặt thuộc tính slf4j.detectLoggerNameMismatch thành true. Tên của lớp chúng tôi đã sử dụng làSLF4JExample và tên lớp mà chúng ta đã chuyển cho phương thức getLogger () là Sample vì cả hai đều không bằng nhau, chúng tôi sẽ nhận được cảnh báo sau.
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 - Điều này xảy ra sau slf4j 1.7.9
Classpath chứa nhiều liên kết SLF4J.
Bạn chỉ nên có một ràng buộc trong classpath. Nếu bạn có nhiều ràng buộc, bạn sẽ nhận được cảnh báo liệt kê các ràng buộc và vị trí của chúng.
Giả sử, nếu chúng ta có các ràng buộc slf4j-jdk14.jar và slf4j-nop.jar trong classpath, chúng ta sẽ nhận được cảnh báo sau.
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]
Đã phát hiện cả log4j-over-slf4j.jar VÀ liên kết slf4j-log4j12.jar trên đường dẫn lớp
Để chuyển hướng các cuộc gọi trình ghi log4j đến slf4j, bạn cần sử dụng log4j-over-slf4j.jar ràng buộc và nếu bạn muốn chuyển hướng cuộc gọi slf4j đến log4j, bạn cần sử dụng slf4j-log4j12.jar sự ràng buộc.
Do đó, bạn không thể có cả hai trong classpath. Nếu bạn làm vậy, bạn sẽ nhận được ngoại lệ sau.
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.