गुण फ़ाइल का उपयोग करके जावा लॉगिंग कैसे सेट करें? (Java.util.logging)


82

मुझे एक बेवकूफ जावा लॉगिंग समस्या है: मैं अपनी ऐप कॉन्फ़िगरेशन फ़ाइल से लॉगिंग कॉन्फ़िगरेशन लोड कर रहा हूं - लेकिन यह फ़ाइल को पढ़ने के बाद कुछ भी लॉग नहीं करता है (जो आपको नेट पर मिलने वाले उदाहरणों की तरह ही बहुत पसंद आएगा। अतिरिक्त एप्लिकेशन कॉन्फ़िगरेशन - इसे हटाने से भी मदद नहीं मिलती है)। "इनिशियलाइज़िंग ..." लॉग लाइन ठीक दिखाई देती है, लेकिन "शुरुआती ऐप" और किसी भी अन्य संदेशों को न तो कंसोल में लॉग किया जाता है, और न ही लॉगफ़ाइल कभी बनाया जाता है। मुझे यहां क्या समझ नहीं आ रहा है?

लकड़हारा कोड इस तरह दिखता है:

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...

और यह कॉन्फ़िगरेशन फ़ाइल है:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO

# Console Logging
java.util.logging.ConsoleHandler.level = ALL

जवाबों:


28

ठीक है, पहला अंतर्ज्ञान यहाँ है:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

जावा प्रोप फ़ाइल पार्सर वह सब स्मार्ट नहीं है, मुझे यकीन नहीं है कि यह इसे संभाल लेगा। लेकिन मैं फिर से डॉक्स को देखूंगा ...।

इस समय में, प्रयास करें:

handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL

अपडेट करें

नहीं, दोहे, अधिक कॉफी की जरूरत है। कोई बात नहीं।

जब मैं अधिक सोचता हूं, तो ध्यान दें कि आप प्रोप-फाइल को लोड करने और प्रिंट करने के लिए गुणों में विधियों का उपयोग कर सकते हैं : यह देखने के लिए एक न्यूनतम कार्यक्रम लिखने के लायक हो सकता है कि जावा क्या सोचता है कि यह उस फ़ाइल में पढ़ता है।


एक और अपडेट

यह रेखा:

    FileInputStream configFile = new FileInputStream("/path/to/app.properties"));

अतिरिक्त अंत-परन है। यह संकलन नहीं होगा। सुनिश्चित करें कि आप जिस वर्ग फ़ाइल के साथ काम कर रहे हैं, वह आपको लगता है।


खैर, यह रीडऑनफिगरेशन लाइन के साथ कुछ करने के लिए सीवन करता है - मैंने एक डिबगर के साथ इसके माध्यम से कदम रखा और इस कॉल के बाद LogManager के सभी गुण साफ हो जाते हैं।
VolkA

5
अरे हाँ, मिल गया - मैं एक ही इनपुट स्ट्रीम का दो बार उपयोग कर रहा हूं, इसलिए मुझे configFile.reset () का उपयोग करके इसे रिपॉजिट करने की आवश्यकता है - अन्यथा लोडकॉन्फ़िगरेशन () कॉल में पढ़ने के लिए कुछ भी नहीं होगा। Btw। ) मेरे काम कोड से सिर्फ एक नकल त्रुटि थी।
VolkA

1
मुझे पूरा यकीन नहीं है कि यहाँ क्या जवाब है?
ओद्र Oižka

@ Ondra codeižka जवाब है "आपका कोड वाक्यविन्यास त्रुटि के कारण काम नहीं किया।"
चार्ली मार्टिन

102

आप कमांड लाइन के माध्यम से अपनी लॉगिंग कॉन्फ़िगरेशन फ़ाइल सेट कर सकते हैं:

$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass

इस तरह से क्लीनर और बनाए रखने में आसान लगता है।


1
हाँ, मैं शायद यह जाँच करूँगा कि क्या यह संपत्ति सेट है और इसे मेरे विन्यास को अधिलेखित कर देना चाहिए - यह सब एक विन्यास फाइल में होता है जो बॉक्स से बाहर काम करता है, हालांकि अच्छा होगा। धन्यवाद!
वोल्का

12

मैंने आपके कोड को उपरोक्त कोड में आज़माया है [वरीयताएँ (configFile)?] स्टेटमेंट का उपयोग न करें और यह काम करेगा। सेटिंग कोड चल रहा है

public static void main(String[]s)
{

    Logger log = Logger.getLogger("MyClass");
    try {
    FileInputStream fis =  new FileInputStream("p.properties");
    LogManager.getLogManager().readConfiguration(fis);
    log.setLevel(Level.FINE);
    log.addHandler(new java.util.logging.ConsoleHandler());
    log.setUseParentHandlers(false);

    log.info("starting myApp");
    fis.close();

    } 
    catch(IOException e) {
    e.printStackTrace();
    }
}

1
मुख्य वर्ग के संबंध में p.properties कहां होना चाहिए?
लुइस सोएर्स

9
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

//Properties preferences = new Properties();
try {
    //FileInputStream configFile = new //FileInputStream("/path/to/app.properties");
    //preferences.load(configFile);
    InputStream configFile = myApp.class.getResourceAsStream("app.properties");
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");

यह काम कर रहा है .. :) आपको readConfiguration () में InputStream पास करना होगा।


3

क्या आप लॉग फ़ाइल को सही रास्ते में खोज रहे हैं:% h / एक% u.log

यहाँ% h आपके घर में हल होता है: विंडोज़ में यह डिफॉल्ट करता है: C: \ Documents and Settings (user_name)।

मैंने आपके द्वारा पोस्ट किए गए नमूना कोड की कोशिश की है और यह कॉन्फ़िगरेशन फ़ाइल पथ (लॉगिंग.प्रोफ़र्टीज़ या तो कोड या जावा आर्ग्स के माध्यम से) निर्दिष्ट करने के बाद ठीक काम करता है।


महोदय, क्या मैं जान सकता हूं कि ऑनलाइन दस्तावेज कहां है जो राज्य% h मेरे घर में हल करता है,% u कुछ और करने के लिए संकल्प करता है, आदि।
ल्यूक एरोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.