2012-01-18 14 views
11

मैं सेटअप ग्रहण करने के लिए मेरे सबसे अच्छे किया है और मेरे जावा आवेदन के भीतर काम करने के लिए एक log4j.properties फ़ाइल का उपयोग करने के लिए। हालांकि, यह गुण फ़ाइल का उपयोग नहीं कर रहा प्रतीत होता है और मुझे यकीन नहीं है कि क्यों।जावा आवेदन: log4j हो रही ग्रहण पर्यावरण

पुस्तकालय: slf4j-api-1.6.1, slf4j-jdk14-1.6.1

आवेदन लॉगिंग ठीक काम करता है के भीतर। मैं ग्रहण कंसोल में जानकारी, चेतावनियां और त्रुटियों को प्रिंट करने में सक्षम हूं।

मैं ऐसा करने में सक्षम होने के लिए क्या चाहते हैं दोनों सांत्वना और एक लॉग फ़ाइल के लिए सभी प्रवेश करने गए संदेशों डिबग और प्रिंट करने के लिए लॉग स्तर बदल रहा है।

मैं एक log4j.properties फ़ाइल है कि इस तरह दिखता है बनाया है:

log4j.rootLogger=DEBUG,console,file 
log4j.rootCategory=DEBUG, R, O 

# Stdout 
log4j.appender.O=org.apache.log4j.ConsoleAppender 

# File 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=log4j.log 

# Control the maximum log file size 
log4j.appender.R.MaxFileSize=100KB 

# Archive log files (one backup file here) 
log4j.appender.R.MaxBackupIndex=5 
log4j.appender.file.File=checkLog.log 
log4j.appender.file.threshold=DEBUG 

log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.O.layout=org.apache.log4j.PatternLayout 

log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 
log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 

मेरे निर्देशिका संरचना इस तरह दिखता है:

My Project 
--src/ 
----MYProject/ 
------*.java 
--bin/ 
----MYProject/ 
------*.class 
--log4j/ 
----log4j.properties 

ग्रहण मैं गया में: भागो विन्यास -> क्लासपाथ (टैब) -> "उपयोगकर्ता प्रविष्टियों" पर राइट क्लिक किया गया -> एक नया फ़ोल्डर के रूप में "log4j" जोड़ा गया "और सहेजा गया।

फिर मेरे कोड में मैं इस तरह लॉगजर कहता हूं mple कोड मेरा दृष्टिकोण प्रदर्शित करने के लिए तो यह वाक्य रचना त्रुटियाँ हो सकता है):

package MYProject; 
import org.slf4j.LoggerFactory; 

public class MyClass{ 

    final org.slf4j.Logger test_logger = LoggerFactory.getLogger(MyClass.class); 

    public MyClass(){} 

    public someMethod(){ 
    test_logger.debug("Some Debug"); 
    test_logger.info("Some Info"); 
    test_logger.warn("Some Warning"); 
    test_logger.error("An Error"); 
    } 

} 

मैं तो someMethod फोन करके यह जानकारी प्रिंट, ग्रहण कंसोल के लिए चेतावनी, त्रुटि। यह DEBUG प्रिंट नहीं करेगा और फ़ाइल पर प्रिंट नहीं करेगा।

मैं मैं गलत क्या कर किया जा सकता है पर किसी भी सुझाव की सराहना करेंगे।

उत्तर

14

classpath अपने log4j.properties से आगे में एक और log4j.properties या log4j.xml फ़ाइल हो सकता है। अपनी प्रोजेक्ट के लिए रन कॉन्फ़िगरेशन खोलें, और अपनी परियोजना के लिए वीएम तर्क के रूप में -Dlog4j.debug=true जोड़ें। यह कंसोल पर बहुत सी अतिरिक्त जानकारी प्रिंट करने के लिए log4j को निर्देश देगा, जिसमें वह कॉन्फ़िगरेशन फ़ाइल भी शामिल है।

+1

