2015-12-16 30 views
1

我想写一个非常简单的Java日志记录类,可以写入日志文件,所以我可以在我的其他项目中重复使用它。我扩展了PrintWriter类,以便在写入日志文件之前检测日志文件是否已打开。打开和关闭一个PrintWriter对象反复在Java中不好的做法?

当用户完成日志记录时,他们必须在日志记录对象上调用.close()来关闭文件。当只集成到单一类应用程序中时,这不是什么大问题,但现在我试图将此记录器类集成到几个不同的父类和子类中,这些类将引用相同的日志文件,并且不会关闭一个参考,我将无法打开另一个班的另一个。

每次记录什么内容时,致电.open().write(msg).close()会很糟糕吗?它手动消除需要openclose记录器。或者有没有更好的解决方案?

我发现this similar question为C++,但唯一的答案是“以我的经验...”,我有点寻找更深入的答案。

+1

我认为这本质上是基于意见的,但通常打开和关闭文件(或不断重新创建对象)是不好的做法。 OTOH日志往往是一种相对较少的东西,所以尝试优化它并不总是有意义的。如果遇到问题,请使用分析器。如果你没有问题,“如果它没有损坏,不要修复它。” – markspace

回答

2

我不会推荐多个类同时写入同一个文件。我的想法是为您的Logger类实现一个队列,其中与它集成的所有类将其push的日志记录到。

每当一个类将其日志推送到队列中时,它应该向记录器询问文件的write

Logger实例中创建布尔值writing,以防止执行多个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; 
    } 
    } 
} 

现在openclose文件不经常,你不丢失任何日志。

+0

我很喜欢这个想法。在这个阶段,我不打算在任何类型的多线程系统中使用记录器类,因此,在单线程中,这基本上与“打开”“写入”和“关闭”功能相同,对? –

+0

如果一次只有一个班级向其写入,而没有同时写入,则它与开始和结束时相同 –

相关问题