2012-07-11 14 views
21

का उपयोग करने के लिए फोर्स slf4j फोर्स करें क्या विशिष्ट लॉगिंग प्रदाता (मेरे मामले में लॉगबैक) का उपयोग करने के लिए slf4j को मजबूर करने के लिए वैसे भी है? उनके डॉक्स में के रूप में:लॉगबैक

एकाधिक बाइंडिंग वर्ग पथ पर पाए गए

SLF4J एपीआई एक और एक समय में केवल एक अंतर्निहित प्रवेश ढांचे के साथ बाध्य करने के लिए desinged है। यदि कक्षा पथ पर एक से अधिक बाध्यकारी मौजूद है, तो SLF4J उन बाधाओं के स्थान को सूचीबद्ध करने, एक चेतावनी उत्सर्जित करेगा। जब कक्षा पथ पर एकाधिक बाइंडिंग उपलब्ध हैं, तो एक का चयन करें और केवल एक बाध्यकारी जिसे आप उपयोग करना चाहते हैं, और अन्य बाइंडिंग को हटा दें। उदाहरण के लिए, यदि आपके पास क्लास पथ पर slf4j-> simple-1.6.6.jar और slf4j-nop-1.6.6.jar दोनों हैं और आप nop (> no-operation) बाध्यकारी का उपयोग करना चाहते हैं, तो slf4j- वर्ग पथ से सरल 1.6.6.jar। यदि सुपरफ्लस बाइंडिंग को हटाना संभव नहीं है, तो एसएलएफ 4 जे अभी भी एक लॉगिंग फ्रेमवर्क/कार्यान्वयन के साथ बाध्य होगा। संस्करण 1.6.6 के रूप में, एसएलएफ 4 जे फ्रेमवर्क/कार्यान्वयन वर्ग का नाम देगा जो वास्तव में बाध्य है।

नोट एसएलएफ 4 जे द्वारा उत्सर्जित चेतावनी बस एक चेतावनी है।

मेरे मामले में मैं log4j.jar, slf4j-log4j12.jar, log4j-over-slf4j.jar और classpath में सभी logback जार की है। मुझे पता है कि slf4j-log4j12.jar और log4j-over-slf4j.jar एक साथ होने में त्रुटि है, लेकिन मेरी परियोजना बहुत बड़ी है, और मैवेन निर्भरता को ढूंढना और बहिष्कृत करना हमेशा आसान नहीं होता है। इस मामले में slf4j ने भी किसी भी चेतावनी को मुद्रित नहीं किया, क्योंकि हम केवल लॉगबैक कॉन्फ़िगरेशन का उपयोग करते हैं। इस जार नरक को समझने में मुझे एक दिन लगा।

मैं चाहता हूं कि मैं jVM तर्क के माध्यम से slf4j उपयोग लॉगबैक को मजबूर करना चाहता हूं, उदाहरण के लिए, इसलिए यह चेतावनियां प्रिंट कर सकता है और मैं भविष्य में जार को बाहर कर सकता हूं।

उत्तर

14

अपने वर्ग पथ को साफ करने के अलावा, एसएलएफ 4 जे को दिए गए कार्यान्वयन के साथ बाध्य करने का कोई तरीका नहीं है।

+0

यह मेरे लिए एक दया – madhead

17

आम तौर पर आपका स्वयं का कोड क्लासपाथ की शुरुआत में होता है। इस वजह से, एक ही रास्ता यह करने के लिए अपने स्वयं के org.slf4j.impl.StaticLoggerBinder वर्ग बनाने के लिए है:

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

उत्तर के लिए धन्यवाद है, लेकिन मैं पहले से ही मेरे classpath साफ कर दिया है । – madhead

+2

यहां तक ​​कि यह एक अच्छा जवाब है – StormeHawke

+0

लॉगबैक के लिए इस कोड का उपयोग कैसे करें, ILoggerFactory getLoggerFactory() को नए JDK14LoggerFactory() के बदले क्या करना चाहिए – nagSumanth

संबंधित मुद्दे