创建数据日志的最佳实践

时间:2012-10-09 15:28:29

标签: c++-cli visual-studio-2012

我正在创建一个运行一堆电机的程序。这些电机与电机控制器连接,我的程序也可以与之对话。我可以告诉电机控制器定期给我关于其状态的数据,以及每个电机的状态和位置。我打算对这些数据进行实时查看,这样操作员就可以轻松查看是否有错误,并另外创建了这些数据的日志,这样有人可以事后回去看看出了什么问题,也可能是为什么。

问题是:创建此日志时​​应该考虑什么?我刚从大学毕业,从未真正遇到过这样的情况。当然我知道如何创建文件,将数据放入其中并关闭文件,但是数据日志还有更多吗?

我已经考虑过的事情是:

  1. 每张数据记录都有时间戳。
  2. 对数据进行冗长可能是理想的,而不是保持二进制。设置时间更长,最终结果更好。
  3. 无论程序如何结束,我都必须小心关闭文件。
  4. 我正在使用C ++ / CLI,我想知道MSFT是否有一些框架可以直接实现这一目标......
  5. 最小化cpu /磁盘使用量,测试每次收到条目时是否更好写入条目,或者最好等到有几个条目并一次写入所有条目。
  6. 我还应该考虑什么?

1 个答案:

答案 0 :(得分:0)

对于类似这样的事情,我们想到的是以逗号分隔或制表符分隔的文件。这些在记事本中是人类可读的,或者您可以将其带入Excel,并制作数据图。 (虽然我确信有人会认为CSV或tab-SV远离'最佳实践'。但是,它实现起来简单,易于阅读,并且可以在数百个应用程序中读取。这是一个相当不错的良好做法在我的书中。)

你可以做类似的事情:

FileStream^ textFileStream = gcnew FileStream(logFileName, FileMode::Append, FileAccess::Write, FileShare::Read);
StreamWriter^ textFileWriter = gcnew StreamWriter(textFileStream, Encoding::Unicode);
textFileWriter->AutoFlush = true;
  1. 对于时间戳,只需转出DateTime::Now->ToString()
  2. 请参阅上面的一些可以使用的对象。使用String :: Format并将输出发送到StreamWriter,它将为您提供详细的,人类可读的日志。
  3. 如果您担心程序崩溃会发生什么,请不要太担心。上面初始化的StreamWriter将在您使用时写入FileStream,然后将其写入文件系统。这不会进行文件系统级刷新,只进行文件系统级写入(数据将在操作系统的回写高速缓存中,在接下来的几秒钟内刷新到磁盘),因此如果操作系统崩溃,您的日志文件将不完整,但程序崩溃将被处理文件。
  4. .Net提供了各种日志框架,可以在C ++ / CLI中使用,但我对它们并不熟悉。
  5. 即使您每秒都记录数据,但您仍然需要担心批量处理数据。假设您有数百台电机为数据写入:那是什么,每秒1千字节?也许2?只需根据需要写出数据。 (如果要最小化磁盘/ CPU使用率,请考虑不经常记录数据,每10秒一次或每分钟一次。)