如何写一个记录器

时间:2011-06-07 10:52:16

标签: c# logging

所以,我想在c#中为我正在开发的应用编写一个记录器。但是,由于我喜欢效率,我不想在执行期间反复打开和关闭日志文件。

我想我想将所有事件写入RAM,然后在应用程序退出时写入日志文件一次。这是一个好习惯吗?如果是这样,我应该如何实施呢?

如果这不是一个好习惯,会是什么?

(目前我还没有使用Windows的事件日志。)

3 个答案:

答案 0 :(得分:6)

  

但是,由于我喜欢效率,我不想在执行期间反复打开和关闭日志文件

没有。这是因为你喜欢过早的优化。

  

我想我想将所有事件写入RAM,然后在应用程序退出时写入日志文件一次。这是一个好习惯吗?如果是这样,我应该如何实施呢?

如果您喜欢效率,为什么要为日志条目浪费大量内存?

  

如果这不是一个好习惯,会是什么?

如果您希望在应用程序崩溃时丢失所有日志(因为它无法将日志写入磁盘)。你为什么一开始就创建了日志?

答案 1 :(得分:3)

您必须考虑可能遇到的一些问题:

  • 系统在应用程序运行时关闭 - >没有日志文件
  • 应用程序崩溃可能无法调用您的写入方法
  • 如果日志变大(应用程序运行多长时间?),则可能会出现内存问题
  • 如果日志变大,并且驱动器上没有足够的空间,则不会写入单个日志行

您可以简单地在应用程序运行时保持文件打开(至少FileShare.Read以便监视它),或者考虑编写批量日志行,在一组方法之后调用write方法,甚至使用计时器。

答案 2 :(得分:0)

如果你的应用程序崩溃了,你就会丢失所有日志。如果您在适当的时候将日志刷新到磁盘,那就更好了。懒惰写道:

将日志条目排队到单独的记录器线程(即将它们存储在某个类中,并将类实例排队到生产者 - 消费者队列)。在记录器线程中,等待输入队列超时。如果有日志条目,请将其存储在本地缓存队列中。

如果(超时触发)或(达到存储的某些高水位标记),则将所有缓存的日志条目写入文件并刷新文件缓冲区。

RGDS, 马丁