我有一个在多个JVM中运行的工具,但是会记录到同一个%t
(temp)目录。我在%u
文件中使用logging.properties
(唯一)模式变量,以便每个实例都记录到不同的日志文件。
如果进程识别出失败(这是一个监视工具),它会发送一封电子邮件,我想附加遇到失败的特定实例的日志文件。但是如何获取日志文件路径?如果这不是一个好的方法,也很乐意接受将是一个更好的方法。
答案 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将是一种将所有日志信息发送到监控工具的方法,然后您可以让监控工具决定存储或发送日志数据的位置