我正在创建一个允许循环浏览文件的java.util.logging.FileHandler。当我的应用程序运行多个实例时,会为应用程序的每个实例创建一个新的日志文件。我需要知道应用程序正在使用哪个文件,因为我想将日志文件上传到我的服务器以供进一步审查。如何判断某个FileHandler正在使用哪个文件?
发布于 2009-07-12 19:53:23
最简单的方法是在文件名本身中添加某种标识符,即在创建FileHandler时使用pattern参数。由于这些都是同一应用程序的实例,区分它们的一种方法是通过它们的进程id,因此您可以将其作为模式的一部分。一种更好的方法是通过命令行传递一个标识符,并使用它来生成您的文件名。这样,您就可以在某种意义上控制正在创建的文件。最后,如果您的应用程序知道为什么它与所有其他应用程序不同,例如,它连接到一个特定的数据库服务器,那么您可以只使用该数据库服务器名称作为文件名的一部分。
编辑:似乎没有任何接口来获取FileHandler正在使用的文件的名称。我建议研究一下x4juli中的日志记录扩展(它将大量log4j功能移植到java.util.logging规范中):
您应该能够替换提供getFile()方法的FileHandler的实例:
发布于 2012-06-27 08:46:03
实际上,只需自己扩展FileHandler就可以简单得多。例如..。
MyFileHandler.java:
import java.io.IOException;
import java.util.logging.FileHandler;
public class MyFileHandler extends FileHandler {
protected String _MyFileHandler_Patern;
public MyFileHandler(String pattern) throws IOException {
_MyFileHandler_Patern = pattern;
}
public String getMyFileHandlerPattern() {
return _MyFileHandler_Patern;
}
}DeleteMe.java:
import java.io.IOException;
import java.util.logging.Handler;
import java.util.logging.Logger;
public class DeleteMe {
public static void main(String[] args) throws IOException {
Logger log = Logger.getLogger(DeleteMe.class.getName());
MyFileHandler output = new MyFileHandler("output.log");
log.addHandler(output);
for (Handler handler : log.getHandlers()) {
if (handler instanceof MyFileHandler) {
MyFileHandler x = (MyFileHandler) handler;
if ("output.log".equals(x.getMyFileHandlerPattern())) {
System.out.println("found hanlder writing to output.log");
}
}
}
}
}发布于 2011-05-20 04:10:38
好吧,我不得不说,FileHandler没有提供确定日志文件的方法是非常愚蠢的。
最后,我编写了一个名为"chooseFile()“的函数,它在/tmp中搜索下一个可用的日志文件名并返回该文件。然后,您可以将该文件的名称传递给新的FileHandler()。
/**
* Utility: select a log file. File is created immediately to reserve
* its name.
*/
static public File chooseFile(final String basename) throws IOException {
final int nameLen = basename.length();
File tmpDir = new File(System.getProperty("java.io.tmpdir"));
String[] logs = tmpDir.list(new FilenameFilter() {
public boolean accept(File d, String f) {
return f.startsWith(basename);
}
});
int count = 0;
if (logs.length > 0) {
for (String name : logs) {
int n = atoi(name.substring(nameLen));
if (n >= count) count = n + 1;
}
}
String filename = String.format("%s%d.log", basename, count);
File logFile = new File(tmpDir, filename);
logFile.createNewFile();
return logFile;
}https://stackoverflow.com/questions/1116640
复制相似问题