如何输出当前java.util.logging.Logger日志文件名的名称?

时间:2016-07-01 21:36:33

标签: java logging java.util.logging

我有一个在多个JVM中运行的工具,但是会记录到同一个%t(temp)目录。我在%u文件中使用logging.properties(唯一)模式变量,以便每个实例都记录到不同的日志文件。

如果进程识别出失败(这是一个监视工具),它会发送一封电子邮件,我想附加遇到失败的特定实例的日志文件。但是如何获取日志文件路径?如果这不是一个好的方法,也很乐意接受将是一个更好的方法。

1 个答案:

答案 0 :(得分:0)

JDK-4798814 getFiles() needed for java.util.logging.FileHandler下向Oracle提交的RFE涵盖了这一点。

如果您没有使用安全管理器,则可以使用反射。

public class GetFileHandler extends FileHandler {

    public GetFileHandler() throws IOException {
        super();
    }

    /**
     * Gets the files used by this handler.  Index zero is the file that is
     * in use.
     *
     * @return a array of files.
     * @throws IOException if there is an error.
     * @throws SecurityException if not allowed.
     */
    public File[] getFiles() throws IOException {
        return GetFileHandler.getFiles(this);
    }

    private static File[] getFiles(FileHandler h) throws IOException {
        try {
            Field f = FileHandler.class.getDeclaredField("files");
            f.setAccessible(true);
            synchronized (h) {
                return ((File[]) f.get(h)).clone();
            }
        } catch (ReflectiveOperationException roe) {
            throw new IOException(roe);
        }
    }
}

请记住,此解决方案可能会针对文件轮换进行竞争。如果更改了FileHandler源代码,它也可能会中断。

如果您不需要轮换,则可以随时扩展StreamHandler并提供已知的文件位置。

public class KnownFileHandler extends StreamHandler {

    private final File file;

    public KnownFileHandler() throws IOException {
        String v = LogManager.getLogManager().getProperty(getClass().getName() +".name");
        if(v == null) {
            v = "knownfilehandler.log";
        }
        file = new File(v);
        this.setOutputStream(new FileOutputStream(file));
    }


    public File getFile() {
        return this.file;
    }
}

如果监控工具支持传入的TCP连接,那么java.util.logging.SocketHandler将是一种将所有日志信息发送到监控工具的方法,然后您可以让监控工具决定存储或发送日志数据的位置