【问题标题】:How to set up java logging using a properties file? (java.util.logging)如何使用属性文件设置 java 日志记录? (java.util.logging)
【发布时间】:2010-10-31 21:35:13
【问题描述】:

我有一个愚蠢的 java 日志记录问题:我正在从我的应用程序配置文件中加载日志记录配置 - 但它在读取文件后没有记录任何内容(看起来很像您在网上找到的示例除了额外的应用程序配置 - 删除它也无济于事)。 “正在初始化...”日志行看起来很好,但“正在启动的应用程序”和任何其他消息既不会记录到控制台,也不会创建日志文件。我在这里错过了什么?

Logger 代码如下所示:

...
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

【问题讨论】:

    标签: java logging


    【解决方案1】:

    好的,第一个直觉在这里:

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

    Java prop 文件解析器并不是那么聪明,我不确定它是否能处理这个问题。但是我会再去看看文档....

    同时,试试:

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

    更新

    不,呃,需要更多的咖啡。没关系。

    虽然我想得更多,但请注意,您可以使用 Properties 中的方法来加载和打印道具文件:可能值得编写一个最小的程序来查看 java 认为它在该文件中读取了什么。


    另一个更新

    这一行:

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

    有一个额外的结束括号。它不会编译。确保您使用的是您认为的类文件。

    【讨论】:

    • 嗯,它确实与 readConfiguration 行有关 - 我使用调试器逐步完成了此操作,并且在此调用后清除了 LogManager 的所有属性。
    • 哦,是的,明白了 - 我使用了两次相同的输入流,所以我需要使用 configFile.reset() 重新定位它 - 否则 loadConfiguration() 调用将没有可读取的内容。顺便提一句。 ) 只是我的工作代码中的一个复制错误。
    • 我不太确定这里的答案是什么?
    • @OndraŽižka 答案是“由于语法错误,您的代码无法正常工作。”
    【解决方案2】:

    你可以通过命令行设置你的日志配置文件:

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

    这种方式看起来更干净,更容易维护。

    【讨论】:

    • 是的,我可能会添加一个检查是否设置了此属性并让它覆盖我的配置——不过,将这一切都放在一个开箱即用的配置文件中会很好。谢谢!
    【解决方案3】:

    您是否在正确的路径中搜索日志文件: %h/one%u.log

    这里 %h 解析为您的家:在 Windows 中,默认为: C:\Documents and Settings(用户名)。

    我已经尝试了您发布的示例代码,并且在您指定配置文件路径(通过代码或 java args 的 logging.properties)后它可以正常工作。

    【讨论】:

    • 先生,请问在线文档在哪里,说明 %h 解析为我的家,%u 解析为其他内容等。
    【解决方案4】:

    我已经在上面的代码中尝试过你的代码不要使用 [preferences.load(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();
        }
    }
    

    【讨论】:

    • 与主类相关的 p.properties 应该在哪里?
    【解决方案5】:
    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 2018-03-20
      • 2011-07-04
      • 2018-10-07
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多