2012-07-11 31 views
21

Có cách nào để buộc slf4j sử dụng nhà cung cấp đăng nhập cụ thể (đăng nhập trong trường hợp của tôi) không? Như trong tài liệu của họ:Buộc slf4j sử dụng logback

Nhiều ràng buộc đã được tìm thấy trên con đường lớp

SLF4J API được ngủ được thiết kế để ràng buộc với một và chỉ một khung đăng nhập cơ bản cùng một lúc. Nếu có nhiều hơn một ràng buộc có mặt trên đường dẫn lớp, SLF4J sẽ phát ra một cảnh báo, liệt kê vị trí của các ràng buộc đó. Khi nhiều kết buộc có sẵn trên đường dẫn lớp, hãy chọn một và chỉ một liên kết bạn muốn sử dụng và xóa các ràng buộc khác. Ví dụ, nếu bạn có cả slf4j-> simple-1.6.6.jar và slf4j-nop-1.6.6.jar trên đường dẫn lớp và bạn muốn sử dụng ràng buộc nop (> no-operation), sau đó loại bỏ slf4j- simple-1.6.6.jar từ đường dẫn lớp. Nếu không thể loại bỏ các ràng buộc thừa, SLF4J sẽ vẫn liên kết với một khung công tác/triển khai ghi nhật ký. Kể từ phiên bản 1.6.6, SLF4J sẽ đặt tên cho khung công tác/khung thực thi mà nó thực sự bị ràng buộc.

LƯU Ý Cảnh báo phát ra bởi SLF4J chỉ là vậy, một cảnh báo.

Trong trường hợp của tôi, tôi có log4j.jar, slf4j-log4j12.jar, log4j-over-slf4j.jar và tất cả các lọ logback trong classpath. Tôi biết rằng đó là lỗi có slf4j-log4j12.jarlog4j-over-slf4j.jar cùng nhau, nhưng dự án của tôi là rất lớn và không phải lúc nào cũng đơn giản để tìm và loại trừ sự phụ thuộc của maven. Trong trường hợp này slf4j thậm chí không in bất kỳ cảnh báo nào, bởi vì chúng tôi chỉ sử dụng cấu hình logback. Phải mất một ngày tôi mới hiểu được cái địa ngục này.

Tất cả những gì tôi muốn là buộc slf4j sử dụng logback thông qua đối số JVM, ví dụ, để nó có thể in cảnh báo và tôi có thể loại trừ các lọ trong tương lai.

Trả lời

14

Khác với việc dọn dẹp đường dẫn lớp học của bạn, không có cách nào để buộc SLF4J liên kết với một triển khai nhất định.

+0

Đó là một điều đáng tiếc cho tôi – madhead

17

Nói chung mã của riêng bạn là ở đầu đường dẫn lớp. Bởi vì điều này, một trong những cách để làm điều đó là để tạo ra lớp org.slf4j.impl.StaticLoggerBinder riêng bạn:

package org.slf4j.impl; 

import org.slf4j.ILoggerFactory; 
import org.slf4j.spi.LoggerFactoryBinder; 

/** 
* Force tests to use JDK14 for logging. 
*/ 
@SuppressWarnings("UnusedDeclaration") 
public class StaticLoggerBinder implements LoggerFactoryBinder { 
    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder(); 

    public static String REQUESTED_API_VERSION = "1.6"; 

    public static final StaticLoggerBinder getSingleton() { 
     return SINGLETON; 
    } 

    private StaticLoggerBinder() { 
    } 

    @Override 
    public ILoggerFactory getLoggerFactory() { 
     return new JDK14LoggerFactory(); 
    } 

    @Override 
    public String getLoggerFactoryClassStr() { 
     return "org.slf4j.impl.JDK14LoggerFactory"; 
    } 
} 
+0

Cảm ơn bạn đã trả lời, nhưng tôi đã dọn dẹp classpath của tôi . – madhead

+2

Mặc dù vậy đây là một câu trả lời tuyệt vời – StormeHawke

+0

làm thế nào để sử dụng mã này cho logback, những gì nên ILoggerFactory getLoggerFactory() trở lại thay vì JDK14LoggerFactory mới() – nagSumanth

Các vấn đề liên quan