मैंने आपकी टिप्पणी और अपील दोनों के साथ खेला है और यही वह है जो मैंने पाया है। मैं अपने वर्तमान सेटअप के साथ PropertyConfigurator नहीं जोड़ सकता क्योंकि यह log4j लाइब्रेरी की एक संपत्ति है और slf4j-jdk14 (slf4j के log4j बाइंडर जैसा कि मैं इसे समझता हूं) लाइब्रेरी का हिस्सा नहीं है। वीएम पैरामीटर को सत्य में सेट करना कोई अतिरिक्त डिबगिंग नहीं देता है। – Bryce

+0

यदि मैं slf4j-jdk14 के अलावा वास्तविक log4j लाइब्रेरी का संदर्भ देता हूं तो मुझे डीबग आउटपुट प्राप्त करना प्रारंभ होता है। बस संदर्भ जोड़ना मेरी log4j.properties फ़ाइल काम करना शुरू कर देता है। मुझे लगता है कि मुझे 9 0% की जरूरत है। इससे डिबगिंग बढ़ जाती है लेकिन प्रारंभिक पोस्ट में दी गई कक्षा में मुद्रित आदेश अब प्रिंट नहीं होते हैं (test_logger.debug, test_logger.info, आदि)। मुझे लगता है कि ऐसा इसलिए है क्योंकि मैंने जो log4j लाइब्रेरी जोड़ा है वह ओवरग्राइटिंग org.slf4j.Logger है जिसे मैं पहले इस्तेमाल कर रहा था। मैं इन दो पुस्तकालयों को एक साथ बेहतर काम करने के लिए कैसे प्राप्त करने के बारे में थोड़ा उलझन में हूं, कोई सुझाव? – Bryce

+1

slf4j लॉगिंग के लिए सिर्फ एक मुखौटा है, आपको अभी भी अपने क्लासपाथ में वास्तविक लॉगिंग लाइब्रेरी (log4j अपने मामले में) जोड़ना होगा। यह लिंक देखें: http://slf4j.org/manual.html#binding –

2

आप गुण फ़ाइल का उपयोग करने के लिए अपने कोड बताने के लिए की जरूरत है। इससे पहले किसी भी प्रवेश किया जाता है डाल कृपया

PropertyConfigurator.configure("log4j/log4j.properties"); 
3

आप लॉगिंग बहाना slf4j उपयोग कर रहे हैं, तो आप उस बैकएंड के लिए इसी जार फ़ाइल शामिल करके वास्तव में एक प्रवेश बैकएंड निर्दिष्ट करने के लिए की जरूरत है। आपके मामले में, आपने अपने क्लासपाथ पर slf4j-jdk14-x.x.x.jar इंस्टॉल किया है, जो कि केवल एक सामान्य लॉगर बैकएंड है।

आदेश log4j बैकएंड का उपयोग करने के लिए आपको slf4j-jdk14-x.x.x.jar हटाने और slf4j-log4j12-x.x.x.jar से बदलने की जरूरत है। यदि आप इसे हटा नहीं देते हैं, तो slf4j को केवल एक बैकएंड जार चुनना होगा, और शायद वह नहीं जिसे आप चाहते हैं।

बेशक आप भी अपने classpath पर वास्तविक log4j-x.x.x.jar फ़ाइल की आवश्यकता होगी।

एक बार ये जार ठीक से जगह पर हैं, तो -Dlog4j.debug का वीएम पैरामीटर वास्तव में काम करेगा और डीबगिंग में उपयोगी होगा जहां आपकी लॉगिंग कॉन्फ़िगरेशन आ रही हैं।

0

आपके पास अपनी लक्षित निर्देशिका में एक पुराना संस्करण हो सकता है। परियोजना को साफ करें और पुनः प्रयास करें।

इसके अलावा आपको यह सुनिश्चित करना चाहिए कि ग्रहण परियोजना को रीफ्रेश करें यदि आपने ग्रहण के माध्यम से log4j.properties को नहीं जोड़ा है।

0

पथ परियोजना गुणों/लाइब्रेरी टैब में परियोजना के जेआर (जेआरई सिस्टम लाइब्रेरी) को हटाएं और फिर से सेट करें!

+0

क्या आप अपने समाधान को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone

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