如何使用SLF4J和SimpleLogger(Windows)写入子目录中的日志文件

时间:2015-12-03 08:49:35

标签: java path slf4j

我在我的Java应用程序中使用SLF4J SimpleLogger,我想将其配置为输出到当前工作目录中名为log的子目录中的文件。

E.g. <cwd>/log/log-file.log

我已将其配置如下:

System.setProperty(org.slf4j.impl.SimpleLogger.LOG_FILE_KEY, "log/log-file.log");

// set other properties

log = LoggerFactory.getLogger(Logger.class);

在OS X上,这可以按预期工作 - 即在log-file.log目录中创建名为<cwd>/log的文件。

但是,在Windows上,调用getLogger时会抛出异常。

Could not open [log/log-file.log]. Defaulting to System.err
Reported exception:
java.io.FileNotFoundException: log\log-file.log (The system cannot find the path specified)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
    at org.slf4j.impl.SimpleLogger.computeTargetStream(SimpleLogger.java:219)
    at org.slf4j.impl.SimpleLogger.init(SimpleLogger.java:201)
    at org.slf4j.impl.SimpleLogger.<init>(SimpleLogger.java:262)
    at org.slf4j.impl.SimpleLoggerFactory.getLogger(SimpleLoggerFactory.java:55)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:301)

如果我在没有指定子目录的情况下设置属性,则可以正常工作。

System.setProperty(org.slf4j.impl.SimpleLogger.LOG_FILE_KEY, "log-file.log");

Javadoc说logfile属性是“输出目标,可以是文件的路径”。

如何在Windows上实现与在OS X上相同的行为 - 即将日志文件写入当前工作目录的子目录?

1 个答案:

答案 0 :(得分:2)

我明白了。该问题与SimpleLogger但与FileOutputStream无关。在Windows上,如果目录不存在,则需要首先创建该目录。这在OS X上不是必需的。