2009-04-30 8 views
23

मैं अपना आवेदन शुरू होने पर कस्टम log.properties फ़ाइल लोड करने का प्रयास कर रहा हूं।डिफ़ॉल्ट प्रारंभ के लिए java.util.logging.config.file लोड करें

मेरी गुण फ़ाइल मेरी मुख्य कक्षा के समान पैकेज में है, इसलिए मुझे लगता है कि -Djava.util.logging.config.file=log.properties कमांड लाइन पैरामीटर गुण फ़ाइल लोड होनी चाहिए।

लेकिन गुण केवल तब लोड होते हैं जब मैं गुण फ़ाइल के लिए पूर्ण पूर्ण पथ निर्दिष्ट करता हूं। रिश्तेदार पथ का उपयोग करने के लिए कोई सुझाव?

उत्तर

18

जावा लॉगिंग फ़ाइल के लिए आपकी पूरी हार्ड डिस्क नहीं खोजती है; फाइलें देखने के लिए बहुत सरल नियम हैं। आप जावा को यह देखना चाहते हैं कि दो फाइलें एक-दूसरे से संबंधित हैं लेकिन आपने कहीं भी ऐसा नहीं कहा है। चूंकि जावा गुण फ़ाइल और आपकी कक्षा के बीच कोई कनेक्शन नहीं देखता है, इसके अलावा वे आपकी डिस्क पर एक ही फ़ोल्डर में हैं, यह फ़ाइल नहीं ढूंढ सकता है।

-Djava.util.logging.config.file=log.properties केवल तभी काम करता है जब फ़ाइल log.properties जावा प्रक्रिया की वर्तमान निर्देशिका में है (जो कि बहुत यादृच्छिक हो सकती है)। तो आपको यहां एक पूर्ण पथ का उपयोग करना चाहिए।

एक वैकल्पिक समाधान फ़ाइल logging.properties$JAVA_HOME/lib/ में स्थानांतरित करने के लिए होगा (या फ़ाइल को वहां संपादित करें)। उस स्थिति में, आपको सिस्टम प्रॉपर्टी सेट करने की आवश्यकता नहीं है।

+0

हाय, उत्तर के लिए धन्यवाद। मैं सिर्फ जावा के साथ शुरुआत कर रहा हूं, इसलिए मुझे पैकेजिंग आदि के बारे में बहुत कुछ पता नहीं है। मेरे पास जावापैलिकेशन नामक पैकेज के साथ नेटबीन डिफॉल्ट प्रोजेक्ट है। log.properties फ़ाइल अब डिफ़ॉल्ट पैकेज में है। तो मेरी कमांड लाइन इस तरह दिखता है: JavaApplication \ जिले> javaw -Djava.util.logging.config.file = log.properties जार JavaApplication.jar गुण अभी भी फाइल लोड नहीं है। क्या आप मुझे एक अतिरिक्त संकेत दे सकते हैं? :) – abp

+0

क्या आप वाकई लोड नहीं हैं? "जावा" सिस्टम आउटपुट और System.err पर सभी आउटपुट निगलता है। इसके बजाय "जावा" आज़माएं (बिना "डब्ल्यू")। साथ ही, आप कोड को डीबग करने का प्रयास कर सकते हैं यह देखने के लिए कि यह लॉगिंग क्यों नहीं कर रहा है। बस एक ब्रेकपॉइंट सेट करें और लॉगिंग कॉल में "कदम" ("चरणबद्ध" के बजाय)। log4j एक डीबग विकल्प प्रदान करता है जो इसे कॉन्फ़िगर करता है क्योंकि यह इसे पढ़ता है; मुझे नहीं पता कि आप java.util.logging के साथ ऐसा कर सकते हैं या नहीं। –

+0

उत्तर के लिए धन्यवाद। मुझे लगता है कि मैं कक्षा के माध्यम से रनटाइम कॉन्फ़िगरेशन के साथ रहूंगा, क्योंकि मुझे गुण फ़ाइल को रिश्तेदार पथ से लोड नहीं किया जा सकता है। – abp

5

उपयोग लॉगिंग क्लासपाथ से लोड नहीं होती है, इसे एक पूर्ण पथ की आवश्यकता होती है, यही कारण है कि लॉग 4j जैसे अन्य लॉगिंग पैकेज वेब ऐप्स के लिए कॉन्फ़िगर करने और बेहतर करने के लिए कहीं अधिक आसान हैं जहां यह पेट पथ प्राप्त करने का दर्द है।

यह java.util.logging.LogManager doco में बिल्कुल समझाया नहीं गया है।

+0

(वर्षों बाद, जूल के बाद अंततः बेहतर समझा जाता है :-)) यह निश्चित रूप से _absolute_ पथ की आवश्यकता नहीं है; लेकिन यह _is_ एक फ़ाइल पथ (सापेक्ष या पूर्ण) है; एक विकल्प के रूप में आप'MDava.util.logging.config.class = {class} 'का उपयोग कर लॉगमैनेजर (क्लासपाथ से लोड होने के रूप में लोड किए गए) के लिए क्लास फीड गुणों को एक फ़ाइल से लोड करने के बजाय प्राप्त कर सकते हैं। '-Djava.util.logging.config.file = path/to/my.properties' के बारे में, लेकिन मुझे लगता है कि हर कोई इस बात से सहमत हो सकता है कि java.util.logging थोड़ा कच्चा है और --- --- log4j --- (अपडेट) slf4j + लॉगबैक कॉन्फ़िगर करना आसान है और बेहतर लॉगिंग विकल्प – michael

44

आप गतिशील रूप से java.util.logging गुण फ़ाइलों को एक सापेक्ष पथ से आसानी से लोड कर सकते हैं। यह मैंने Main कक्षा में static {} ब्लॉक के अंदर रखा है। default package में अपनी logging.properties फ़ाइल डालें और आप निम्न कोड के साथ इसे आसानी से एक्सेस कर सकते हैं।

final InputStream inputStream = Main.class.getResourceAsStream("/logging.properties"); 
try 
{ 
    LogManager.getLogManager().readConfiguration(inputStream); 
} 
catch (final IOException e) 
{ 
    Logger.getAnonymousLogger().severe("Could not load default logging.properties file"); 
    Logger.getAnonymousLogger().severe(e.getMessage()); 
} 
+1

बढ़िया, बिल्कुल मैंने जो देखा और आकर्षण की तरह काम करता है! – fxnn

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

  • कोई संबंधित समस्या नहीं^_^