繁体   English   中英

如何使用属性文件设置 java 日志记录? (java.util.logging)

[英]How to set up java logging using a properties file? (java.util.logging)

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

记录器代码如下所示:

...
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 -Djava.util.logging.config.file=/path/to/app.properties MainClass

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

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

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"));

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

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

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

这里 %h 解析为您的主页:在 Windows 中,默认为:C:\Documents and Settings(user_name)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM