2012-10-09 56 views
0

我正在創建一個運行一組電機的程序。這些電機與電機控制器相連,我的程序也可以與之對話。我可以告訴電機控制器定期向我提供有關其狀態的數據,以及每個電機的狀態和位置。我計劃對這些數據進行實時查看,以便操作員可以輕鬆查看是否有錯誤,並且還可以創建此數據的日誌,以便某些人可以後退並查看出了什麼問題,以及可能原因。創建數據日誌的最佳做法

問題來了:創建這個日誌時應該考慮什麼?我剛從大學畢業,從未真正遇到過這樣的情況。當然,我知道如何創建文件,將數據放入文件並關閉文件,但是還有更多的數據記錄嗎?

事情我已經考慮是:

  1. 它會是好事,有時間標記每個數據記錄。
  2. 它可能是理想的數據冗長,而不是保持它的二進制。更長的設置時間,更好的最終結果。
  3. 無論程序如何結束,我都必須小心地關閉文件。
  4. 我正在使用C++/CLI,我不知道MSFT是否有一些框架可以使這個直接前進......
  5. 通過測試每次收到時它是否更好地寫入一個條目來最小化cpu /如果最好等到你有幾個條目並且一次寫完它們。

我還應該考慮什麼?

回答

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. 對於時間戳,只需dump出來DateTime::Now->ToString()
  2. 有關可以使用的某些對象,請參閱上文。使用String :: Format並將輸出發送到StreamWriter,這會給你一個詳細的,人類可讀的日誌。
  3. 如果你擔心如果你的程序崩潰會發生什麼,不要擔心太多。上面初始化的StreamWriter將在您使用FileStream時寫入文件流,然後寫入文件系統。這不會執行文件系統級刷新,只會執行文件系統級寫入(數據將在操作系統的寫回緩存中,在接下來的幾秒內刷新到磁盤),因此如果操作系統崩潰,你的日誌文件將不完整,但程序崩潰將被處理文件。
  4. 有許多可用於.NET的日誌框架,您可以從C++/CLI中使用它,但我對它們不太熟悉。
  5. 即使您每秒鐘都在記錄數據,您仍然懷疑是否需要擔心數據的批處理。比方說,你有數百臺電機來寫數據:這就是每秒1千字節?也許2?只需根據需要寫出數據即可。 (如果您希望最小化磁盤/ CPU使用率,請考慮更頻繁地記錄數據,每10秒一次或每分鐘一次。)
+0

看起來很合理 - 我想最好是讓記錄器在自己的線程中運行,並用包含在其中的數據觸發事件。我將在今天開始實施,並回到其他想法,因爲我有他們,謝謝! – fooOnYou

相關問題