2017-08-30 60 views
0

我目前正在质疑代码片段,关于它的有效性和资源耗用。以下是将被编译为DLL的全局日志记录实用程序方法。该方法可以同时访问。礼节和/或写入文件的最佳方式

private static void Log(string logType, 
         string severity, 
         object sender, 
         string format, 
         params object[] args) 
    { 
     if (Logger._logLock.WaitOne(250)) 
     { 
      try 
      { 
       using (StreamWriter sw = new StreamWriter(Logger._activityLogPath, true)) 
       { 
        if (logType != "RAW") 
        { 
         sw.Write("{0} {1} {2} ", 
          DateTime.Now, 
          logType, 
          severity); 
        } 

        sw.WriteLine(format, args); 
       } 
      } 
      finally 
      { 
       Logger._logLock.ReleaseMutex(); 
      } 
     } 
    } 

什么是困扰我的是“使用”块将被从同一个文件创建一个流,每一次的东西记录(每秒多调用)。我知道文件缓存,所以我不完全确定重新安装流是一个太大的问题(然而不必要的流缓冲区初始化?)。我在玩Logger类时添加StreamWriter作为变量的想法,但我也想确保在单元不正常关机的情况下写入程序已正确关闭或刷新。已知终端用户关闭该单元。我试图找到安全和速度之间的平衡,只是希望有一点洞察力。谢谢。

回答

1

a)是的,每次创建一个流并不是真的有效。例如,您可能会考虑以某种集合方式收集邮件,并在固定的时间间隔内写入/追加此集合,可能会从另一个线程传递到文件......这种方式您不需要等待邮件后250毫秒可以追加到集合中,线程将使用集合的内容。您还应该保持流打开 - 如果其他应用程序锁定文件,则执行此操作的方式可能会失败......如果在写入硬盘关闭后进行刷新,则不应影响日志文件的内容。

b)许多测井框架经过良好测试,灵活且性能卓越......为什么要重新发明轮子?

+0

感谢您的回复和确认。我将开始寻找你提到的一些预制框架。我只是想确保我没有错过为什么代码是按照原来的方式编写的关键。原来的编码人员并不是一个懒散的人,而且这段代码看起来非常没有他的特征,所以我认为他一定这样做是有原因的。 –

+0

要清楚的是,如果按照您的建议实施,那么已记录到集合中的任何内容,在硬关闭时尚未刷新到该文件,将会丢失。请在确定适当的冲洗间隔时记住这一点。不要说这是坏的/好的或无关紧要的(取决于系统的记录要求)。 – Kevin

+0

还要记住,异常(如果记录它们)应该被记录并立即刷新。 – Kevin

0

我还想确保在单元硬件不正常关机的情况下写入器已正确关闭或刷新。

它不会如果用户开启装置关闭,而流不刷新,是否使用using与否(临界时间跨度可以更短与using和无需手动冲洗)正确关闭。

而不是每次创建一个新的StreamWriter,创建一次并在写入后刷新它。但请注意,如果您想100%确定,则需要某种硬件(请阅读:缓冲电池,UPS)。

+0

是的,创造它曾经似乎是我的目标。我只是想确保我没有错过关于使用声明的方法论的任何关键问题。之前的编码器曾为MS工作过一次,所以我认为必须有重新启动的原因。也许他只是休息一天,或者影响可以忽略不计。无论哪种方式,谢谢。 –

相关问题