我正在尝试编写一个非常简单的Java日志记录类,它可以写入日志文件,因此我可以在其他项目中重用它。我扩展了PrintWriter
类,以便在写入之前检测日志文件是否打开。
当用户完成日志记录后,他们必须在日志对象上调用.close()
来关闭文件。当只集成到单个类应用程序中时,这不是什么大不了的事,但现在我试图将这个记录器类集成到几个不同的父类和子类中,这些类都将引用相同的日志文件,如果没有关闭一个参考文献,我就无法从另一个班级打开另一个参考文献。
每次记录某些内容时,拨打.open()
,.write(msg)
,.close()
会不会很糟糕?它将手动消除对open
和close
记录器的需要。或者有更好的解决方案吗?
我找到了this similar question用于C ++,但唯一的答案是"根据我的经验......"我正在寻找一个更深入的答案。
答案 0 :(得分:2)
我不建议同时在同一个文件中写入多个类。我的想法是为您的Logger
类实现一个队列,其中与其集成的所有类将push
他们的日志。
每当一个类将其日志推送到队列时,它应该要求记录器write
到该文件。
在writing
实例中创建一个布尔Logger
,防止执行多个write
命令以避免重复。
您的write
方法一直在写入,直到队列为空,然后将writing
布尔值重置为false
。
// A sample logger class
public class Logger {
static Queue<String> pending = new LinkedList<String>();
static boolean writing = false;
static PrintWriter pw = new PrintWriter("production.log", "UTF-8");
public static void write() {
if(!writing) {
writing = true;
pw.open();
while(!pending.isEmpty()) {
pw.println(pending.poll());
}
pw.close();
writing = false;
}
}
}
您现在open
和close
的文件频率较低,并且您不会丢失任何日志。