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


82

我有一个愚蠢的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

Answers:


28

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

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中的方法来加载和打印prop-file:可能值得编写一个最小的程序来查看java认为该文件读取了什么。


另一个更新

这行:

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

有一个额外的末尾。它不会编译。确保您正在使用自己认为的类文件。


好吧,这确实与readConfiguration行有关-我通过调试器逐步完成了此操作,并且在此调用之后清除了LogManager的所有属性。
VolkA

5
哦,是的,知道了-我使用了两次相同的输入流,所以我需要使用configFile.reset()重新放置它的位置-否则loadConfiguration()调用将无法读取。顺便说一句。)只是我的工作代码中的一个复制错误。
VolkA

1
我不太确定这里的答案是什么?
OndraŽižka18年

@OndraŽižka的答案是“由于语法错误,您的代码无法正常工作”。
查理·马丁

100

您可以通过命令行设置日志记录配置文件:

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

这样看起来更清洁,更易于维护。


1
是的,我可能会添加一个检查是否设置了此属性,并让它覆盖我的配置-将所有这些都保存在一个可以即用的配置文件中会很好。谢谢!
VolkA

12

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

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 / one%u.log

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

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


先生,我可以知道%h解析到我的家,%u解析到其他东西的在线文档在哪里,等等。
卢克·阿隆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.